{"componentChunkName":"component---src-templates-blog-js","path":"/blog/2016/09/28/our-first-50000-stars.html","result":{"data":{"markdownRemark":{"html":"<p>Há apenas três anos e meio nós abrimos o código de uma pequena biblioteca chamada React. A jornada desde aquele dia tem sido incrivelmente excitante.</p>\n<h2 id=\"commemorative-t-shirt\"><a href=\"#commemorative-t-shirt\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Camiseta Comemorativa </h2>\n<p>Para comemorar as 50.000 estrelas no GitHub, <a href=\"http://www.maggieappleton.com/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Maggie Appleton</a> do <a href=\"http://egghead.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">egghead.io</a> desenhou para nós uma camiseta especial, que está disponível para compra no Teespring <strong>somente por uma semana</strong> até quinta feira, 06 de Outubro. Maggie também escreveu <a href=\"https://www.behance.net/gallery/43269677/Reacts-50000-Stars-Shirt\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">um post</a> mostrando todos os diferentes conceitos que ela criou antes de escolher como seria o design final.</p>\n<p><a target=\"_blank\" href=\"https://teespring.com/react-50000-stars\">\n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block;  max-width: 840px; margin-left: auto; margin-right: auto;\">\n    <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 52.38095238095239%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAKABQDASIAAhEBAxEB/8QAFgABAQEAAAAAAAAAAAAAAAAABQAD/8QAFQEBAQAAAAAAAAAAAAAAAAAAAgH/2gAMAwEAAhADEAAAAdDVTjWLOD//xAAbEAABBAMAAAAAAAAAAAAAAAABAgMEMwASMf/aAAgBAQABBQKQVhtBXvj1EW89/8QAFhEAAwAAAAAAAAAAAAAAAAAAARAx/9oACAEDAQE/ATV//8QAFhEAAwAAAAAAAAAAAAAAAAAAARAx/9oACAECAQE/ARF//8QAHhAAAQIHAQAAAAAAAAAAAAAAAAERAhASEyJBYXH/2gAIAQEABj8CwfqiW6nNkXgkv//EAB0QAQABAwUAAAAAAAAAAAAAAAERABBBIVFhobH/2gAIAQEAAT8hMwBiwUKWto06ssOLN0Xy1//aAAwDAQACAAMAAAAQhy//xAAVEQEBAAAAAAAAAAAAAAAAAAABEP/aAAgBAwEBPxAR/8QAFREBAQAAAAAAAAAAAAAAAAAAARD/2gAIAQIBAT8Qcf/EABwQAQACAwADAAAAAAAAAAAAAAEAESExUUGB8P/aAAgBAQABPxC9WK8J5TUwZvcbDYnIW5VNKxG3W2jPsny+psn/2Q==&apos;); background-size: cover; display: block;\">\n      <img class=\"gatsby-resp-image-image\" style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\" alt=\"React 50k Tshirt\" title src=\"/static/dd4bfca3eacb85dc3c81fe91fb2e1c10/bba1f/react-50k-tshirt.jpg\" srcset=\"/static/dd4bfca3eacb85dc3c81fe91fb2e1c10/60342/react-50k-tshirt.jpg 210w,\n/static/dd4bfca3eacb85dc3c81fe91fb2e1c10/65f94/react-50k-tshirt.jpg 420w,\n/static/dd4bfca3eacb85dc3c81fe91fb2e1c10/bba1f/react-50k-tshirt.jpg 840w,\n/static/dd4bfca3eacb85dc3c81fe91fb2e1c10/e5166/react-50k-tshirt.jpg 1200w\" sizes=\"(max-width: 840px) 100vw, 840px\">\n    </span>\n  </span>\n  </a></p>\n<p>As camisetas são bem macias usando o tecido tri-blend da American Apparel’s. Nós também temos camisetas para crianças e macacões para bebês disponíveis.</p>\n<ul>\n<li><a href=\"https://teespring.com/react-50000-stars\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Camisetas para Adultos (corte reto e ajustadas)</a></li>\n<li><a href=\"https://teespring.com/react-50000-stars-kids\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Camisetas para crianças</a></li>\n<li><a href=\"https://teespring.com/react-50000-stars-toddler\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Camisetas Infantis</a></li>\n<li><a href=\"https://teespring.com/react-50000-stars-baby\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Onesies para bêbês</a></li>\n</ul>\n<p>Todos os ganhos das camisetas serão doados para o <a href=\"http://www.code2040.org/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">CODE2040</a>, uma organização sem fins lucrativos que cria acesso, conscientização e oportunidades em tecnologia para minorias não representadas com um foco especifico em talentos afrodescendente e latinos.</p>\n<h2 id=\"archeology\"><a href=\"#archeology\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Arqueologia </h2>\n<p>Gastamos muito tempo tentando explicar conceitos que existem atrás do React e problemas que ele busca resolver, mas não falamos muito sobre como o React evoluiu antes de se tornar um projeto de código aberto. Este momento parece bom para lembrarmos os primeiros commits e compartilharmos alguns dos momentos importantes e fatos engraçados.</p>\n<p>A história inicia com nossa organização de anúncios, onde nós estávamos construindo aplicativos web do lado do cliente incrivelmente sofisticados utilizando um framework MVC interno chamado <a href=\"http://web.archive.org/web/20130608154901/http://shaneosullivan.github.io/boltjs/intro.html\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">BoltJS</a>. Aqui está um exemplo de como era um código do framework Bolt:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">var</span> CarView <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'javelin/core'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">createClass</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  name<span class=\"token operator\">:</span> <span class=\"token string\">'CarView'</span><span class=\"token punctuation\">,</span>\n  extend<span class=\"token operator\">:</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'container'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span>Container<span class=\"token punctuation\">,</span>\n  properties<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    wheels<span class=\"token operator\">:</span> <span class=\"token number\">4</span><span class=\"token punctuation\">,</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function-variable function\">declare</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token punctuation\">{</span>\n      childViews<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span>\n        <span class=\"token punctuation\">{</span> content<span class=\"token operator\">:</span> <span class=\"token string\">'I have '</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">{</span> ref<span class=\"token operator\">:</span> <span class=\"token string\">'wheelView'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n        <span class=\"token punctuation\">{</span> content<span class=\"token operator\">:</span> <span class=\"token string\">' wheels'</span> <span class=\"token punctuation\">}</span>\n      <span class=\"token punctuation\">]</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function-variable function\">setWheels</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">wheels</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">findRef</span><span class=\"token punctuation\">(</span><span class=\"token string\">'wheelView'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">setContent</span><span class=\"token punctuation\">(</span>wheels<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  <span class=\"token function-variable function\">getWheels</span><span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">findRef</span><span class=\"token punctuation\">(</span><span class=\"token string\">'wheelView'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">getContent</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">var</span> car <span class=\"token operator\">=</span> <span class=\"token keyword\">new</span> <span class=\"token class-name\">CarView</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\ncar<span class=\"token punctuation\">.</span><span class=\"token function\">setWheels</span><span class=\"token punctuation\">(</span><span class=\"token number\">3</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\ncar<span class=\"token punctuation\">.</span><span class=\"token function\">placeIn</span><span class=\"token punctuation\">(</span>document<span class=\"token punctuation\">.</span>body<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token comment\">//&lt;div></span>\n<span class=\"token comment\">//  &lt;div>I have &lt;/div></span>\n<span class=\"token comment\">//  &lt;div>3&lt;/div></span>\n<span class=\"token comment\">//  &lt;div> wheels&lt;/div></span>\n<span class=\"token comment\">//&lt;/div></span></code></pre></div>\n<p>Bolt introduziu um número de APIs e recursos que acabariam eventualmente entrando no React, incluindo o método <code class=\"gatsby-code-text\">render</code>, <code class=\"gatsby-code-text\">createClass</code>, e <code class=\"gatsby-code-text\">refs</code>. Bolt introduziu o conceito de <code class=\"gatsby-code-text\">refs</code> como uma forma de criar referências para nós que podem ser utilizados imperativamente. Esta maneira foi relevante para a interoperabilidade herdada e a adoção incremental, e enquanto o React se esforçaria para ser muito mais funcional, <code class=\"gatsby-code-text\">refs</code> provou ser uma forma útil de sair do paradigma funcional quando surgir a necessidade.</p>\n<p>Porém como nossas aplicações cresceram mais e ficaram mais sofisticadas, nossas base de códigos do Bolt se tornaram complicadas. Reconhecendo algumas deficiências da estrutura, <a href=\"https://twitter.com/jordwalke\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Jordan Walke</a> iniciou experimentos em um projeto paralelo chamado <a href=\"https://github.com/jordwalke/FaxJs\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">FaxJS</a>. Seu objetivo foi resolver muitos dos problemas existentes no Bolt, mas de uma forma diferente. Este é o lugar onde a maioria dos fundamentos do React nasceu, incluindo <code class=\"gatsby-code-text\">props</code>, <code class=\"gatsby-code-text\">state</code>, reavaliando grandes partes da árvore para “diferenciar” a interface do usuário, a renderização do lado do servidor e conceitos básicos de componente.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\">TestProject<span class=\"token punctuation\">.</span>PersonDisplayer <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token function-variable function\">structure</span> <span class=\"token operator\">:</span> <span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">Div</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      classSet<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> personDisplayerContainer<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n      titleDiv<span class=\"token operator\">:</span> <span class=\"token function\">Div</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n        classSet<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> personNameTitle<span class=\"token operator\">:</span> <span class=\"token boolean\">true</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n        content<span class=\"token operator\">:</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>name\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n      nestedAgeDiv<span class=\"token operator\">:</span> <span class=\"token function\">Div</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n        content<span class=\"token operator\">:</span> <span class=\"token string\">'Interests: '</span> <span class=\"token operator\">+</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span>props<span class=\"token punctuation\">.</span>interests\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span></code></pre></div>\n<h2 id=\"fbolt-is-born\"><a href=\"#fbolt-is-born\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Nasce o FBolt </h2>\n<p>Através do seu experimento FaxJS, Jordan se convence de que as APIs funcionais - que desencorajam a mutação - oferecem uma melhor, mais escalável forma de construir interfaces de usuários. Ele importou sua biblioteca na base de códigos do Facebook em Março de 2012 e renomeou a biblioteca para “FBolt”, significando uma extensão do Bolt onde os componentes são escritos em um estilo de programação funcional. Ou talvez “Fbolt” foi uma prévia do FaxJS - ele não nos contou! ;)</p>\n<p>A interoperabilidade entre FBolt e Bolt permitiu experimentarmos a substituição de apenas um componente por vez com APIs de componentes mais funcionais. Poderíamos visitar as águas desse novo paradigma funcional, sem ter que entrar totalmente nele. Iniciamos com os componentes que estavam claramente melhor expressos funcionalmente e então continuamos depois com os demais componentes que poderíamos expressar como funções.</p>\n<p>Percebendo que o FBolt não seria um ótimo nome para a biblioteca quando usada sozinha, Jordan Walke e <a href=\"https://twitter.com/tomocchino\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Tom Occhino</a> decidiram por um novo nome: “React.” Depois de Tom ter renomeado a biblioteca inteira, Jordan comentou:</p>\n<blockquote>\n<p>Jordan Walke:\nEu poderia acrescentar, que por uma questão de discussão, que muitos sistemas demonstram algum tipo de reatividade, mas geralmente exigem que você defina algum tipo de ouvinte (listeners) ponto a ponto e não funcionará com dados estruturados. Essa API reage a qualquer alteração de estado ou propriedade e trabalha com dados de qualquer forma (tão profundamente quanto o próprio gráfico), então acho que o nome é adequado.</p>\n</blockquote>\n<p>A maioria dos outros commits de Tom na época estavam na primeira versão do <a href=\"https://github.com/graphql/graphiql\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GraphiQL</a>, um projeto que recentemente teve seu código aberto.</p>\n<h2 id=\"adding-jsx\"><a href=\"#adding-jsx\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Adicionando JSX </h2>\n<p>Desde 2010 o Facebook está utilizando uma extensão do PHP chamada <a href=\"https://www.facebook.com/notes/facebook-engineering/xhp-a-new-way-to-write-php/294003943919/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">XHP</a>, que permite engenheiros criar interfaces de usuário utilizando XML dentro de seu código PHP. Ele foi introduzido pela primeira vez para ajudar a evitar falhas XSS, porém acabou sendo uma excelente maneira para estruturas aplicações com componentes personalizados.</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\">final <span class=\"token keyword\">class</span> <span class=\"token operator\">:</span>a<span class=\"token operator\">:</span>post <span class=\"token keyword\">extends</span> <span class=\"token operator\">:</span>x<span class=\"token operator\">:</span>element <span class=\"token punctuation\">{</span>\n  attribute <span class=\"token operator\">:</span>a<span class=\"token punctuation\">;</span>\n  <span class=\"token keyword\">protected</span> <span class=\"token keyword\">function</span> <span class=\"token function\">render</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token operator\">:</span> XHPRoot <span class=\"token punctuation\">{</span>\n    $anchor <span class=\"token operator\">=</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>a</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>$<span class=\"token keyword\">this</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">getChildren</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>a</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span>\n    $form <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span>\n      <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>form</span>\n        <span class=\"token attr-name\">method</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>post<span class=\"token punctuation\">\"</span></span>\n        <span class=\"token attr-name\">action</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>$<span class=\"token keyword\">this</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token operator\">:</span>href<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">target</span><span class=\"token script language-javascript\"><span class=\"token script-punctuation punctuation\">=</span><span class=\"token punctuation\">{</span>$<span class=\"token keyword\">this</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token operator\">:</span>target<span class=\"token punctuation\">}</span></span>\n        <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>postLink<span class=\"token punctuation\">\"</span></span>\n      <span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>$anchor<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>form</span><span class=\"token punctuation\">></span></span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    $<span class=\"token keyword\">this</span><span class=\"token operator\">-</span><span class=\"token operator\">></span><span class=\"token function\">transferAllAttributes</span><span class=\"token punctuation\">(</span>$anchor<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">return</span> $form<span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Antes do trabalho de Jordan ter ser entrado na base de código do Facebook, Adam Hupp implementou um conceito semelhante ao XHP para Javascript, escrito em Haskell. Este sistema permitiu que você escrevesse o seguinte dentro de um arquivo Javascript:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token operator\">:</span>example<span class=\"token operator\">:</span><span class=\"token function\">hello</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">attrib<span class=\"token punctuation\">,</span> children</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>div</span> <span class=\"token attr-name\">class</span><span class=\"token attr-value\"><span class=\"token punctuation attr-equals\">=</span><span class=\"token punctuation\">\"</span>special<span class=\"token punctuation\">\"</span></span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">Hello, World!</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>h1</span><span class=\"token punctuation\">></span></span><span class=\"token plain-text\">\n      </span><span class=\"token punctuation\">{</span>children<span class=\"token punctuation\">}</span><span class=\"token plain-text\">\n    </span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>div</span><span class=\"token punctuation\">></span></span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Isso compilaria para um código ES3 Javascript compativel:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token keyword\">function</span> <span class=\"token function\">jsx_example_hello</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">attrib<span class=\"token punctuation\">,</span> children</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">return</span> <span class=\"token punctuation\">(</span>\n    <span class=\"token constant\">S</span><span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"div\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span><span class=\"token string\">\"class\"</span><span class=\"token operator\">:</span> <span class=\"token string\">\"special\"</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span>\n      <span class=\"token constant\">S</span><span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"h1\"</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">[</span><span class=\"token string\">\"Hello, World!\"</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n      children\n    <span class=\"token punctuation\">]</span>\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span></code></pre></div>\n<p>Neste protótipo, <code class=\"gatsby-code-text\">S.create</code> criaria e retornaria imediatamente um nó DOM. A maioria das conversas sobre este protótipo girou em torno das características de desempenho do <code class=\"gatsby-code-text\">innerHTML</code> contra criar nós no DOM diretamente. Na época, seria menos ideal colocar desenvolvedores universalmente na direção da criação de nós DOM diretamente, uma vez que ele não funciona tão bem, especialmente no navegador Firefox e Internet Explorer. O CTO do Facebook, <a href=\"https://twitter.com/btaylor\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Bret Taylor</a> entrou na discussão no momento em favor do <code class=\"gatsby-code-text\">innerHTML</code> ao invés do <code class=\"gatsby-code-text\">document.createElement</code>.</p>\n<blockquote>\n<p>Bret Taylor:\nSe você não está convencido sobre o innerHTML, aqui está um pequeno comparativo. Isso não mudou no Chrome. innerHTML esta 30% mais rápido na última versão do Firefox (e muito mais do que nas versões anteriores), e 90% mais rápido no IE8.</p>\n</blockquote>\n<p>Este projeto foi eventualmente abandonado, mas foi revivido depois que o React entrou na base de código. Jordan ignorou as discussões anteriores sobre performance introduzindo o conceito de “Virtual DOM,” embora este nome ainda não existisse.</p>\n<blockquote>\n<p>Jordan Walke:\nPara a primeira etapa, eu proponho que nós façamos o mais fácil e mais genérico possível. Minha sugestão é simplesmente mapear expressões xml para funções de chamada.</p>\n<ul>\n<li><code class=\"gatsby-code-text\">&lt;x&gt;&lt;/x&gt;</code> becomes <code class=\"gatsby-code-text\">x( )</code></li>\n<li><code class=\"gatsby-code-text\">&lt;x height=12&gt;&lt;/x&gt;</code> becomes <code class=\"gatsby-code-text\">x( {height:12} )</code></li>\n<li><code class=\"gatsby-code-text\">&lt;x&gt; &lt;y&gt; &lt;/y&gt; &lt;/x&gt;</code> becomes <code class=\"gatsby-code-text\">x({ childList: [y( )] })</code></li>\n</ul>\n<p>Neste ponto, o JSX não precisa conhecer o React - isso é apenas uma forma conveniente de escrever chamadas de função. Coincidentemente, a abstração primária do React é a função. Ok, talvez isso não seja uma coincidência ;)</p>\n</blockquote>\n<p>Adam fez um comentário muito perspicaz, no qual agora é a forma padrão que nós escrevemos listas no React com JSX.</p>\n<blockquote>\n<p>Adam Hupp:\nEu penso que nós deveríamos tratar matrizes de elementos como um frag. Isso é muito útil para construções como:</p>\n<div class=\"gatsby-highlight\" data-language=\"jsx\"><pre class=\"gatsby-code-jsx\"><code class=\"gatsby-code-jsx\"><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>ul</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>foo<span class=\"token punctuation\">.</span><span class=\"token function\">map</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">function</span><span class=\"token punctuation\">(</span><span class=\"token parameter\">i</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> <span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;</span>li</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">{</span>i<span class=\"token punctuation\">.</span>data<span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>li</span><span class=\"token punctuation\">></span></span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">}</span><span class=\"token tag\"><span class=\"token tag\"><span class=\"token punctuation\">&lt;/</span>ul</span><span class=\"token punctuation\">></span></span></code></pre></div>\n<p>Neste caso, ul(…) irá receber um childList com um único filho, que é uma lista.</p>\n</blockquote>\n<p>React não utilizou a implementação de Adam diretamente. Ao invés, nós criamos JSX fazendo o fork do projeto <a href=\"https://github.com/laverdet/js-xml-literal\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">js-xml-literal</a>, um projeto paralelo do criador do XHP, Marcel Laverdet. O JSX tomou o nome de js-xml-literal, que Jordan modificou para ser apenas um acréscimo sintático para chamadas de funções profundamente aninhadas.</p>\n<h2 id=\"api-churn\"><a href=\"#api-churn\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>API Churn </h2>\n<p>Durante o primeiro ano do React, as adoções internas estavam crescendo, mas havia muita rotatividade nas APIs dos componentes e nas convenções de nomenclatura:</p>\n<ul>\n<li><code class=\"gatsby-code-text\">project</code> foi renomeado para <code class=\"gatsby-code-text\">declare</code>, depois para <code class=\"gatsby-code-text\">structure</code> e finalmente para <code class=\"gatsby-code-text\">render</code>.</li>\n<li><code class=\"gatsby-code-text\">Componentize</code> foi renomeado para <code class=\"gatsby-code-text\">createComponent</code> e finalmente <code class=\"gatsby-code-text\">createClass</code>.</li>\n</ul>\n<p>Como o projeto estava prestes a se tornar aberto, <a href=\"https://twitter.com/leeb\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Lee Byron</a> sentou-se com Jordan Walke, Tom Occhino e Sebastian Markbåge com o objetivo de refatorar, reimplementar e renomear, um dos recursos mais amado do React - o ciclo de vida da API. Lee <a href=\"https://gist.github.com/vjeux/f2b015d230cc1ab18ed1df30550495ed\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">criou uma API bem projetada</a> que ainda está sendo utilizada hoje em dia.</p>\n<ul>\n<li>\n<p>Conceitos</p>\n<ul>\n<li>component - Uma instância de ReactComponent</li>\n<li>state - Estado interno de um componente</li>\n<li>props - Estado externo de um componente</li>\n<li>markup - A string/coisas HTML que o componente gera</li>\n<li>DOM - O documento e elementos dentro do documento</li>\n</ul>\n</li>\n<li>\n<p>Ações</p>\n<ul>\n<li>mount - Colocar um componente em um DOM</li>\n<li>initialize - Preparar um componente para renderização</li>\n<li>update - Uma transição de um estado (e propriedades) resultando em renderização</li>\n<li>render - Um processo sem efeitos colaterais buscando ter uma representação (markup) de um componente.</li>\n<li>validate - Fazer validações sobre algo criado e fornecido</li>\n<li>destroy - Oposto de initialize</li>\n</ul>\n</li>\n<li>\n<p>Operações</p>\n<ul>\n<li>create - Fazer uma coisa nova</li>\n<li>get - Pegar uma coisa existente</li>\n<li>set - Fundir-se com a existente</li>\n<li>replace - Substituir</li>\n<li>receive - Responder a novos dados</li>\n<li>force - Ignorar checagens para fazer uma ação</li>\n</ul>\n</li>\n<li>\n<p>Notificações</p>\n<ul>\n<li>shouldObjectAction</li>\n<li>objectWillAction</li>\n<li>objectDidAction</li>\n</ul>\n</li>\n</ul>\n<h2 id=\"instagram\"><a href=\"#instagram\" aria-hidden class=\"anchor\"><svg aria-hidden=\"true\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Instagram </h2>\n<p>Em 2012, o Instagram foi adquirido pelo Facebook. <a href=\"https://twitter.com/floydophone\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Pete Hunt</a>, quem estava trabalhando em fotos e vídeos no Facebook no momento, juntou-se a sua nova equipe web recém-formada. Ele queria construir seu website completamente em React, que estava em contraste com o modelo de adoção incremental que havia sido usado no Facebook.</p>\n<p>Para fazer isso acontecer, o React precisou ser desacoplado da infraestrutura do Facebook, já que o Instagram não utilizava nada disso. Este projeto teve uma atuação importante para a futura decisão de abrir o código do React. Neste projeto, Pete também descobriu e promoveu um pequeno projeto chamado webpack. Ele também implementou a primitiva <code class=\"gatsby-code-text\">renderToString</code>, que era necessária para fazer a renderização no lado do servidor.</p>\n<p>Quando iniciamos a nos preparar para abrir o código do React, <a href=\"https://twitter.com/miekd\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Maykel Loomans</a>, um designer do Instagram, fez uma simulação do que o site poderia ser. O cabeçalho acabou definindo a identidade visual do React: seu logo e a cor azul elétrica!</p>\n<center><a target=\"_blank\" href=\"../images/blog/react-50k-mock-full.jpg\">\n  <span class=\"gatsby-resp-image-wrapper\" style=\"position: relative; display: block;  max-width: 840px; margin-left: auto; margin-right: auto;\">\n    <span class=\"gatsby-resp-image-background-image\" style=\"padding-bottom: 102.3809523809524%; position: relative; bottom: 0; left: 0; background-image: url(&apos;data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQCAf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAcas6QLRdsAP/8QAGhABAAMAAwAAAAAAAAAAAAAAAAIUJAEDQf/aAAgBAQABBQKjNSmodjU0Nb1y/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAHBAAAgEFAQAAAAAAAAAAAAAAAAIyAQMgITFC/9oACAEBAAY/ApKSQkpuqHk7bw//xAAcEAACAQUBAAAAAAAAAAAAAAAAAREhQXHh8NH/2gAIAQEAAT8hUvqdjONiVxwiu88aI1iXcJVKGf/aAAwDAQACAAMAAAAQwwcA/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPxAf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPxAf/8QAHhABAAIBBAMAAAAAAAAAAAAAAQARITGx0fBBUWH/2gAIAQEAAT8QKi6vZTaL8PCdLhLykV9toBZxNUVFHdtEqmFwVHioCg0n/9k=&apos;); background-size: cover; display: block;\">\n      <img class=\"gatsby-resp-image-image\" style=\"width: 100%; height: 100%; margin: 0; vertical-align: middle; position: absolute; top: 0; left: 0; box-shadow: inset 0px 0px 0px 400px white;\" alt=\"React website mock\" title src=\"/static/4c980ebecab37b61a1f7db2f95d91b96/bba1f/react-50k-mock.jpg\" srcset=\"/static/4c980ebecab37b61a1f7db2f95d91b96/60342/react-50k-mock.jpg 210w,\n/static/4c980ebecab37b61a1f7db2f95d91b96/65f94/react-50k-mock.jpg 420w,\n/static/4c980ebecab37b61a1f7db2f95d91b96/bba1f/react-50k-mock.jpg 840w,\n/static/4c980ebecab37b61a1f7db2f95d91b96/2d18b/react-50k-mock.jpg 893w\" sizes=\"(max-width: 840px) 100vw, 840px\">\n    </span>\n  </span>\n  </a></center>\n<p>Em seus primeiros dias, React se beneficiou enormemente dos feedbacks, idéias e contribuições técnicas dos primeiros usuários e colaboradores em toda a empresa. Embora possa parecer um sucesso da noite para o dia, a história do React é atualmente um ótimo exemplo de como novas idéias frequentemente precisam passar por várias etapas de refinamento, interações e correções de curso, durante um longo período de tempo antes de alcançar o seu potencial máximo.</p>\n<p>A abordagem do React para construir interfaces de usuário com princípios de programação funcional mudou a forma para nós fazemos as coisas em poucos anos. Não é preciso dizer, mas o React não seria nada sem a incrível comunidade de código aberto que é construída em torno dele!</p>","excerpt":"Há apenas três anos e meio nós abrimos o código de uma pequena biblioteca chamada React. A jornada desde aquele dia tem sido incrivelmente excitante. Camiseta Comemorativa  Para comemorar as 50.000 estrelas no GitHub, Maggie Appleton do egghead.io desenhou para nós uma camiseta especial, que está disponível para compra no Teespring somente por uma semana até quinta feira, 06 de Outubro. Maggie também escreveu um post mostrando todos os diferentes conceitos que ela criou antes de escolher como…","frontmatter":{"title":"Nossas primeiras 50.000 estrelas no GitHub","next":null,"prev":null,"author":[{"frontmatter":{"name":"Vjeux","url":"https://twitter.com/vjeux"}}]},"fields":{"date":"28 de setembro de 2016","path":"content/blog/2016-09-28-our-first-50000-stars.md","slug":"/blog/2016/09/28/our-first-50000-stars.html"}},"allMarkdownRemark":{"edges":[{"node":{"frontmatter":{"title":"React v17.0"},"fields":{"slug":"/blog/2020/10/20/react-v17.html"}}},{"node":{"frontmatter":{"title":"Apresentando o novo JSX Transform"},"fields":{"slug":"/blog/2020/09/22/introducing-the-new-jsx-transform.html"}}},{"node":{"frontmatter":{"title":"React v17.0 Candidato à lançamento: Sem novas funcionalidades"},"fields":{"slug":"/blog/2020/08/10/react-v17-rc.html"}}},{"node":{"frontmatter":{"title":"React v16.13.0"},"fields":{"slug":"/blog/2020/02/26/react-v16.13.0.html"}}},{"node":{"frontmatter":{"title":"Construindo Ótimas Experiências de Usuário com Modo Concorrente e Suspense"},"fields":{"slug":"/blog/2019/11/06/building-great-user-experiences-with-concurrent-mode-and-suspense.html"}}},{"node":{"frontmatter":{"title":"Preparando para o Futuro com as Prereleases React"},"fields":{"slug":"/blog/2019/10/22/react-release-channels.html"}}},{"node":{"frontmatter":{"title":"Apresentando o novo React DevTools"},"fields":{"slug":"/blog/2019/08/15/new-react-devtools.html"}}},{"node":{"frontmatter":{"title":"React v16.9.0 e a atualização do Roadmap"},"fields":{"slug":"/blog/2019/08/08/react-v16.9.0.html"}}},{"node":{"frontmatter":{"title":"O React já esta traduzido? ¡Sí! Sim! はい！"},"fields":{"slug":"/blog/2019/02/23/is-react-translated-yet.html"}}},{"node":{"frontmatter":{"title":"React v16.8: O React com Hooks"},"fields":{"slug":"/blog/2019/02/06/react-v16.8.0.html"}}}]}},"pageContext":{"slug":"/blog/2016/09/28/our-first-50000-stars.html"}},"staticQueryHashes":[]}