React Native 0.79 — Ferramentas mais rápidas e muito mais
8 de abril de 2025 · 11 min de leitura
Hoje estamos entusiasmados em lançar o React Native 0.79!
Esta versão vem com melhorias de desempenho em várias frentes, bem como diversas correções de bugs. Primeiro, o Metro agora é mais rápido de iniciar graças ao hash diferido e tem suporte estável para exportações de pacotes. O tempo de inicialização no Android também será melhorado graças às mudanças nas compressões do pacote JS e muito mais.
Destaques
- Novos recursos do metrô
- JSC mudando para um pacote comunitário
- iOS: Registro de módulos nativos compatíveis com Swift
- Android: inicialização mais rápida do aplicativo
- Remoção de depuração JS remota
Destaques
Metro: Suporte mais rápido para inicialização e exportação de pacotes
Este lançamento vem com Metrô 0,82.Esta versão usa hash diferido para melhorar a velocidade do primeiro yarn start normalmente em mais de 3x (mais em projetos maiores e monorepos), tornando sua experiência de desenvolvimento e compilações de CI mais rápidas diariamente.
Também no Metro 0.82, estamos promovendo package.json "exports" e "imports" resolução de campo para estável. "exports" resolução era introduzido no React Native 0.72, e "imports" o suporte foi adicionado em uma contribuição da comunidade - ambos agora serão habilitados por padrão para todos os projetos no React Native 0.79.
Isso melhora a compatibilidade com as dependências modernas do npm e abre novas maneiras compatíveis com os padrões de organizar seus projetos.
Quebrando a mudança
Enquanto estávamos testando package.json "exports" na comunidade por um tempo, essa transição pode ser uma mudança radical para certos pacotes e configurações de projetos.
Em particular, estamos cientes das incompatibilidades relatadas pelos usuários para alguns pacotes populares, incluindo Firebase e AWS Amplify, e estamos trabalhando para corrigi-las na origem.
Se você estiver enfrentando problemas:
- Por favor, atualize para o Metro Hotfix 0.81.5, ou definir
resolver.unstable_enablePackageExports = falseoptar por não participar. - Ver exposição/expo#36551 para pacotes afetados e atualizações futuras.
JSC mudando para Pacote Comunitário
Como parte do nosso esforço para reduzir a superfície da API do React Native, estamos no processo de mover o mecanismo JavaScriptCore (JSC) para um pacote mantido pela comunidade: @react-native-community/javascriptcore
Esta alteração não afetará os usuários que estão usando Hermes.
A partir do React Native 0.79, você pode usar uma versão do JSC suportada pela comunidade seguindo o instruções de instalação no readme. A versão JSC fornecida pelo React Native Core ainda estará disponível na versão 0.79, mas estamos planejando removê-la num futuro próximo.
Mover o JSC para um pacote mantido pela comunidade nos permitirá atualizar a versão do JSC com mais frequência e oferecer os recursos mais recentes. A comunidade afirmou que o JSC seguirá um cronograma de lançamento separado do React Native.
iOS: Registro de módulos nativos compatíveis com Swift
Nesta versão, estamos reformulando a maneira como você pode registrar seu Módulo Nativo no tempo de execução do React Native. A nova abordagem segue a mesma abordagem de componentes, descrita no documentação oficial.
A partir desta versão do React Native, você pode registrar seus módulos modificando o package.json arquivo. Introduzimos um novo modulesProvider campo no ios propriedade:
"codegenConfig": {
"ios": {
+ "modulesProvider": {
+ "JS Name for the module": "ObjC Module provider for the pure C++ TM or a class conforming to RCTTurboModule"
+ }
}
}A Codegen terá o cuidado de criar todo o código relevante a partir do seu package.json arquivo.
Se você usar um módulo nativo C++ puro, terá que seguir esta configuração recomendada:
Configure módulos nativos C++ puros em seu aplicativo
Com esta nova abordagem, unificamos o registro de Módulos Nativos tanto para desenvolvedores de aplicativos quanto para mantenedores de bibliotecas. As bibliotecas podem especificar as mesmas propriedades em seus package.json e Codegen cuidará do resto.
Esta abordagem resolve a limitação que introduzimos na versão 0.77 que impedia o registro de um Módulo Nativo C++ puro com um Swift AppDelegate. Como você pode ver, nenhuma dessas alterações modifica o AppDelegate e o código gerado funcionará para AppDelegate implementado com Swift e Objective-C.
Android: inicialização mais rápida do aplicativo
Também estamos enviando uma alteração para melhorar significativamente o tempo de inicialização do seu Android.
A partir desta versão, não compactaremos mais o pacote JavaScript dentro do APK. Anteriormente, o sistema Android precisava descompactar o pacote JavaScript antes que seu aplicativo pudesse ser iniciado. Isso estava causando uma desaceleração significativa durante a inicialização do aplicativo.
A partir desta versão, enviaremos o pacote JavaScript descompactado por padrão, para que seus aplicativos Android sejam geralmente mais rápidos de iniciar.
O Margelo a equipe testou esse recurso no aplicativo Discord e obteve um aumento significativo no desempenho: o tempo de interação (TTI) do Discord foi reduzido em 400 ms, o que representou uma aceleração de 12% com uma mudança de uma linha (testado em um Samsung A14).
Por outro lado, armazenar o pacote descompactado resultará em um maior consumo de espaço para seu aplicativo no dispositivo do usuário. Se isso for uma preocupação para você, você pode alternar esse comportamento usando o enableBundleCompression propriedade em seu app/build.gradle arquivo.
aplicativo/construir.gradle
react {
// ...
// If you want to compress the JS bundle (slower startup, less
// space consumption)
enableBundleCompression = true
// If don't you want to compress the JS bundle (faster startup,
// higher space consumption)
enableBundleCompression = false
// Default is `false`
}Observe que o tamanho do APK aumentará nesta versão, mas seus usuários não pagarão o custo extra no tamanho do download do APK, pois os APKs são compactados quando baixados da rede.
Quebrando Mudanças
Remoção de depuração JS remota
Como parte de nossos esforços contínuos para melhorar a depuração, estamos removendo a depuração remota de JS via Chrome. Este método de depuração legado foi descontinuado, e movido para um opt-in de tempo de execução, no React Native 0.73. Por favor use Ferramentas de desenvolvimento nativas do React para depuração moderna e confiável.
Isso também significa que o React Native não é mais compatível com o depurador nativo de reação projeto comunitário. Para desenvolvedores que desejam usar extensões de depuração de terceiros, como Redux DevTools, recomendamos Plugins Expo DevTools, ou integrando as versões autônomas dessas ferramentas.
Leia mais em este post dedicado.
Módulos internos atualizados para export sintaxe
Como parte da modernização de nossa base de código JavaScript, atualizamos vários módulos de implementação react-native para usar consistentemente export sintaxe em vez de module.exports.
Atualizamos em torno de 46 APIs no total, que pode ser encontrado no changelog.
Esta alteração tem um impacto subtil nas importações existentes:
Caso 1: Exportação padrão
// CHANGED - require() syntax
- const ImageBackground = require('react-native/Libraries/Image/ImageBackground');
+ const ImageBackground = require('react-native/Libraries/Image/ImageBackground').default;
// Unchanged - import syntax
import ImageBackground from 'react-native/Libraries/Image/ImageBackground';
// RECOMMENDED - root import
import {ImageBackground} from 'react-native';Caso 2: Exportações secundárias
Existem muito poucos casos desse padrão, novamente não afetados ao usar a raiz 'react-native' importar.
// Unchanged - require() syntax
const BlobRegistry = require('react-native/Libraries/Blob/BlobRegistry');
// Unchanged - require() syntax with destructuring
const {register, unregister} = require('react-native/Libraries/Blob/BlobRegistry');
// CHANGED - import syntax as single object
- import BlobRegistry from 'react-native/Libraries/Blob/BlobRegistry';
+ import * as BlobRegistry from 'react-native/Libraries/Blob/BlobRegistry';
// Unchanged - import syntax with destructuring
import {register, unregister} from 'react-native/Libraries/Blob/BlobRegistry';
// RECOMMENDED - root import
import {BlobRegistry} from 'react-native';Esperamos que o impacto desta mudança seja extremamente limitado, especialmente para projetos escritos em TypeScript e que utilizam import sintaxe. Verifique se há algum erro de tipo para atualizar seu código.
Dica
A raiz react-native a importação é fortemente recomendada
Como conclusão geral, recomendamos fortemente importar da raiz 'react-native' caminho, para evitar mudanças estranhas no futuro. Em nossa próxima versão, descontinuaremos as importações profundas, como parte de uma melhor definição da API JavaScript pública do React Native (veja o RFC).
Outras mudanças de última hora
Esta lista contém uma série de outras alterações drásticas que suspeitamos que possam ter um impacto menor no código do seu produto e que vale a pena observar.
- Comprimentos inválidos sem unidade em sombras de caixa e filtros:
- Para tornar o React Native mais compatível com as especificações CSS/Web, agora não oferecemos mais suporte a comprimentos sem unidade em
box-shadowefilter. Isso significa que se você estivesse usando umbox-shadowde1 1 blacknão estaremos renderizando. Em vez disso, você deve especificar unidades como1px 1px black - Remova o suporte incorreto à sintaxe hwb() de normalize-color:
- Para tornar o React Native mais compatível com as especificações CSS/Web, agora restringimos alguma sintaxe inválida para
hwb(). Historicamente, o React Native costumava suportar valores separados por vírgulas (por exemplohwb(0, 0%, 100%)) que agora não apoiamos mais (você deve migrar parahwb(0 0% 100%)). Você pode ler mais sobre essa mudança aqui. - Atualização de exportações do Libraries/Core/ExceptionsManager
- Como parte do nosso esforço para modernizar a API React Native JS, atualizamos
ExceptionsManagerpara exportar agora um padrãoExceptionsManagerobjeto, eSyntheticErrorcomo exportação secundária.
Agradecimentos
React Native 0.79 contém mais de 944 commits de 100 colaboradores. Obrigado por todo o seu trabalho duro!
Gostaríamos de enviar um agradecimento aos membros da comunidade que enviaram contribuições significativas neste comunicado:
- Marc Rousavy para desenvolver e documentar o recurso “Android: Faster App Startup”
- Kudo Chien e Oskar Kwaśniewskipor trabalhar no
@react-native-community/javascriptcorepacote e escrevendo a seção “JSC movendo para Community Package” - James Lawson para adicionar suporte para resolução de subcaminho de importação no metrô.
Além disso, também gostaríamos de agradecer aos autores adicionais que trabalharam na documentação de recursos nesta postagem de lançamento:
- Rob Hogan para a seção “Novos recursos do metrô”
- Alex Caça para as seções “Remoção de depuração remota de JS” e “Módulos internos atualizados para sintaxe de exportação”
- Riccardo Cipolleschi para o trabalho de registro do Módulo Nativo iOS
Atualize para 0,79
Por favor, use o Ajudante de atualização do React Native para visualizar alterações de código entre versões do React Native para projetos existentes, além dos documentos de atualização.
Para criar um novo projeto:
npx @react-native-community/cli@latest init MyProject --version latestSe você usar o Expo, o React Native 0.79 será suportado no próximo Expo SDK 53 como a versão padrão do React Native.
Informações
0.79 é agora a versão estável mais recente do React Native e 0.76.x passa para não suportado. Para mais informações consulte Política de suporte do React Native. Nosso objetivo é publicar uma atualização final de fim de vida útil de 0,76 em um futuro próximo.
