Mobile Development

React Native 0.87 Arrives with Strict TypeScript Default, Swift Package Manager Support, and Higher Toolchain Requirements

The release of React Native 0.87 marks a significant evolutionary milestone for one of the world’s most prominent cross-platform mobile development frameworks. Crafted by Meta alongside a vibrant open-source community of global contributors, this new stable version systematically modernizes the ecosystem’s foundational layers. Moving away from legacy paradigms, version 0.87 introduces the Strict TypeScript API as the default JavaScript environment, upgrades the Metro bundler to version 0.87, implements experimental support for the Swift Package Manager (SwiftPM) on iOS, and raises minimum toolchain thresholds across both Android and Node.js environments. As older versions like 0.84 transition into unsupported status under Meta’s support policy, developers are urged to evaluate their codebases against these substantial architectural shifts.

The roadmap toward version 0.87 has been meticulously planned across several preceding iterations. The journey of the Strict TypeScript API, for instance, began as an opt-in preview in version 0.80, which simultaneously deprecated deep imports to pave the way for cleaner, more robust module resolution. Over subsequent months, core maintainers collaborated closely with ecosystem partners and library maintainers to refine root exports and root out stubborn incompatibilities. Similarly, the exploration of Swift Package Manager integration stems from long-standing community discussions—such as RFC #0994—seeking to liberate iOS development workflows from the heavy reliance on Ruby, Bundler, and CocoaPods. Concurrently, the alignment with Android Gradle Plugin (AGP) version 9 reflects Meta’s ongoing commitment to keeping pace with Google’s evolving Android build ecosystem, as outlined in RFC #1006.

At the core of the React Native 0.87 release is the promotion of the Strict TypeScript API to the default JavaScript interface for all newly initialized and upgraded projects. Originally introduced experimentally in version 0.80, this strict typing model brings intentional breaking changes across the API surface. However, the ecosystem-wide tradeoff yields major qualitative improvements for developers. Most notably, standard symbols—such as the widely used TextInput component—now feature comprehensive inline documentation comments. When developers hover over a symbol within their IDE, they are greeted with rich, glanceable type definitions and contextual documentation rather than bare identifiers.

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

To smooth the transition, the core team has provided robust tooling. Alongside standard ESLint fixers, agent-driven upgrades can leverage the specialized /migrate-to-strict-api skill, containing direct programmatic migration steps. For organizations requiring additional time to refactor sprawling codebases, a temporary opt-out mechanism has been provided. By injecting the "react-native-legacy-deep-imports" custom condition into the tsconfig.json file, development teams can temporarily revert to legacy types. Nevertheless, maintainers have explicitly noted that this bridge is strictly temporary and will be completely removed in the upcoming React Native 0.88 release.

In a move set to delight iOS developers weary of dependency management friction, React Native 0.87 introduces experimental support for the Swift Package Manager (SwiftPM) as an alternative to CocoaPods. This additive integration allows developers to consume the exact same prebuilt XCFrameworks published by React Native, while shifting the dependency configuration layer entirely into native Xcode project references. By executing a simple terminal command (npx react-native spm --deintegrate), developers can strip away CocoaPods without destabilizing existing project signing configurations, build phases, or custom capabilities.

Crucially, the SwiftPM workflow eliminates the repetitive ritual of running pod install after every dependency modification. Once the initial setup is complete, installing or removing native packages and initiating a build allows the project to automatically detect changes and handle autolinking seamlessly. To make this possible, Meta had to re-architect how precompiled binaries are shipped, introducing dedicated header-only XCFrameworks. This ensures strict adherence to SwiftPM’s rigorous header location rules, though it requires developers using bare-form angle includes to namespace their imports—for example, shifting from #import <RCTAppDelegate.h> to #import <React/RCTAppDelegate.h>.

On the Android front, version 0.87 delivers native support for the Android Gradle Plugin (AGP) version 9, a major release that introduces substantial API and structural modifications to Gradle builds. Because AGP 9 alters core build behavior, React Native’s maintainers currently recommend that development teams explicitly opt out of built-in Kotlin and the new DSL API features shipped with the plugin. By appending android.builtInKotlin=false and android.newDsl=false to the android/gradle.properties file—practices mirrored in the official upgrade helper—teams can maintain build stability until AGP 10.x forces broader ecosystem adoption.

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

To support these advanced build features and modern language capabilities, React Native 0.87 enforces a strict upward revision of minimum toolchain requirements. Projects upgrading to this version must now run on Node.js 22, Android Gradle Plugin 9, and Kotlin 2.0 or higher. Furthermore, the release deprecates several legacy APIs and cleans up older tooling packages, signaling a definitive break from technical debt accumulated over past cycles.

The release of React Native 0.87 was a massive collaborative achievement, driven by 265 individual commits contributed by 74 developers from across the global tech community. Meta and the core maintainer team have extended special acknowledgements to the community members whose significant code contributions, RFC formulations, and testing feedback made these complex architectural upgrades possible.

As version 0.87 takes its place as the current stable release, older branches such as 0.84.x officially enter unsupported territory in accordance with the project’s formal support lifecycle policy. Development teams managing production applications are encouraged to consult the interactive React Native Upgrade Helper to inspect exact diffs and code modifications required for their specific project structures. For greenfield initiatives, initializing a project via npx @react-native-community/cli@latest init MyProject --version latest provisions an environment fully configured with the latest defaults, while Expo users can anticipate integration through upcoming expo@canary releases.

Ultimately, the implications of React Native 0.87 extend far beyond routine maintenance patches. By enforcing stricter type safety out of the box, reducing the cognitive overhead of iOS dependency management through SwiftPM, and aligning with modern toolchains like AGP 9 and Node.js 22, the framework is positioning itself for a faster, more reliable future. While these breaking changes demand an initial investment in migration effort, the long-term payoff includes cleaner codebases, enhanced IDE productivity, and a significantly streamlined developer experience across both mobile platforms.

Related Articles

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button