mrkeyoor.com_
Sat 26 Sept 18:25 UTC
Webevaluationupdated 26 Sept 2026

react-native-web review

React Native for Web translates React Native components and APIs into React DOM output. It lets a team reuse parts of a React Native interface in a browser, or adopt React Native style components inside an existing web app.

Verdict

Our React Native for Web run passed 715 of 721 tests, with 6 skipped, but npm audit found 43 known vulnerabilities in the installed workspace. Use it when an existing React Native product has enough shared interface code to justify web-specific fixes and browser testing. For a web-first product with little native code, React DOM and ordinary CSS will usually be the simpler boundary.

We ran it

Lab card: what happened when we ran react-native-webScreenshot of react-native-web (necolas.github.io/react-native-web)
Install✓ · 21s1144 packages · 398 MB
Build✓ · 26s
Tests✓ · 21s715 passed · 0 failed · 6 skipped of 721 (jest)
Known vulns435 critical · 24 high · 9 moderate · 5 low (npm audit)
Repo428 files~37,174 lines of source · 2 MB · 4 CI workflows

Answers from our run

Does react-native-web build from source?

Dependencies installed in 21 seconds (1144 packages), and the build succeeded in 26 seconds. We cloned commit f1b5322 into a clean Debian container with 3 CPUs and no project-specific setup.

Do react-native-web's tests pass?

Yes: 715 of 721 passed when we ran the project's own test command (jest). Some failures need services or credentials a bare container does not have.

Does react-native-web have known vulnerabilities in its dependencies?

npm audit flagged 43 known advisories in the dependency tree, including 5 critical at the time of our run.

Who should not use react-native-web?

Teams requiring exact parity with every React Native API: the compatibility guide lists missing, partial, and mocked features.

What are the alternatives to react-native-web?

Expo, Tamagui, Flutter. Our React Native for Web run passed 715 of 721 tests, with 6 skipped, but npm audit found 43 known vulnerabilities in the installed workspace.

Setup4/521-second install; aliases and web-specific code remain your job
Docs4/5Clear setup and compatibility tables, with some aging tool guidance
Community5/522,137 stars and a release published on September 25, 2026
Maturity4/5715 tests passed, though the package remains on a 0.x release line

Discussed on

  1. hnReact Native for Web: Platform-Agnostic Components/APIs of React Native for Web5 points
  2. hnReact Native for Web: A Framework for Building Native Web Apps3 points

Who it’s for

React Native teams adding a web target without rewriting every shared component.
Expo users who want to understand and test the web layer beneath the framework.
Web teams that prefer React Native's component and StyleSheet model over direct HTML and CSS.
Product teams prepared to keep web-specific files for behavior that cannot be shared cleanly.

Who it’s NOT for

Teams requiring exact parity with every React Native API: the compatibility guide lists missing, partial, and mocked features.
CSS-heavy sites that depend on selectors, pseudo-elements, or at-rules inside their component styling system: StyleSheet does not support them directly.
Apps that need RefreshControl or TouchableNativeFeedback on the web: the compatibility table marks both as not started.
Teams expecting Vite server rendering to work without integration testing: open issue #2668 reports module failures in that setup.

Setup reality

Our sandbox install succeeded in 21 seconds, adding 1,144 packages and using 398 MB. The build passed in 26 seconds. Jest then passed 715 tests, failed 0, and skipped 6 out of 721 in 21 seconds. Npm audit reported 43 known vulnerabilities: 5 critical, 24 high, 9 moderate, and 5 low.

An application needs React, React DOM, and react-native-web; the package accepts React 18 or 19. Existing React Native code also needs the bundler to alias react-native to react-native-web. The optional Babel plugin trims unused modules, while Expo handles much of this setup for a universal app.

Shared code still meets browser seams. Some native APIs are missing or mocked, web-specific behavior may need .web.js files, and server rendering depends on the bundler. The audit result covers the installed monorepo workspace, so teams should trace the 43 findings to shipped code before deciding their exposure.

It shares React Native components, not every mobile behavior

React Native for Web is a compatibility layer between React Native and React DOM. Code written with View, Text, Image, TextInput, ScrollView, and other supported exports renders as browser elements. This can preserve component structure and much of the styling logic across native and web targets. It also works in web-only React apps for teams that prefer React Native's component vocabulary.

The package supports React 18 and 19 as peer versions. It converts StyleSheet declarations into CSS classes, reuses identical declarations, and passes suitable accessibility props to HTML and ARIA attributes. Because the output is React DOM, ordinary browser behavior still matters. Keyboard focus, link semantics, scrolling, layout, and server rendering need web tests even when the source component also runs on iOS and Android.

Missing APIs make compatibility a design constraint

The project's compatibility table is candid about the gaps. RefreshControl and TouchableNativeFeedback are marked as not started. KeyboardAvoidingView and StatusBar are mocks because the browser has no direct equivalent, while Animated lacks useNativeDriver support. Image does not cover every native source option, and TextInput lacks some rich-text behavior. Shared code has to stay inside the overlap or branch where the platforms differ.

The guide says React Native for Web is best used with React Native 0.68 or newer. Small differences can use Platform.OS. Larger ones belong in files such as MyComponent.web.js, alongside iOS and Android variants. That escape hatch is healthy: forcing a mobile navigation pattern or scroll interaction into a browser often produces a worse site than writing the web behavior explicitly.

What happened when we ran it

Our sandbox installed 1,144 npm packages in 21 seconds and used 398 MB on disk. The monorepo build succeeded in 26 seconds. This was commit f1b5322 in an unprivileged container with 3 CPUs, 8 GB of RAM, and Node 22. The checkout itself contained 428 files, roughly 37,174 lines of source, and 4 CI workflow files.

Jest finished in 21 seconds with 715 passed, 0 failed, and 6 skipped out of 721 tests. The complete command passed, which makes the checked-out code a credible development base. The repository has no top-level tests directory because tests live beside source modules throughout the workspace.

Npm audit reported 43 known vulnerabilities in the installed tree: 5 critical, 24 high, 9 moderate, and 5 low. That count needs investigation before adoption, even though it does not prove that every advisory reaches a production browser bundle. Our run audited the full development workspace after installing 1,144 packages. A team should trace each finding through the dependency graph, then record which packages ship, run only during builds, or are unreachable.

Setup needs an alias and a browser-aware build

The shortest install adds react-dom and react-native-web. A bundler then aliases the exact react-native import to react-native-web; Jest and any server build need equivalent resolution. The recommended Babel plugin rewrites imports so unused modules can be removed. Expo already uses React Native for Web and is the project's recommended route when you want a universal application without maintaining all of this configuration yourself.

Existing React Native apps still need dependency screening. A third-party native package may ship syntax your web bundler does not compile, call an unavailable native module, or have no browser implementation. The project points users to the React Native Directory for packages with known web support. Its browser guide names Chrome 60+, Safari 10.1+, Edge 12+, and Firefox ESR+, and says applications may need polyfills for several JavaScript and observer APIs.

Open reports mark the web-specific seams

Issue 2668 reports that Vite server rendering hits CommonJS and module-loading errors; it remained open with 14 comments when checked. Issue 2849 reports that the React Native Image src prop was ignored in version 0.21.2 while source={{ uri }} worked. Those are integration gaps, not evidence that client rendering or every image path is broken. They are good candidates for a small acceptance app before a migration begins.

A newer report, issue 2859, describes hanging or freezing on Safari 27 in an app with extensive nested flex layouts. The reporter points to the generated flex: 1 1 0% rule, but the issue has no maintainer resolution yet. Treat it as a browser-specific report to reproduce against your layouts, not as a settled diagnosis. Mobile Safari and desktop Safari deserve a place in the release matrix for any serious React Native for Web product.

Version 0.21.3 shipped with three targeted fixes

Release 0.21.3 was published on September 25, 2026, the same date as the repository's last push. GitHub showed 22,137 stars, 116 open issues, and 33 open pull requests when fetched. Recent code and issue activity show that the project is maintained; the 149 combined issues and pull requests also give adopters plenty of current edge cases to inspect.

The release stopped new Image callback functions from aborting and restarting an image load, changed useColorScheme to subscribe once per component, and exported InputAccessoryView from the package entry. These are narrow compatibility and behavior fixes rather than a promise of full native parity. Version 0.21.3 is a good fit when shared React Native code is the asset you are protecting. If browser behavior leads the product, build that behavior directly and share lower-level logic instead.

Alternatives

ProjectWhat it isPick it when
Expo gh↗A universal React framework that configures React Native web support along with native tooling.pick this instead when you want a managed application framework and do not want to wire the web bundler yourself.
TamaguiA cross-platform React styling system and optional component kit with an optimizing compiler.pick this instead when shared design-system components and compiled styles matter more than mirroring the React Native core API.
Flutter gh↗A Dart framework for building mobile, web, and desktop interfaces from one codebase.pick this instead when you are starting fresh, accept Dart, and want one rendering framework across platforms rather than React DOM output.

What people are saying

  1. [velocity-scout] necolas/react-native-web

Sources

  1. React Native for Web repository
  2. React Native for Web package README
  3. React Native compatibility guide
  4. React Native for Web setup guide
  5. React Native for Web 0.21.3 release
  6. Issue 2668: Vite in an SSR context
  7. Issue 2859: Safari 27 flex performance report
  8. Issue 2849: Image src prop report

More web reviews

vega-app · actix-web · FxEmbed · cloudflare-turnstile-examples · react-spring · You-Dont-Need-jQuery · the whole board →