Vi uma palestra do desenvolvedor do React em ( Pete Hunt: React: Repensando as melhores práticas - JSConf EU 2013 ) e o palestrante mencionou que a verificação suja do modelo pode ser lenta. Mas o cálculo da diferença entre DOMs virtuais na verdade é ainda menos eficiente, já que o DOM virtual, na maioria dos casos, deve ser maior que o modelo?
Eu realmente gosto do poder potencial do DOM virtual (especialmente a renderização no servidor), mas gostaria de saber todos os prós e contras.
javascript
dom
reactjs
virtual-dom
Daniil
fonte
fonte
Respostas:
Eu sou o autor principal de um módulo de dom virtual , então talvez eu possa responder às suas perguntas. De fato, existem 2 problemas que precisam ser resolvidos aqui
No React, cada um de seus componentes possui um estado. Esse estado é como um observável que você pode encontrar em knockout ou em outras bibliotecas de estilo MVVM. Essencialmente, o React sabe quando renderizar novamente a cena porque é capaz de observar quando esses dados são alterados. A verificação suja é mais lenta que as observáveis, porque você deve pesquisar os dados em um intervalo regular e verificar todos os valores na estrutura de dados recursivamente. Em comparação, a definição de um valor no estado sinalizará a um ouvinte que algum estado foi alterado, portanto o React pode simplesmente ouvir eventos de alteração no estado e enfileirar a nova renderização.
O DOM virtual é usado para re-renderização eficiente do DOM. Isso não está realmente relacionado à verificação suja de seus dados. Você pode renderizar novamente usando um DOM virtual com ou sem verificação suja. Você está certo quanto ao fato de haver alguma sobrecarga na computação da diferença entre duas árvores virtuais, mas a diferença virtual do DOM é sobre o que precisa ser atualizado no DOM e não se seus dados foram ou não alterados. De fato, o algoritmo diff é um verificador sujo, mas é usado para verificar se o DOM está sujo.
Nosso objetivo é renderizar novamente a árvore virtual somente quando o estado mudar. Portanto, usar um observável para verificar se o estado mudou é uma maneira eficiente de evitar renderizações desnecessárias, o que causaria muitas diferenças de árvore desnecessárias. Se nada mudou, não fazemos nada.
Um DOM virtual é bom porque nos permite escrever nosso código como se estivéssemos re-renderizando a cena inteira. Nos bastidores, queremos calcular uma operação de patch que atualiza o DOM para ter a aparência esperada. Portanto, embora o algoritmo diff / patch virtual do DOM provavelmente não seja a solução ideal , ele nos fornece uma maneira muito agradável de expressar nossos aplicativos. Apenas declaramos exatamente o que queremos e o React / virtual-dom descobrirá como tornar sua cena assim. Não precisamos manipular manualmente o DOM ou ficar confusos sobre o estado anterior do DOM. Também não precisamos renderizar novamente toda a cena, o que poderia ser muito menos eficiente do que corrigi-la.
fonte
unnecessary re-renders
?this.state.cats = 99
isso, ainda precisaria de verificação suja para verificar a alteração do modelo, assim como Angular dirty verifica a árvore $ scope. Esta não é uma comparação da velocidade das duas técnicas, é simplesmente uma declaração de que o React não faz uma verificação suja porque, em vez disso, possui um configurador de estilo Backbone.Recentemente, li um artigo detalhado sobre o algoritmo diff do React aqui: http://calendar.perfplanet.com/2013/diff/ . Pelo que entendi, o que faz o React rápido é:
Comparadas à verificação suja, as principais diferenças da IMO são:
Modelo de verificação suja : o componente React é explicitamente definido como sujo sempre que
setState
é chamado, portanto, não há comparação (dos dados) necessária aqui. Para verificação suja, a comparação (dos modelos) sempre acontece a cada loop de resumo.Atualização do DOM : as operações do DOM são muito caras, porque a modificação do DOM também se aplica e calcula estilos e layouts de CSS. O tempo economizado com a modificação desnecessária do DOM pode ser maior que o tempo gasto diferenciando o DOM virtual.
O segundo ponto é ainda mais importante para modelos não triviais, como um com grande quantidade de campos ou grande lista. Uma alteração de campo do modelo complexo resultará apenas nas operações necessárias para os elementos DOM que envolvem esse campo, em vez de toda a visualização / modelo.
fonte
$scope.$digest
é executada várias vezes por ciclo de digestão, portanto, é tempo múltiplo de comparação de dados completa versus tempo único de comparação parcial da árvore DOM virtual.React não é a única biblioteca de manipulação de DOM. Convido você a entender as alternativas lendo este artigo do Auth0, que inclui explicações e referências detalhadas. Vou destacar aqui seus prós e contras, como você perguntou:
fonte
Aqui está um comentário do membro da equipe do React, Sebastian Markbåge, que esclarece:
https://news.ycombinator.com/item?id=6937668
fonte
Dom virtual não é inventado por reagir. Faz parte do HTML dom. É leve e desanexado dos detalhes de implementação específicos do navegador.
Podemos pensar no DOM virtual como a cópia local e simplificada do HTML do React. Ele permite que o React faça seus cálculos nesse mundo abstrato e pule as operações DOM "reais", geralmente lentas e específicas do navegador. Na verdade, não há grande diferença entre DOM e DOM VIRTUAL.
Abaixo estão os pontos pelos quais o Virtual Dom é usado ( DOM virtual de origem no ReactJS ):
Bem como atualizar as propriedades do DOM, ie. valores. Segue um algoritmo.
Agora, suponha que se você atualizar o DOM 10 vezes diretamente, todas as etapas acima serão executadas uma a uma e a atualização dos algoritmos do DOM levará tempo para atualizar os valores do DOM.
É por isso que o Real DOM é mais lento que o DOM virtual.
fonte