Rocket Forge Studio logo
Rocket Forge Studio
Web & product studio

Business & growth

React Native 0.87 Upgrade: Strict TypeScript Default, Metro 0.87, and SwiftPM

Amir Behrouzi8 min read
  • React Native
  • Mobile
  • TypeScript
  • iOS
  • Upgrades
Before vs after React Native 0.87 upgrade infographic: left side blocked upgrade with deep import errors, TypeScript failures, and failed CI; right side Strict TypeScript passing, clean public APIs, Node 22.13+, AGP 9, Kotlin 2.x, and merged upgrade PR

React Native 0.87 is the release teams were waiting for if they still had deep imports, hand-maintained types, or a CocoaPods-only iOS pipeline. Shipped **August 11, 2026**, it is widely treated as a major step toward **React Native 1.0**—not feature fireworks, but a firmer platform contract.

If you are planning a **React Native 0.87 upgrade**, start with what changed by default: the **Strict TypeScript API** is no longer opt-in, **Metro 0.87** is faster and leaner, and iOS teams get an **experimental Swift Package Manager** path. Android builds move toward **AGP 9** with higher toolchain floors. Callstack, Expo, and many maintainers have already published migration notes—this article is the checklist for product and agency teams who ship apps alongside web work.

Why React Native 0.87 matters now

Version 0.80 warned about deep imports and offered Strict TypeScript as a preview. **0.87 makes Strict TypeScript the default JavaScript API** for every project. That is the headline for TypeScript codebases: types are generated from framework source, deep paths like `react-native/Libraries/*` are blocked, and ref types shift to dedicated `*Instance` shapes (for example `ViewInstance`, `TextInputInstance`).

The ecosystem framing is stability before 1.0. Fewer "works in JS but wrong in types" surprises. More pressure on libraries to ship root imports and accurate typings. If you skipped the 0.80 cleanup sprint, **0.87 is the deadline**, not another optional bump.

Strict TypeScript API: default, not optional

Under the Strict API:

  • **Deep imports** into `react-native/Libraries/*` are type errors—not warnings
  • **Types align with source** instead of legacy hand-written typedefs
  • **Ref types** use component instance types; some prop types are now `interface` declarations for library augmentation
  • **`InitializeCore`** deep import is deprecated; use **`react-native/setup-env`** where needed

You can **opt out temporarily** by adding `"customConditions": ["react-native-legacy-deep-imports"]` in `tsconfig.json` under `compilerOptions`. Treat that as a bridge, not a long-term strategy—the Strict API is the direction for 1.0.

Libraries and apps migrate **independently**: your app's `tsconfig.json` controls Strict mode for your code; consumers only see what each package ships. Still, upgrade order matters—update critical native modules before you flip production apps.

Metro 0.87: faster source maps, lower memory

Metro moves from **0.84 to 0.87** in this release. React Native reports **roughly 2× faster source map generation** and **about 50% lower memory use** during bundling—meaningful for large monorepos and CI machines that felt sluggish on every build.

Metro also stabilizes support for TypeScript and ESM config files, including **`metro.config.mts`**. If your team still carries a legacy `.js` Metro config copied from a 2022 template, 0.87 is a good moment to modernize.

Experimental Swift Package Manager for iOS

**SwiftPM is opt-in and experimental.** CocoaPods remains the default production path. The appeal: iOS builds without Ruby, Bundler, or Pod install churn—React Native consumes the same prebuilt XCFrameworks it already publishes.

Setup (from your `ios` directory): run **`npx react-native spm`** once to inject Swift package references into your existing `.xcodeproj`. Signing, capabilities, and build phases stay intact. Autolinking re-runs when dependencies change. Reverse with **`npx react-native spm deinit`**.

Caveats worth stating plainly: community libraries need **`Package.swift`** support, fresh clones and CI must run the setup step, and APIs may change while the path is experimental. Do not swap production release trains on SwiftPM alone without a rollback plan.

Android: AGP 9 and higher minimums

React Native 0.87 adds **Android Gradle Plugin 9** support and raises floors teams must meet before merging:

  • **Node.js ≥ 22.13.0** (hard requirement)
  • **Kotlin 2.0+** (bundled **2.2.0**)
  • **`minCompileSdk` 34** for libraries; **`compileSdk` / build tools** bumped (37 in current release notes)
  • Deep imports to **`react-native/src/private/*`** removed from package exports at runtime—not just types

Run the [Upgrade Helper](https://react-native-community.github.io/upgrade-helper/) diff against your current version before you touch Gradle files. Android upgrades punish rushed Friday merges.

New Architecture and migration chatter

Discussions from Callstack, Expo, and core contributors around 0.87 focus less on "should we adopt New Architecture?" and more on **finishing migration** while the platform tightens API surfaces. Strict TypeScript, Metro performance, and toolchain updates assume you are on—or actively moving to—the supported renderer and module path.

If Legacy Architecture debt remains, treat 0.87 as forcing function: fix libraries that rely on deep imports or private paths, then schedule New Arch verification in the same upgrade branch.

React Native 0.87 upgrade checklist

Use this sequence on a dedicated branch:

  • Confirm **Node 22.13+** locally and in CI
  • Run **Upgrade Helper** from your version → 0.87; apply template changes
  • Search repo for **`react-native/Libraries`**, **`src/private`**, and **`InitializeCore`** imports; replace with root or documented entry points
  • Fix **Strict TypeScript** errors—or set **`react-native-legacy-deep-imports`** temporarily with a dated removal ticket
  • Update **Android Gradle**, **Kotlin**, and **compileSdk** to meet new minimums
  • Re-run **iOS pods** (default path) or trial **`npx react-native spm`** on a spike branch only
  • Clean rebuild: delete caches, **`pod install`**, Gradle clean, one real-device smoke (auth, navigation, native modules)
  • Scan **deprecated removals** in the [0.87 release post](https://reactnative.dev/blog/2026/08/11/react-native-0.87)

New projects: follow current init docs on [reactnative.dev](https://reactnative.dev/). Expo users should read Expo SDK compatibility notes before assuming parity with bare workflow day one.

What this means if you also ship web

Agencies juggling Next.js marketing sites and React Native product apps often defer mobile bumps until a client escalation. **0.87 rewards the opposite**: toolchain and typing debt compound across releases, and Strict TypeScript default will break CI on upgrade day if deep imports remain.

Schedule the bump like infrastructure—not a "when we have slack" task. The Metro gains alone often pay back one afternoon of migration in weekly build time.

The takeaway

**React Native 0.87** is a maturity release: **Strict TypeScript by default**, **Metro 0.87** speed and memory wins, **experimental SwiftPM**, and **AGP 9** with Node 22+ and Kotlin 2.x floors. It is a credible step toward 1.0 because it narrows what "supported React Native code" means.

Clean deep imports, fix types on a branch, verify Android and iOS toolchains, then merge. If you want a second opinion on upgrade sequencing for a client app, get in touch.

← All articles