React Native(RN)和 React(通常指 React DOM)同属 Meta(原 Facebook)开发的技术体系,核心共享组件化思想、JSX 语法、虚拟 DOM、状态管理逻辑,但定位、应用场景和底层实现差异显著。以下从核心维度拆解两者的区别,并补充关联与选型建议:
Taimili 艾米莉 ( 一款专业的 GitHub star 管理和github 加星涨星工具taimili.com )
艾米莉 是一款优雅便捷的 GitHub star 管理和github 加星涨星工具,基于 PHP & javascript 构建, 能对github 得 star fork follow watch 管理和提升,最适合github 的深度用户

一、核心定位与目标:解决不同场景的 UI 开发问题
| 维度 | React(React DOM) | React Native |
|---|---|---|
| 核心目标 | 构建Web 端(浏览器)的交互式 UI | 构建跨平台移动端(iOS/Android)原生应用 |
| 本质 | 前端 UI 库(仅关注视图层) | 跨平台移动开发框架(基于 React,封装原生能力) |
| 运行环境 | 浏览器(解析 HTML/CSS/JS) | 移动端操作系统(iOS/Android 原生运行时) |
简单来说:React 是 "Web 端 UI 解决方案",React Native 是 "用 React 语法写原生 App 的工具"------ 最终产出物前者是网页,后者是可安装的 iOS/Android 应用(.ipa/.apk)。
二、核心差异:从渲染到开发的全链路区别
1. 渲染机制:虚拟 DOM → 不同的最终渲染产物
- React(Web) :编写的 JSX 会被编译为
React.createElement,最终通过虚拟 DOM 对比,渲染成浏览器可识别的HTML 元素 (如<div>、<span>、<button>),样式依赖 CSS/CSS-in-JS 控制。例:<div>Hello</div>→ 浏览器渲染为 HTML DOM 节点。 - React Native :JSX 同样编译为
React.createElement,但虚拟 DOM 不会渲染为 HTML,而是通过JS 桥接层 (JS Bridge)调用移动端原生组件 API,最终渲染成iOS/Android 原生控件 (而非 WebView):例:<View>Hello</View>→ iOS 渲染为UIView,Android 渲染为android.view.View;<Text>→ iOSUILabel/AndroidTextView。✨ 关键优势:RN 渲染的是 "原生组件",而非网页,因此体验接近原生 App(区别于 Cordova/PhoneGap 等 WebView 套壳方案)。
2. 组件体系:Web 标签 vs 原生组件映射
React 的核心是 "自定义组件封装 HTML 标签",RN 则是 "自定义组件封装原生控件",两者的基础组件完全不同:
| React(Web)基础组件 | React Native 对应组件 | 原生映射(示例) |
|---|---|---|
<div>/<section> |
<View> |
iOS UIView / Android View |
<p>/<span> |
<Text> |
iOS UILabel / Android TextView |
<button> |
<TouchableOpacity>/<TouchableHighlight> |
iOS UIButton / Android Button |
<img> |
<Image> |
iOS UIImageView / Android ImageView |
<input> |
<TextInput> |
iOS UITextField / Android EditText |
⚠️ 注意:RN 中不能直接使用 HTML 标签 (如写<div>会报错),也没有<a>标签(需用Linking API 实现跳转)。
3. 样式与布局:无 CSS,适配移动端特性
-
React(Web) :支持完整 CSS 生态(内联样式、CSS 文件、SCSS、CSS Modules、Styled Components 等),布局依赖 Flexbox/Grid/ 定位,单位用 px/rem/vw 等。
-
React Native :✅ 仅支持内联样式 (或
StyleSheet.create封装),无 CSS 文件 / 选择器 / 伪类(如:hover);✅ 布局仅支持 Flexbox(RN 的 Flexbox 有细微差异,如默认flexDirection: column);✅ 单位:无 px,默认用 "dp/pt"(自适应屏幕密度),可通过PixelRatio适配;✅ 样式属性:采用驼峰命名(如backgroundColor而非background-color,fontSize而非font-size)。示例:
jsx
less// React(Web)样式 <div style={{ color: 'red', fontSize: '16px' }}>Hello</div> // React Native样式 <Text style={styles.text}>Hello</Text> const styles = StyleSheet.create({ text: { color: 'red', fontSize: 16 } // 无单位,默认pt });
4. 交互与事件:适配移动端操作
- React(Web) :事件基于浏览器 DOM 事件(
onClick、onMouseOver、onScroll等),支持鼠标 / 键盘交互。 - React Native :无 DOM 事件,事件体系适配移动端:✅ 点击事件:无
onClick,需用onPress(绑定到 Touchable 系列组件);✅ 移动端专属事件:onScroll(滚动)、onSwipe(滑动)、onLongPress(长按);✅ 无鼠标 / 键盘事件(需适配移动端输入方式)。
5. 开发环境与依赖
- React(Web) :依赖 Node.js + 打包工具(Webpack/Vite),运行在浏览器,调试用 Chrome DevTools;核心依赖:
react+react-dom。 - React Native :需配置移动端开发环境(iOS 需 Xcode,Android 需 Android Studio),调试用 RN DevTools/Chrome 调试 JS + 原生调试工具;核心依赖:
react+react-native(无需react-dom);额外依赖:原生桥接库(如react-native-reanimated处理动画)、第三方原生模块(如相机 / 支付)。
6. 性能优化:侧重点不同
- React(Web) :优化重点是 "减少 DOM 重绘"(如
memo/useMemo/useCallback、虚拟列表react-window)、首屏加载(SSR/CSR)。 - React Native :优化重点是 "减少 JS 桥接开销"(如
useNativeDriver: true开启原生动画)、避免频繁跨线程通信、原生模块性能优化;痛点:复杂列表需用FlatList(而非 Web 的map渲染),否则易出现卡顿。
三、核心关联:共享的 React 核心能力
RN 本质是 React 的 "移动端实现",因此完全共享 React 的核心特性:
- 语法层 :JSX、组件化(函数组件 / 类组件)、Props/State、Hooks(
useState/useEffect/useContext等); - 状态管理:Redux、Zustand、MobX、React Query 等生态完全通用;
- 思想层:单向数据流、虚拟 DOM、声明式编程(而非命令式);
- 代码复用:纯逻辑组件(无 UI)可在 React Web 和 RN 之间直接复用(如工具函数、状态逻辑)。
四、选型建议:什么时候用 React?什么时候用 RN?
| 选择 React(Web) | 选择 React Native |
|---|---|
| 开发网页 / 小程序(如微信小程序基于 React 语法的 Taro) | 开发跨平台 iOS/Android 原生 App,且希望一套代码多端运行 |
| 需兼容多浏览器、依赖 Web 生态(如前端框架生态:Next.js) | 追求接近原生的移动端体验,且降低 iOS/Android 双端开发成本 |
| 快速迭代 Web 产品,无需原生应用分发(应用商店审核) | 需上架 App Store / 应用宝,且无重度原生功能(如 AR / 复杂蓝牙) |
⚠️ 补充:如果需要 "一套代码覆盖 Web + 移动端",可考虑基于 React 的跨端框架(如 Taro、Remax),但体验通常略逊于 RN 的纯移动端实现;如果需重度原生功能(如相机算法、支付 SDK),RN 需结合原生开发(Swift/Kotlin),或直接选择原生开发。
总结
| 核心维度 | React | React Native |
|---|---|---|
| 最终产物 | Web 网页 | iOS/Android 原生 App |
| 渲染目标 | HTML DOM | 原生移动端组件 |
| 基础组件 | HTML 标签 | View/Text/Touchable 等 |
| 样式 | 完整 CSS 生态 | StyleSheet+Flexbox |
| 事件 | DOM 事件(onClick) | 移动端事件(onPress) |
| 核心依赖 | react + react-dom | react + react-native |
简单记:React 管 Web,RN 管移动端;语法相通,底层渲染和生态完全不同。`