React v15.0
Gostaríamos de agradecer à comunidade React por continuar relatando os problemas e regressões encontrados nos candidatos a release em nosso registro de erros. Nas últimas semanas, corrigimos os problemas encontrados e, agora, após dois candidatos a release, estamos empolgados para finalmente lançar a versão estável do React 15.
Como lembrete, estamos mudando para as principais versões para indicar que estamos usando o React em produção há muito tempo. O release 15.0 segue o 0.14 anterior e continuaremos a seguir esse versionamento semântico como fazemos desde 2013. É importante também notar que não temos mais suporte ativo para o Internet Explorer 8. Acreditamos que o React funcionará na sua forma atual, mas não priorizaremos nenhum esforço para corrigir novos problemas que afetam apenas o IE8.
O React 15 traz melhorias significativas na maneira como interagimos com o DOM:
- Agora usamos
document.createElement
ao invés deinnerHTML
ao montar componentes. Isso nos livra do atributodata-reactid
em todos os nós e torna o DOM mais leve. O uso dedocument.createElement
também é mais rápido nos navegadores modernos e corrige vários casos extremos relacionados a elementos SVG e a execução de várias cópias do React na mesma página. - Em termos históricos, nosso suporte ao SVG foi incompleto e muitas tags e atributos estavam ausentes. Ouvimos você e, no React 15, adicionamos suporte a todos os atributos SVG reconhecidos pelos navegadores atuais. Se esquecemos algum atributo que você gostaria de usar, por favor, nos informe. Como bônus, graças ao uso do
document.createElement
, não precisamos mais manter uma lista de tags SVG; portanto, quaisquer tags SVG que anteriormente não eram compatíveis devem funcionar normalmente no React 15. - Recebemos algumas contribuições surpreendentes da comunidade nessa release e gostaríamos de destacar em particular essa pull request do Michael Wiencek. Graças ao trabalho do Michael, o React 15 não emite mais extra
<span>
nós ao redor do texto, tornando o resultado do DOM muito mais limpo. Esse era um incômodo antigo dos usuários do React, por isso é tão legal que essa mudança seja uma contribuição externa.
Embora não esteja diretamente relacionado ao release, entendemos que, para receber mais contribuições da comunidade como a contribuição de Michael, precisamos comunicar nossas metas e prioridades abertamente e revisar as solicitações de recebimento de forma mais decisiva. Como primeiro passo, começamos a publicar novamente as Notas da reunião semanal do React Core Team. Também pretendemos introduzir um processo RFC inspirado nos Ember RFCs para que colaboradores externos possam ter mais conhecimento e influência no desenvolvimento futuro do React. Manteremos você atualizado sobre tudo em nosso blog.
Também estamos experimentando um novo formato de registro de alterações neste post. Agora, todas as alterações são vinculadas à pull request correspondente e mencionam o autor. Se você vê utilidade nisso, fala pra gente.
Guia de Atualização
Como de costume em grandes releases, o React 15 removerá o suporte para alguns dos padrões descontinuados nove meses atrás no React 0.14. Sabemos que as alterações podem ser dolorosas (o código do Facebook tem mais de 20.000 componentes do React, isso sem contar do React Native). Por isso, sempre tentamos fazer alterações graduais para minimizar a dor.
Se o seu código não apresentar avisos ao ser executado no React 0.14, a atualização deverá ser bem mais fácil. A maior parte das mudanças neste release estão realmente nos bastidores, impactando a maneira como o React interage com o DOM. A outra mudança substancial é que o React agora suporta toda a gama de elementos e atributos SVG. Além disso, temos um grande número de melhorias incrementais e avisos adicionais destinados a ajudar os desenvolvedores. Também solidificamos a nossa base para fornecer novos recursos em futuros releases.
Veja o registro de mudanças abaixo para mais detalhes.
Instalação
Recomendamos a instalação do React com o gerenciador de pacotes npm
e o uso de uma ferramenta como o browserify ou o webpack para criar o seu código em um único bundle. Para instalar os dois pacotes:
npm install --save react react-dom
Lembre-se de que, por padrão, o React executa verificações extras e fornece avisos no modo de desenvolvimento. Ao fazer deploy do seu aplicativo, defina a variável de ambiente NODE_ENV
comoproduction
para usar a construção de produção do React, que não inclui os avisos de desenvolvimento e executa mais rápido.
Se você ainda não tem como usar o npm
, fornecemos versões pré-construídas do navegador para sua conveniência, que também estão disponíveis no pacotereact
no navegador.
- React
Versão de desenvolvimento com avisos: https://fb.me/react-15.0.0.js
Versão minificada para producão: https://fb.me/react-15.0.0.min.js - React com Add-Ons
Versão de desenvolvimento com avisos: https://fb.me/react-with-addons-15.0.0.js
Versão minificada para producão: https://fb.me/react-with-addons-15.0.0.min.js - React DOM (inclua React na página antes do React DOM)
Versão de desenvolvimento com aviso: https://fb.me/react-dom-15.0.0.js
Versão minificada para producão: https://fb.me/react-dom-15.0.0.min.js
Changelog
Principais mudanças
-
document.createElement
é mantido edata-reactid
está foraAconteceram várias mudanças grandes na forma como interagimos com o DOM. Uma das mudanças mais notáveis é que não definimos mais o atributo
data-reactid
para cada nó do DOM. Embora essa mudança torne mais difícil saber se um site está usando o React, a vantagem é que o DOM fica muito mais leve. Essa alteração foi possível ao escolhermos o uso dedocument.createElement
na renderização inicial. Anteriormente, gerávamos uma grande string de HTML e, em seguida, definíamosnode.innerHTML
. Na época, decidiu-se que essa abordagem era mais rápida do que usardocument.createElement
para a maioria dos casos e navegadores compatíveis. Mas os navegadores continuaram a melhorar tanto que a razão por trás da nossa abordagem inicial não é mais verdadeira. Ao usarcreateElement
, podemos fazer com que outras partes do React fiquem mais rápidas. Os IDs foram usados para mapear os eventos para o componente React original, o que significa que tínhamos que fazer muita coisa em todos os eventos, mesmo já tendo esses dados armazenados em cache. Como todos já vimos, o armazenamento em cache e, em particular, a invalidação de caches, podem ser propensos a erros e, como resultado, vimos muitos problemas difíceis de serem reproduzidos. Agora podemos construir um mapeamento direto no momento da renderização, já que já temos um identificador no nó.** Nota: **
data-reactid
ainda está presente no conteúdo renderizado pelo servidor, no entanto, é muito menor do que antes e é agora é simplesmente um contador de incremento automático.@sophiebits em #5205
-
Não há mais
<span>
s extrasOutra grande mudança na nossa interação com o DOM é como processamos blocos de texto. Anteriormente, você deve ter notado que o React renderizava muitos
<span>
s extras. Por exemplo, em nosso exemplo mais básico na página inicial, renderizamos<div> Olá {this.props.name} </div>
, resultando em uma marcação que continha 2<span>
s. Agora, renderizaremos nós de texto sem formatação intercaladas com nós de comentários usados para demarcação. Isso nos dá a capacidade de atualizar partes de texto individuais sem criar extras nós aninhados. Pouquíssimas pessoas dependiam da marcação gerada aqui; portanto, é provável que você não seja impactado. No entanto, se você estava direcionando esses<span>
s em seu CSS, precisará ajustar de acordo. Você sempre pode processá-los explicitamente em seus componentes. -
Renderizar
null
agora usa nós de comentáriosTambém usamos esses nós de comentários para alterar o que o “null” renderiza. Renderizar
null
foi um recurso que adicionamos no React 0.11 e foi implementado renderizando elementos<noscript>
. Ao renderizar os nós de comentários agora, é possível que partes do seu CSS estejam direcionando para o lugar errado, especificamente se você estiver usando os seletores: nth-child
. O uso do React da tag<noscript>
sempre foi considerado um detalhe de implementação de como o React segmenta o DOM. Acreditamos que essas são mudanças seguras a serem feitas que removem a necessidade de um release com avisos detalhando as diferenças sutis, visto que esses são detalhes dos quais não devemos depender. Além disso, vimos que essas alterações melhoraram o desempenho do React para muitos aplicativos. @sophiebits em #5451 -
Componentes de função agora também retornam
null
Adicionamos suporte para a definição de componentes sem estado como funções no React 0.14. No entanto, o React 0.14 ainda permitia que você definisse um componente de classe sem estender o
React.Component
ou usando oReact.createClass ()
, portanto [não dava para sabermos com segurança se o seu componente era uma função ou uma classe](https://github.com/facebook/react/issues/5355(https://github.com/facebook/react/issues/5355), além de não permitirnull
como retorno. Esse problema foi resolvido no React 15 e agora você pode retornarnull
de qualquer componente, seja o componente uma classe ou uma função. -
Melhoria no suporte para SVG
Agora há suporte para todas as tags SVG. (Tags SVG incomuns não estão presentes no auxiliar de elemento do
React.DOM
, mas JSX eReact.createElement
funcionam em todos os nomes de tags.) Todos os atributos SVG implementados pelos navegadores possuem suporte também. Se você encontrar algum atributo que negligenciamos, por favor nos informe nesta issue.
Mudanças radicais
-
Não há mais
<span>
s extrasÉ bom ressaltar as alterações da estrutura do DOM que comentamos anteriormente mais uma vez, em particular a alteração que diz respeito aos
<span>
s. Durante a atualização da base de código do Facebook, encontramos uma quantidade muito pequena de código que dependia da marcação que o React criava. Alguns desses cenários foram testes de integração como o WebDriver, que fazia consultas XPath muito específicas para direcionar nós. Outros eram simplesmente testes usando oReactDOM.renderToStaticMarkup
e comparações de marcação. Novamente, houve um número muito pequeno de mudanças que precisavam ser feitas, mas não queremos que ninguém seja pego de surpresa. Incentivamos todos a executar seus conjuntos de testes ao atualizar e considerar abordagens alternativas sempre que possível. Uma abordagem que funcionará em alguns casos é usar explicitamente<span>
s no métodorender
. -
React.cloneElement ()
agora resolvedefaultProps
Corrigimos um erro no
React.cloneElement()
que pode afetar alguns componentes que dependiam dele. Se alguns dosprops
recebidos porcloneElement()
sãoundefined
, a função costumava retornar um elemento com valoresindefinidos
para esses props. No React 15, estamos mudando essa abordagem para que seja consistente comcreateElement()
. Agora, todos os objetos que são ‘undefined’ passados paracloneElement()
são resolvidos para osdefaultProps
do componente correspondente. Somente um dos nossos 20.000 componentes do React foi afetado negativamente por essa mudança, por isso nos sentimos confortáveis em liberar essa alteração sem manter o comportamento antigo por outro ciclo de release. -
ReactPerf.getLastMeasurements()
é opacoEssa alteração não afeta aplicativos, mas pode quebrar algumas ferramentas de terceiros. Estamos reformulando a implementação do ReactPerf e planejamos lançá-lo durante o ciclo 15.x. O formato interno de medição de desempenho está sujeito a alterações, portanto, por enquanto, consideramos o valor de retorno de
ReactPerf.getLastMeasurements()
uma estrutura de dados opaca que não deve ser confiável. -
Remoção de deprecations
Essas
deprecations
foram introduzidas há nove meses na v0.14 com um aviso e agora estão removidas:- APIs obsoletas foram removidas da exportação do nível superior do
React
:findDOMNode
,render
,renderToString
,renderToStaticMarkup
eunmountComponentAtNode
. Como lembrete, elas agora estão disponíveis noReactDOM
e noReactDOMServer
. @jimfb em #5832 - Os addons obsoletos foram removidos:
batchedUpdates
ecloneWithProps
. @jimfb em #5859, @zpao em #6016 - Métodos de instância de componente obsoletos foram removidos:
setProps
,replaceProps
egetDOMNode
. @jimfb em #5570 - O ponto de entrada obsoleto
react/addons
do CommonJS foi removido. Como lembrete, você deve usar pacotes separados, por exemplo,react-addons- *
. Isso se aplica apenas se você usar os builds do CommonJS. @gaearon em #6285 - Passar
children
para elementos void como<input>
não é mais permitido e agora gera um erro. @jonhester em #3372 - As propriedades específicas do React no DOM como
refs
(por exemplo, this.refs.div.props`) foram descontinuadas e foram removidas. @jimfb em #5495
- APIs obsoletas foram removidas da exportação do nível superior do
Novas deprecations, introduzidas com avisos
Cada uma dessas alterações continuará funcionando como antes com um novo aviso até o lançamento do React 16, para que você possa atualizar seu código gradualmente.
LinkedStateMixin
evalueLink
agora estão obsoletos devido à popularidade muito baixa. Se você precisar disso, poderá usar um componente wrapper que implemente o mesmo comportamento: react-linked-input. @jimfb em #6127- Versões futuras do React tratarão
<input value={null}>
como uma solicitação para limpar o input. No entanto, o React 0.14 está ignorandovalue={null}
. O React 15 alerta você sobre um valor de entradanull 'e lhe dá a opção de esclarecer sua intenção. Para corrigir o aviso, você pode passar explicitamente uma string vazia para limpar o input controlado ou passar
undefined` para tornar o input não controlado. @antoaravinth em #5048 ReactPerf.printDOM()
foi renomeado paraReactPerf.printOperations()
eReactPerf.getMeasurementsSummaryMap()
foi renomeado paraReactPerf.getWasted()
. @gaearon em #6287
Novos avisos importantes
- Se você usar uma cópia minificada do build de development, o React DOM o incentivará a usar o build mais rápido de produção. @sophiebits em #5083
- React DOM: Ao especificar um valor CSS sem unidade como uma string, uma versão futura não adicionará
px
automaticamente. Esta versão agora avisa neste caso (por exemplo: escrevendostyle = {{width: '300'}}
. Valores * unit * de número * comowidth: 300
permanecem inalterados. @pluma em #5140 - Os Eventos Sintéticos (Synthetic Events) agora avisam ao definir e acessar propriedades (que não serão limpas adequadamente), além de avisar sobre o acesso após o retorno de um evento ao pool. @kentcdodds em #5940 e @koba04 em #5947
- Agora, os elementos avisarão ao tentar ler
ref
ekey
dos props. @prometheansacrifice em #5744 - O React agora avisará se você passar um objeto
props
diferente para o construtorsuper()
. @prometheansacrifice em #5346 - O React agora avisará se você chamar
setState()
dentro degetChildContext()
. @raineroviir em #6121 - O React DOM agora tenta avisar sobre manipulações de eventos com erros de digitação nos elementos DOM, como
onclick
, que deve seronClick
. @ali em #5361 - O React DOM agora alerta sobre os valores
NaN
nostyle
. @jontewks em #5811 - O React DOM agora avisa se você especificar
value
edefaultValue
para um input. @mgmcdermott em #5823 - O React DOM agora avisa se um input alterna entre ser controlado e não controlado.
@TheBlasfem em #5864 - O React DOM agora avisa se você especificar os manipuladores
onFocusIn
ouonFocusOut
, pois eles são desnecessários no React. @jontewks em #6296 - O React agora imprime uma mensagem de erro descritiva quando você passa callback inválido como o último argumento para
ReactDOM.render()
,this.setState()
outhis.forceUpdate()
. @conorhastings em #5193 e @gaearon em #6310 - Add-Ons:
TestUtils.Simulate ()
agora imprime uma mensagem se você tentar usá-lo com renderização superficial. @conorhastings em #5358 - PropTypes:
arrayOf()
eobjectOf()
fornecem melhores mensagens de erro para argumentos inválidos. @chicoxyzzy em #5390
Importantes correções de erros
- Vários pequenos vazamentos de memória foram corrigidos.
@sophiebits em #4983 e @victor-homyakov em #6309 - Eventos de entrada são tratados com mais confiabilidade no IE 10 e IE 11; eventos hipotéticos não são mais acionados quando usados com um placeholder. @jquense em #4051
- O método do ciclo de vida
componentWillReceiveProps()
agora é chamado consistentemente quando ocontext
é alterado. @milesj em #5787 React.cloneElement()
não anexa barra a umakey
existente quando usado dentro deReact.Children.map()
. @ianobermiller em #5892- O React DOM agora suporta os atributos HTML
cite
eprofile
. @AprilArcus em #6094 and @saiichihashimoto em #6032 - O React DOM agora suporta as propriedades CSS
cssFloat
,gridRow
egridColumn
. @stevenvachon em #6133 and @mnordick em #4779 - O React DOM agora manipula corretamente
borderImageOutset
,borderImageWidth
,borderImageSlice
,floodOpacity
,strokeDasharray
estrokeMiterlimit
como propriedades CSS sem unidade. @rofrischmann em #6210 and #6270 - O React DOM agora suporta os eventos
onAnimationStart
,onAnimationEnd
,onAnimationIteration
,onTransitionEnd
eonInvalid
. O suporte aoonLoad
foi adicionado aos elementos doobject
. @tomduncalf em #5187, @milesj em #6005, e @ara4n em #5781 - O React DOM agora usa como padrão atributos do DOM, em vez de propriedades, o que corrige alguns erros excepcionais. Além disso, a anulação de valores (ex:
href = {null}
) agora resulta em uma remoção forçada, não mais tentando definir o valor padrão usado pelos navegadores na ausência de um valor. @syranide em #1510 - O React DOM não converte mais, por engano,
children
para strings em Web Components. @jimfb em #5093 - O React DOM agora normaliza corretamente os eventos SVG
<use>
. @edmellum em #5720 - O React DOM não lança exceções se um
<select>
for desmontado enquanto o manipuladoronChange
estiver em execução. @sambev em #6028 - O React DOM não lança exceções em aplicativos do Windows 8. @Andrew8xx8 em #6063
- O React DOM não lança exceções ao desmontar assincronamente um filho com um
ref
. @yiminghe em #6095 - O React DOM não força mais o layout síncrono devido ao rastreamento da posição do scroll. @syranide em #2271
Object.is
é usado em vários locais para comparar valores, o que leva a menos falsos positivos, especialmente envolvendo oNaN
. Em particular, isso afeta o add-onshallowCompare
. @chicoxyzzy em #6132- Add-Ons: o ReactPerf não mais instrumenta adições ou remoções de event listener porque eles não tocam no DOM devido à delegação de eventos. @antoaravinth em #5209
Outras melhorias
- O React agora usa o
loose-envify
em vez deenvify
e por isso instala menos dependências transitivas. @qerub em #6303 - O renderizador raso agora expõe
getMountedInstance()
. @glenjamin em #4918 - O renderizador raso agora retorna a saída renderizada de
render()
. @simonewebdesign em #5411 - React não depende mais do ES5 shams para
Object.create
eObject.freeze
em ambientes antigos. No entanto, ainda requer ES5 shims nesses ambientes. @dgreensp em #4959 - O React DOM agora permite atributos
data-
com nomes que começam com números. @nLight em #5216 - O React DOM adiciona um novo suporte
suppressContentEditableWarning
para componentes como Draft.js que gerenciam intencionalmente os filhoscontentEditable
com o React. @mxstbr em #6112 - O React melhora o desempenho de
createClass()
em especificações complexas. @sophiebits em #5550