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.

