diff --git a/README.md b/README.md index d28d1da..54471e8 100644 --- a/README.md +++ b/README.md @@ -46,3 +46,4 @@ Will be done with a help of [js-code-to-svg-flowchart tool](https://github.com/B ## Languages - [Chinese](./stack/languages/chinese/book/Intro.md) - [Korean](./stack/languages/korean/book/Intro.md) +- [Português](./stack/languages/portuguese/book/Intro.md) diff --git a/stack/languages/portuguese/book/Intro.md b/stack/languages/portuguese/book/Intro.md new file mode 100644 index 0000000..3489285 --- /dev/null +++ b/stack/languages/portuguese/book/Intro.md @@ -0,0 +1,112 @@ +## Intro + +### Esquema, primeira impressão + + +[![](../images/intro/all-page-stack-reconciler-25-scale.jpg)](../images/intro/all-page-stack-reconciler.svg) + +Intro.0 Todo o esquema (clicável) + +Vamos dar uma olhada. Sem press. No geral, parece complexo mas na verdade ele descreve só dois processos: montagem e atualização. Eu pulei a desmontagem porque é meio que uma "montagem reversa" e ao remover simplificava o esquema. Aliás, **isso não bate 100%** com o código, e sim só grandes partes que descrevem a arquitetura. No total é mais ou menos 60% do código, mas os outros 40% não traria muito valor visual. Então, novamente, por simplicidade, eu omiti. + +Numa primeira impressão, você provavelmente percebeu muitas cores no esquema. Cada item lógico (forma no esquema) está destacado na cor do módulo pai. Por exemplo, o `methodA` será vermelho se for chamado do `moduleB`, que é vermelho. Abaixo tem uma legenda pros módulos no esquema junto com o caminho de cada arquivo. + +[![](https://rawgit.com/Bogdan-Lyashenko/Under-the-hood-ReactJS/7c2372e1/stack/images/intro/modules-src-path.svg)](https://rawgit.com/Bogdan-Lyashenko/Under-the-hood-ReactJS/7c2372e1/stack/images/intro/modules-src-path.svg) + +Intro.1 Cores dos módulos (clicável) + +Vamos colocá-los no esquece pra ver **dependências entre módulos**. + +[![](https://rawgit.com/Bogdan-Lyashenko/Under-the-hood-ReactJS/7c2372e1/stack/images/intro/files-scheme.svg)](https://rawgit.com/Bogdan-Lyashenko/Under-the-hood-ReactJS/7c2372e1/stack/images/intro/files-scheme.svg) + +Intro.2 Dependências dos módulos (clicável) + +Como você provavelmente sabe, React foi feito para **suportar vários ambientes**. + +- Mobile (**ReactNative**) +- Browser (**ReactDOM**) +- Renderização do servidor +- **ReactART** (para desenhar vetores gráficos pro React) +- etc. + +Como resultado, vários arquivos são na verdade maiores do que parecem no esquema acima. Abaixo, o mesmo esquema com multi-suporte incluído. + +[![](https://rawgit.com/Bogdan-Lyashenko/Under-the-hood-ReactJS/7c2372e1/stack/images/intro/modules-per-platform-scheme.svg)](https://rawgit.com/Bogdan-Lyashenko/Under-the-hood-ReactJS/7c2372e1/stack/images/intro/modules-per-platform-scheme.svg) + +Intro.3 Dependência de plataformas (clicável) + +Como você pode ver, alguns itens parecem duplicados. Isso mostra que eles tem uma implementação separada para cada plataforma. Vamos pegar algo simples como ReactEventListener. Obviamente, sua implementação vai ser diferente para diferentes plataformas! +Tecnicamente, como pode imaginar, esses módulos dependentes de plataformas devem de alguma forma serem injetados ou conectados com o fluxo lógico e, na verdade, existem muitos desses injetores. Devido ao seu uso ser parte de um pattern de composição padrão, escolhi omití-los. De novo, por simplicidade. + +Vamos aprender o fluxo lógico do **React DOM** em um **browser padrão**. É a plataforma mais utilizada e cobre completamente todas as ideias arquiteturais do React. Então, vamos lá! + + +### Amostra de código + +Qual é a melhor forma de aprender sobre o código de um framework ou biblioteca? Isso mesmo, lendo e debuggando o código. Beleza, vamos debuggar **dois processos**: **ReactDOM.render** e **componente.setState**, que mapeiam na montagem e na atualização. Vamos olhar o código que podemos escrever do começo. O que precisamos? Provavelmente vários pequenos componentes com renderizações simples, para que seja mais fácil debuggar. + +```javascript +class ChildCmp extends React.Component { + render() { + return
{this.props.childMessage}
+ } +} + +class ExampleApplication extends React.Component { + constructor(props) { + super(props); + this.state = {message: 'no message'}; + } + + componentWillMount() { + //... + } + + componentDidMount() { + /* setTimeout(()=> { + this.setState({ message: 'timeout state message' }); + }, 1000); */ + } + + shouldComponentUpdate(nextProps, nextState, nextContext) { + return true; + } + + componentDidUpdate(prevProps, prevState, prevContext) { + //... + } + + componentWillReceiveProps(nextProps) { + //... + } + + componentWillUnmount() { + //... + } + + onClickHandler() { + /* this.setState({ message: 'click state message' }); */ + } + + render() { + return
+ + + And some text as well! +
+ } +} + +ReactDOM.render( + , + document.getElementById('container'), + function() {} +); +``` + +Estamos pronto para começar. Vamos para a primeira parte do esquema. Um a um, vamos passar por todas elas. + +[Próxima página: Parte 0 >>](./Part-0.md) + + +[Home](../../README.md) diff --git a/stack/languages/portuguese/book/Part-0.md b/stack/languages/portuguese/book/Part-0.md new file mode 100644 index 0000000..dd375a1 --- /dev/null +++ b/stack/languages/portuguese/book/Part-0.md @@ -0,0 +1,95 @@ +## Parte 0 + +[![](https://rawgit.com/Bogdan-Lyashenko/Under-the-hood-ReactJS/master/stack/images/0/part-0.svg)](https://rawgit.com/Bogdan-Lyashenko/Under-the-hood-ReactJS/master/stack/images/0/part-0.svg) + +0.0 Parte 0 (clicável) + +### ReactDOM.render +Beleza, vamos começar com a chamada do ReactDOM.render. + +O ponto de entrada é ReactDom.render. Nosso app inicia sua renderização no DOM por aqui. Criei um componente simples `` para debuggar mais facilmente. Então, a primeira coisa que acontece é **JSX vai ser transformado em elementos React**. Eles são bem simples, quase objetos em uma estrutura simples. Eles apenas representam o que foi retornado da renderização do componente, nada mais. Alguns campos já devem ser familiares como props, key e ref. Property type se refere ao objeto markup descrito pelo JSX. Então, no nosso caso, é a classe `ExampleApplication`, mas também pode ser apenas a string `button` pra tag Button, etc. Também, durante a criação do elemento React, React vai mergear `defaultProps` com `props` (se tiverem sido especificadas) e validar `propTypes`. + +Dá uma olhada no código fonte pra mais detalhes: `src\isomorphic\classic\element\ReactElement.js`. + +### ReactMount +Você pode ver o módulo chamado `ReactMount` (01). Ele contém a lógica da montagem de componentes. Na verdade, não existe lógica dentro do `ReactDOM`, é apenas uma interface pra trabalhar com o `ReactMount`, então quando você chama `ReactDOM.render` você tecnicamente chama `ReactMount.render`. O que é essa montagem? +> Montagem é o processo de inicializar um componente React ao criar seus elementos DOM representativos e inserindo eles no `container` fornecido. + +Pelo menos o comentário no código descreve dessa forma. Bem, o que isso realmente quer dizer? Beleza, vamos imaginar a próxima transformação: + + +[![](https://rawgit.com/Bogdan-Lyashenko/Under-the-hood-ReactJS/master/stack/images/0/mounting-scheme-1-small.svg)](https://rawgit.com/Bogdan-Lyashenko/Under-the-hood-ReactJS/master/stack/images/0/mounting-scheme-1-small.svg) + +0.1 JSX para HTML (clicável) + +React precisa **transformar as descrições do(s) seu(s) componente(s) em HTML** para colocá-los em um documento. Como fazemos chegar lá? Ele precisa lidar com todas **props, event listeners, compenentes aninhados** e lógica. É necessário granular sua descrição alto nível (componentes) para dados baixo nível (HTML) que podem ser colocados numa página web. Isso é tudo que a montagem é. + + +[![](https://rawgit.com/Bogdan-Lyashenko/Under-the-hood-ReactJS/master/stack/images/0/mounting-scheme-1-big.svg)](https://rawgit.com/Bogdan-Lyashenko/Under-the-hood-ReactJS/master/stack/images/0/mounting-scheme-1-big.svg) + +0.1 JSX para HTML, estendido (clicável) + +Beleza, vamos continuar. Mas... é hora de fatos interessantes! Sim, vamos falar algumas coisas interessantes durante nossa jornada, pra ser mais "divertido". + +> Fato interessante: Tenha certeza que o scroll é monitorado (02) + +> Engraçado, durante a primeira renderização do componente raiz, o React inicia scroll listeners e cacheia valores do scroll pra que a o código da aplicação consiga acessá-los sem que seja trigado reflows. Na verdade, devido a diferentes implementações de renderizações em browsers, alguns dos valores do DOM não são estáticos, eles são calculados toda vez que você os usa no código. Claro, isso afeta a performance. Na verdade, é apenas pra browsers mais antigos, que não suportam `pageX` e `pageY`. React tenta otimizar isso também. Legal. Como pode ver, fazer uma ferramenta rápida requer o uso de várias técnicas, essa do scroll é um bom exemplo. + +### Instanciar o componente React + +Olhe para o esquema, há uma criação de instância pelo número (03). Bem, é muito cedo para criar uma instância do `` aqui. Na verdade, nós instanciamos `TopLevelWrapper` (classe interna do React). Vamos dar uma olhada no próximo esquema primeiro. + +[![](https://rawgit.com/Bogdan-Lyashenko/Under-the-hood-ReactJS/master/stack/images/0/jsx-to-vdom.svg)](https://rawgit.com/Bogdan-Lyashenko/Under-the-hood-ReactJS/master/stack/images/0/jsx-to-vdom.svg) + +0.3 JSX para VDOM (clicável) + +Você pode ver três fases, JSX para elementos React serão convertidos em um dos tipos internos de componentes React: +`ReactCompositeComponent` (para nossos próprios componentes), `ReactDOMComponent` (para tags HTML), e `ReactDOMTextComponent` (para nós de texto). Vamos omitir `ReactDOMTextComponent` e vamos apenas focar nos dois primeiros + +Componentes internos? Interessante. Você já ouviu falar sobre **DOM Virtual** certo? DOM Virtual é meio que um componente interno do DOM que é usado pelo React pra não tocar diretamente no DOM durante as computações de diff e etc. Isso faz React ser rápido! Mas, na verdade, não há arquivos ou classes dentro do código fonte do React chamado "DOM Virtual". Estranho né? Bem, é porque o DOM Virtual é apenas um conceito, uma maneira de como trabalhar com o DOM real. Então, algumas pessoas dizem que o DOM Virtual se referem aos elementos React, mas na minha opinião, não é bem isso. Acho que o DOM Virtual se refere a essas três classes: `ReactCompositeComponent`, `ReactDOMComponent`, `ReactDOMTextComponent`. Você vai ver mais tarde o porquê. + +OK, vamos terminar nossa instanciação aqui. Vamos criar uma instância de `ReactCompositeComponent`, mas na verdade não é porque colocamos `` no `ReactDOM.render`. React sempre inicia a renderização da árvore do componente pelo `TopLevelWrapper`. É como se fosse um wrapper ocioso, seu `render` (método de render do componente) vai retornar mais tarde ``, e só. + +```javascript +//src\renderers\dom\client\ReactMount.js#277 +TopLevelWrapper.prototype.render = function () { + return this.props.child; +}; + +``` + +Então, só `TopLevelWrapper` é criado, nada mais por enquanto. Continuando. Mas... antes, um fato interessante! +> Fato interessante: Validando DOM Nesting + +> Quase sempre que componentes aninhados estão renderizando, eles estão sendo validados por um módulo dedicado para validação HTML chamado `validateDOMNesting`. Validação de DOM nesting significa verificação da hierarquia de tags `filho -> pai`. Por exemplo se uma tag pai é `