Hoje estamos animados em anunciar o lançamento do React Native 0.87!
Nesta versão, a API TypeScript Estrita torna-se a API JavaScript padrão por default, Metro é atualizado para a versão 0.87 e suporte experimental ao Swift Package Manager (SwiftPM) é adicionado. A versão também eleva os requisitos mínimos da ferramenta: Node.js 22, Android Gradle Plugin 9 e Kotlin 2.0+.
Destaque
Destaque
API TypeScript Estrita como padrão
A API JavaScript pública do React Native agora é a API TypeScript Estrita. Isso estava disponível originalmente como uma prévia opcional no 0.80, junto à depreciação das importações profundas. No 0.87, ela se torna o padrão para todos os projetos.
Esta é uma mudança em toda a ecossistema e traz mudanças intencionais quebrando a superfície da API. O retorno:
- Tipo confiável: Os tipos são agora gerados diretamente do código-fonte do React Native, substituindo as definições manuais que enviávamos anteriormente. Isso remove o deslocamento de longa data entre os tipos e o código, com cobertura e precisão melhoradas em toda a API.
- API estável: Uma API estável começa definindo exatamente o que ela abrange. A API agora é limitada ao que
react-nativeexporta no seu nível raiz, então nossas alterações internas de arquivo não são mais suas mudanças quebrando.
Aqui estão os novos tipos em ação — hover o componente TextInput:
| Antes (tipos legados) | Depois (API Estrita) |
|---|---|
![]() | ![]() |
Os comentários de documentação agora estão incluídos em grande parte dos símbolos, fornecendo informações mais visíveis ao passar o mouse.
Mudanças quebrando
- Importações profundas em caminhos internos (por exemplo,
react-native/Libraries/*) agora são um erro de tipo e devem ser migradas. - Nomes e formas de alguns tipos foram atualizados onde as definições legadas eram inapropriadas ou mal alinhadas — mais visivelmente, refs agora têm tipos dedicados (por exemplo
ViewInstance,TextInputInstance) (documentação).
Desde a prévia original 0.80, trabalhamos com a comunidade e parceiros para refinar nossa API — finalizando exportações raiz e resolvendo incompatibilidades com bibliotecas populares.
Muitos aplicativos devem ser capazes de atualizar para o 0.87 com poucos ou nenhum erro. A guia de migração aborda cada mudança quebrando.
A atualização guiada pode usar a /migrate-to-strict-api habilidade, que contém instruções de migração diretas em cima dos nossos fixers ESLint existentes.
Optando por fora
Nós entendemos que nem todos os aplicativos ou bibliotecas poderão migrar imediatamente — com isso em mente, estamos mantendo um interruptor de opt-out do usuário.
O opt-out é uma ponte temporária: permanece disponível até React Native 0.88, e pretendemos remover os tipos TypeScript legados na próxima versão.
API Estrita: Optando por fora
Para reverter temporariamente para os tipos anteriores, adicione a condição personalizada "react-native-legacy-deep-imports" ao seu tsconfig.json:
tsconfig.json
{
"extends": "@react-native/typescript-config",
"compilerOptions": {
...
+ "customConditions": ["react-native", "react-native-legacy-deep-imports"]
}
}
- Optar por fora afeta apenas a análise TypeScript no seu próprio projeto — os aplicativos e bibliotecas migram independentemente (mais detalhes).
- Caso algo esteja impedindo você de adotar a API Estrita, por favor nos informe em nosso fio de feedback.
API Estrita: Leitura adicional e FAQs
- FAQs — respostas a perguntas comuns, incluindo se isso afeta o runtime, o cronograma de migração dos autores da biblioteca e por que os tipos manuais foram substituídos.
- Movendo-se em direção a uma API JavaScript estável — nossa razão original para esta migração, do anúncio de prévia 0.80.
- Assista à palestra — uma imersão em nossas motivações e o trabalho por trás da API TypeScript Estrita, do App.js 2025.
Metro mais rápido e leve
Metro foi atualizado de 0.84 para 0.87 nesta versão.
- Mapeamento de origem é agora duas vezes mais rápido, para carregamentos mais rápidos do React Native DevTools.
- Metro usa metade da memória, graças a um armazenamento de mapeamento de origem mais eficiente.
- Suporte estável para TypeScript e ESM configurações de arquivo config files, por exemplo,
metro.config.mts. Foi removido o suporte a extensões.es6e configurações YAML. - Novos recursos do resolutor incluindo auto-resolução de pacotes.
- Várias correções e melhorias, consulte as notas de lançamento do Metro em release notes.
Experimental Swift Package Manager support for iOS
O React Native 0.87 adiciona suporte experimental para o Swift Package Manager como uma alternativa ao CocoaPods no iOS. É opcional e aditivo; o CocoaPods permanece o padrão e a rota de suporte.
Esta nova configuração só precisa do Xcode — sem Ruby, sem Bundler, sem CocoaPods.
Para tentar em um aplicativo existente/novo:
cd ios
npx react-native spm -- deintegrateO comando injeta referências de pacote Swift no seu .xcodeproj existente em vez de substituir o projeto. Sua assinatura, capacidades e fases de construção permanecem inalteradas. O comando npx react-native spm deinit reverterá a alteração exatamente.
Você só executa esse comando uma vez. Depois da primeira configuração, você não o executa novamente quando suas dependências mudarem. Instale ou remova um pacote nativo e depois construa. O projeto detecta a mudança e reexecuta a autolinkagem para você. Não há passo pod install que precisa ser lembrado após cada alteração de dependência.
Om conhecidos limitações:
- Uma biblioteca da comunidade deve enviar um
Package.swift. Se não o fizer, executenpx react-native spm scaffoldpara gerar a partir do podspec da biblioteca. - Depois de clonar limpo e em CI, execute
npx react-native spmuma vez antes de construir. É o equivalente aopod install. - Os comandos, bandeiras e layout gerado podem mudar nas próximas versões. Não use-o em produção ainda.
Consulte RFC #0994 para o design completo e plano de migração.
Para suportar adequadamente a integração do SwiftPM com React Native, tivemos que repensar como distribuímos os binários pré-compilados do próprio React Native. Isso é necessário porque o SwiftPM é muito mais rigoroso em relação ao Cocoapods quando se trata da estrutura de XCFramework e localização dos cabeçalhos.
Você pode notar alguns novos XCFrameworks:
ReactNativeHeaders.xcframeworkReactNativeDependenciesHeaders.xcframework
Plugin Gradle para Android (AGP) v9
Esta é a primeira versão do React Native que adiciona suporte ao AGP 9.
O AGP 9.0 é uma grande atualização do AGP que traz várias alterações na API e mudanças quebradoras em builds Gradle.
Em particular, nesta versão é recomendado optar por não usar o Kotlin embutido e a nova API DSL do AGP 9. Você pode fazer isso adicionando essas flags no seu arquivo android/gradle.properties, conforme sugerido também pelo assistente de atualização:
# Opt out of built-in kotlin and new DSL behavior that ships with AGP9.
# Starting from AGP10.x these opt outs will be removed.
android.builtInKotlin=false
android.newDsl=false
Você pode acompanhar o progresso da adoção em larga escala do AGP 9 na RFC #1006
Mudanças Compatíveis
- Node.js >= 22.13.0 é agora necessário.
- Android: A versão mínima do Kotlin é agora 2.0+ (versão Kotlin embalada é 2.2.0).
- Android:
minCompileSdké agora 34 (bibliotecas devem alvoar compileSdk >= 34); - Android:
compileSdk/buildToolsfoi atualizado para 37.
Remoções da API
- A API Strict TypeScript é agora o padrão (veja Destaques) — importações profundas em
Libraries/são inacessíveis a menos que opte por voltar via"react-native-legacy-deep-imports"(detalhes) - Importações profundas para
src/private/foram removidas. - Os alias de tipo *Properties (por exemplo,
ViewProperties) que estavam sendo depreciados são inacessíveis sob a API Strict — use os equivalentes*Props(detalhes) - O suporte para arquivos de configuração Metro YAML e arquivos de configuração JavaScript com extensão
.es6foi removido. InteractionManagerfoi removido — userequestIdleCallbackem vez disso.- A propriedade animated do componente
Modal, que estava sendo depreciada, foi removida. - As propriedades de status bar
backgroundColor,translucentenetworkActivityIndicatorVisiblee seus métodos setters foram removidos. - O suporte para valores booleanos na propriedade
keyboardShouldPersistTapsdo componenteScrollViewfoi removido. - useTurboModules não é mais um recurso de bandeira (TurboModules são sempre habilitados).
useColorScheme()agora retornaColorSchemeName | nulle não retorna mais'unspecified'.- A exportação de
NativeDialogManagerAndroidfoi removida, bem como a exportação raiz (não documentada) do componenteTouchable— estendaViewPropsem vez disso. - Os tipos
NativeMethods/NativeMethodsMixinforam removidos (useHostInstance)
@react-native/core-cli-utilsnão é mais publicado (ainda disponível no repositório como referência).react-native/rn-get-polyfillsfoi removido — use@react-native/js-polyfills.@react-native/jest-presetdeve agora ser consumido como um pacote.- O suporte para conexão ao pacote standalone
react-devtoolsvia WebSocket foi removido — use React Native DevTools em vez disso.
Deprecados
As seguintes APIs estão depreciadas e serão removidas em uma versão futura:
react-native/Libraries/Core/InitializeCore→ usereact-native/setup-env(detalhes).@react-native/assets-registry→ useAssetRegistrydereact-nativee o novo@react-native/asset-utils.ImageBackground→ use umViewcom uma imagem posicionada absolutamente.NativeMethodsinterface → useHostInstance.Appearance.setColorScheme('unspecified')→ use'auto'.- Android:
DrawerLayoutAndroid→ usereact-native-drawer-layout;UIBlock/UIManagerModule.addUIBlock/prependUIBlock→ useUIManagerListenerou View Commands; os construtores de nova arquitetura emDefaultReactActivityDelegate. - iOS:
TimingModule;RCTTurboModuleEnabled()/RCTEnableTurboModule().
Agradecimentos
O React Native 0.87 contém 265 commits de 74 contribuidores. Obrigado pelo seu trabalho duro!
Queremos enviar um agradecimento especial aos membros da comunidade que enviaram contribuições significativas nesta versão.
Atualizar para 0.87
Atualizando
Por favor, use o React Native Upgrade Helper para visualizar as alterações de código entre versões do React Native em projetos existentes, além dos documentos Atualizando.
Criar um novo projeto
npx @react-native-community/cli@latest init MyProject --version latest
Expo
Para projetos Expo, o React Native 0.87 estará disponível como parte das versões expo@canary.



