React Native

React Native 0.87 - API TypeScript Estrita, Atualização do Metro, Suporte ao Swift Package Manager e AGP 9

A versão 0.87 do React Native foi lançada com a adoção padrão da API Strict TypeScript e atualizações no Metro para 0.87, além de suporte experimental ao Swift Package Manager (SwiftPM). A nova API traz tipos mais confiáveis gerados diretamente do código-fonte do React Native, garantindo uma cobertura e precisão melhores em toda a superfície da API.

Compartilhar
React Native 0.87 - Strict TypeScript API, Metro Update, Swift Package Manager, AGP 9 Support · React Native

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-native exporta 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)
Hovering the TextInput symbol under the legacy types, showing no documentationHovering the TextInput symbol under the Strict API, showing full type information and documentation

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 .es6 e 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 -- deintegrate

O 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, execute npx react-native spm scaffold para gerar a partir do podspec da biblioteca.
  • Depois de clonar limpo e em CI, execute npx react-native spm uma vez antes de construir. É o equivalente ao pod 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.xcframework
  • ReactNativeDependenciesHeaders.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/buildTools foi 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 .es6 foi removido.
  • InteractionManager foi removido — use requestIdleCallback em vez disso.
  • A propriedade animated do componente Modal, que estava sendo depreciada, foi removida.
  • As propriedades de status bar backgroundColor, translucent e networkActivityIndicatorVisible e seus métodos setters foram removidos.
  • O suporte para valores booleanos na propriedade keyboardShouldPersistTaps do componente ScrollView foi removido.
  • useTurboModules não é mais um recurso de bandeira (TurboModules são sempre habilitados).
  • useColorScheme() agora retorna ColorSchemeName | null e não retorna mais 'unspecified'.
  • A exportação de NativeDialogManagerAndroid foi removida, bem como a exportação raiz (não documentada) do componente Touchable — estenda ViewProps em vez disso.
  • Os tipos NativeMethods / NativeMethodsMixin foram removidos (use HostInstance)
  • @react-native/core-cli-utils não é mais publicado (ainda disponível no repositório como referência).
  • react-native/rn-get-polyfills foi removido — use @react-native/js-polyfills.
  • @react-native/jest-preset deve agora ser consumido como um pacote.
  • O suporte para conexão ao pacote standalone react-devtools via 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 → use react-native/setup-env (detalhes).
  • @react-native/assets-registry → use AssetRegistry de react-native e o novo @react-native/asset-utils.
  • ImageBackground → use um View com uma imagem posicionada absolutamente.
  • NativeMethods interface → use HostInstance.
  • Appearance.setColorScheme('unspecified') → use 'auto'.
  • Android: DrawerLayoutAndroid → use react-native-drawer-layout; UIBlock / UIManagerModule.addUIBlock / prependUIBlock → use UIManagerListener ou View Commands; os construtores de nova arquitetura em DefaultReactActivityDelegate.
  • 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.

Fonte original

Conteúdo traduzido e adaptado pela redação do Notícias Mobile. Confira também a matéria na fonte original.

Leia a matéria completa