ReactNative篇 | 跨端方案
前言
后面三章,我们会从底层架构到动态化能力,把 React Native 作为一个移动端跨端方案拆解得比较透。但在真实的技术选型中,面试官或者你的 leader 可能会问一个更大的问题:
“跨端方案这么多,RN、Flutter、Taro、uni-app、Electron……你怎么选?凭什么选 RN 不选别的?”
这个问题的背后,其实是在考察你的技术视野和决策能力。你需要了解各个方案的定位、原理、优劣势,才能在具体的业务场景下做出合理的选择。
更进一步,如果你的业务不止是”一套代码跑 iOS 和 Android”,还想跑在 Web、小程序、甚至桌面端呢?RN 有 react-native-web、Taro 有小程序支持、Electron 打桌面——这些方案之间是什么关系?能不能组合使用?
本章就从跨端全景出发,先给各种方案画个地图,然后聚焦 RN 的跨端扩展能力(Web、小程序、桌面),最后给出一个技术选型决策框架,帮你在面试和实际项目中做出有理有据的选择。
诊断自测
Q1:RN 和 Flutter 最本质的区别是什么?不是说”一个用 JS 一个用 Dart”,而是从渲染原理的角度。
点击查看答案
最本质的区别在于渲染方式:
- RN 使用平台原生的 UI 组件进行渲染。
<View>对应 iOS 的UIView、Android 的android.view.View。最终渲染出来的是真正的原生控件。 - Flutter 使用自己的渲染引擎(Skia/Impeller),自己在 Canvas 上绘制所有 UI。它不使用任何平台原生控件,而是从像素级别自己画。
这个区别导致了一系列差异:Flutter 的 UI 一致性更强(因为不依赖原生控件),但和平台原生 UI 的融合性不如 RN(因为不是原生控件)。
Q2:react-native-web 是什么?它的原理是什么?
点击查看答案
react-native-web 是一个库,它将 React Native 的核心组件(View、Text、Image 等)映射为对应的 Web DOM 元素和 CSS 样式。这样你就可以用 RN 的 API 编写组件,同时在 Web 端运行。
原理上,它不是在浏览器里嵌入一个 RN 运行时,而是重新实现了一套 RN 组件的 Web 版本。比如 <View> 在 Web 端渲染为 <div>,<Text> 渲染为 <span>,StyleSheet 转换为 CSS-in-JS。它是 RN 组件 API 的一个平台实现层。
Q3:Taro、uni-app 和 RN 在定位上有什么不同?
点击查看答案
定位不同:
- RN 的核心定位是移动端跨平台(iOS + Android),通过社区扩展可以到 Web 和桌面
- Taro 的核心定位是小程序跨端 + Web,后来扩展了对 RN 的支持,让你用一套代码也能出 App
- uni-app 的核心定位也是小程序 + H5 + App,它的 App 端底层可以选择 WebView 或 Native 渲染
简单说:RN 是”从 App 出发往 Web 走”,Taro/uni-app 是”从小程序/Web 出发往 App 走”。出发点不同,优势领域也不同。
一、跨端方案全景
在深入 RN 的跨端能力之前,先建立一个全局视角。当前主流的跨端方案可以按目标平台和渲染方式来分类。
1.1 按目标平台分类
移动端(iOS + Android)
├── React Native(JS → 原生组件)
├── Flutter(Dart → 自绘引擎)
├── Weex(JS → 原生组件,已式微)
└── Kotlin Multiplatform(共享逻辑层,UI 各写各的)
小程序端(微信/支付宝/字节/百度等)
├── Taro(React/Vue → 各平台小程序)
├── uni-app(Vue → 各平台小程序 + H5 + App)
├── Remax(React → 小程序,已停更)
└── mpvue / wepy(早期方案,已式微)
桌面端(Windows + macOS + Linux)
├── Electron(Web 技术 → 桌面 App)
├── Tauri(Web 前端 + Rust 后端 → 桌面 App)
├── Flutter Desktop(Dart → 桌面 App)
└── react-native-windows / react-native-macos
Web 端
├── 各类 Web 框架(React / Vue / Angular 等)
├── react-native-web(RN 组件 → Web)
└── Flutter Web(Dart → Canvas/DOM)
1.2 按渲染方式分类
| 渲染方式 | 代表方案 | 优势 | 劣势 |
|---|---|---|---|
| 原生渲染 | RN、Weex | 性能好,原生体验 | 平台差异多,UI 一致性弱 |
| 自绘渲染 | Flutter | UI 一致性强,性能优秀 | 包体积大,平台融合弱 |
| WebView 渲染 | Cordova、Ionic | 开发门槛最低 | 性能最差,体验与原生差距大 |
| 编译转换 | Taro、uni-app | 一套代码多端小程序 | 受限于各端能力交集 |
| 混合方案 | uni-app(App 端) | 灵活 | 复杂度高 |
1.3 核心方案对比
| 维度 | React Native | Flutter | Taro | uni-app | Electron |
|---|---|---|---|---|---|
| 开发语言 | JavaScript/TS | Dart | JS/TS(React/Vue) | Vue | JS/TS |
| 渲染方式 | 原生组件 | 自绘引擎 | 编译转换 | 编译转换 / WebView | Chromium |
| 核心平台 | iOS + Android | iOS + Android | 小程序 + Web | 小程序 + H5 + App | 桌面 |
| 动态化 | 天然支持 | 非常困难 | Web 天然支持 | Web 天然支持 | Web 天然支持 |
| 生态 | 极其丰富 | 快速增长 | 国内活跃 | 国内活跃 | 极其丰富 |
| 学习成本 | 低(会 React 即可) | 中(需学 Dart) | 低(会 React/Vue 即可) | 低(会 Vue 即可) | 低(Web 技术栈) |
| 包体积 | 较大 | 较大 | 小 | 小 | 很大 |
二、RN 跨 Web:react-native-web
对于已经有 RN App 的团队,如果还想出一个 Web 版本(H5 / PC Web),react-native-web 是最自然的选择。
2.1 原理
react-native-web 的原理并不复杂:它重新实现了 RN 的核心组件和 API 的 Web 版本。
React Native 组件 react-native-web 映射 Web 渲染
<View> → <div> DOM 元素
<Text> → <span> / <div> DOM 元素
<Image> → <img> DOM 元素
<ScrollView> → <div style="overflow:auto"> DOM + CSS
<TextInput> → <input> / <textarea> DOM 元素
StyleSheet.create → CSS-in-JS 内联样式 / CSS
Animated → requestAnimationFrame / CSS Web 动画
在 Webpack/Metro 的配置中,通过 alias 把 react-native 的引用重定向到 react-native-web:
// webpack.config.js
module.exports = {
resolve: {
alias: {
'react-native$': 'react-native-web'
}
}
};
这样你在代码中写 import { View, Text } from 'react-native',在 Web 打包时实际加载的是 react-native-web 的实现。
2.2 什么能跨、什么不能跨
能跨的:
- RN 核心组件(View、Text、Image、ScrollView、FlatList 等)
- StyleSheet 和 Flexbox 布局
- Animated API(大部分)
- 纯 JS 逻辑(状态管理、网络请求、工具函数等)
不能跨的:
- Native Modules(相机、蓝牙、文件系统等依赖原生能力的模块)
- 依赖 Native 代码的第三方库(如
react-native-maps、react-native-camera) - 部分平台特定的 API(
StatusBar、PermissionsAndroid等)
2.3 实战中的处理方式
对于不能跨的部分,通常用平台文件分割来处理:
src/
components/
Camera/
Camera.native.tsx ← iOS / Android 使用
Camera.web.tsx ← Web 使用
index.tsx ← 统一导出
Metro 和 Webpack 都支持平台后缀解析:.native.tsx 会在 RN 打包时被选中,.web.tsx 会在 Web 打包时被选中。
// Camera.native.tsx
import { RNCamera } from 'react-native-camera';
export const Camera = () => <RNCamera />;
// Camera.web.tsx
export const Camera = () => (
<video autoPlay ref={/* getUserMedia */} />
);
2.4 谁在用?
react-native-web 最知名的使用者是 Twitter(现 X)的 Web 版。Twitter 的移动端用 RN 开发,Web 版用 react-native-web 渲染,实现了大量组件代码的跨端复用。
Meta 的一些内部项目也在使用。这个项目的维护者 Nicolas Gallagher 就是 Twitter 的工程师(后加入 Meta)。
三、RN 跨小程序:Taro 的 RN 支持
在国内的业务场景中,小程序是绕不开的平台。很多团队的需求是”App + 小程序 + H5”三端覆盖。
3.1 Taro 的定位
Taro 是京东开源的跨端框架,它的核心能力是一套 React/Vue 代码编译到多个小程序平台和 Web。从 Taro 3.0 开始,它也支持了 RN 端的输出。
Taro 代码(React 语法)
├── 编译 → 微信小程序
├── 编译 → 支付宝小程序
├── 编译 → 字节小程序
├── 编译 → H5 (Web)
└── 编译 → React Native App
3.2 Taro → RN 的原理
Taro 编译到 RN 的原理是:将 Taro 组件映射为 RN 组件。
Taro 定义了一套自己的组件体系(<View>、<Text>、<Image> 等,名字和 RN 很像但不完全相同),在编译到 RN 时,这些组件被映射为对应的 RN 原生组件。
Taro <View> → RN <View>
Taro <Text> → RN <Text>
Taro <Image> → RN <Image>
Taro <Input> → RN <TextInput>
Taro <Swiper> → RN <ScrollView> + 自定义逻辑
3.3 限制和取舍
Taro 的设计哲学是取各平台能力的交集。这意味着:
- 你只能使用 Taro 支持的组件和 API,不能直接使用 RN 特有的组件
- 如果某个功能在小程序上不存在,Taro 通常也不会支持
- RN 端的性能和开发体验不如直接用 RN
适用场景: 你的业务需要同时覆盖小程序和 App,且 UI 和交互比较标准化。如果你的 App 需要大量定制化的原生交互(复杂动画、手势、原生 SDK 集成),Taro 的 RN 端可能力不从心。
3.4 实际项目中的策略
很多团队的策略是分层复用,而不是强求一码多端:
纯业务逻辑层(数据处理、API 调用、状态管理)
→ 完全复用,跨所有端
UI 组件层
→ 尽量复用,通过 Taro 组件体系映射
→ 差异大的部分,按平台分别实现
平台特有层(原生能力、平台 API)
→ 完全不复用,各端独立实现
四、RN 跨桌面:react-native-windows / macos
RN 不止能跑在手机上。微软维护了 react-native-windows 和 react-native-macos,让 RN 可以在桌面端运行。
4.1 react-native-windows
由微软官方团队维护,用于构建 Windows 桌面应用。
技术实现:
- 使用 WinUI / XAML 作为原生 UI 层(类比 RN 在 iOS 上使用 UIKit)
- 支持 UWP 和 Win32 两种应用模型
- 可以访问 Windows 特有的 API(任务栏、通知中心、文件系统等)
使用场景:
- 已有 RN 移动端 App,想扩展到 Windows
- 需要构建内部工具类桌面应用
- 微软自己的一些产品(如 Xbox、Office 的部分功能)就用了这个方案
4.2 react-native-macos
同样由微软维护(是的,微软),用于构建 macOS 桌面应用。
技术实现:
- 使用 AppKit 作为原生 UI 层(macOS 的原生 UI 框架)
- 大部分 RN 核心组件都有对应的 macOS 实现
4.3 桌面端的现实考量
虽然技术上可行,但 RN 桌面端方案的成熟度和 Electron 还有差距:
| 维度 | RN Windows/macOS | Electron |
|---|---|---|
| 生态成熟度 | 一般,第三方库支持有限 | 极其成熟,生态丰富 |
| 性能 | 好(原生渲染) | 一般(Chromium 内核) |
| 包体积 | 较小 | 很大(100MB+) |
| 开发体验 | 需要配置原生开发环境 | 纯 Web 技术栈,门槛极低 |
| 适用场景 | 性能敏感的桌面应用 | 快速交付的桌面工具 |
面试中的回答思路: 如果只是需要快速出一个桌面版,Electron 依然是最省事的选择。RN 桌面端更适合”已有 RN 移动端代码基础,想最大化代码复用”的场景。
五、一码多端的理想与现实
“Write once, run everywhere”是跨端方案的终极愿景。但实际情况远没有这么美好。
5.1 理想中的一码多端
一份代码 → iOS App + Android App + Web + 小程序 + 桌面
5.2 现实中的挑战
挑战一:交互范式差异
手机上的交互是触摸,桌面上是鼠标 + 键盘,小程序有自己的导航逻辑。一个”返回”操作,在 iOS 上是左滑手势,在 Android 上是物理返回键,在 Web 上是浏览器后退,在小程序上是左上角返回按钮。你没法用一套交互逻辑覆盖所有平台。
挑战二:UI 设计规范差异
iOS 用 HIG(Human Interface Guidelines),Android 用 Material Design,Web 有自己的响应式布局规范。“一码多端”最容易出现的问题是:App 看起来还行,Web 端看起来像个放大版的手机页面。
挑战三:平台能力差异
手机有相机、GPS、陀螺仪,桌面有文件系统、多窗口,小程序有自己的支付和分享 API。你不可能在所有平台上提供完全相同的功能。
挑战四:性能特征差异
手机的内存和 CPU 有限,Web 受浏览器沙箱限制,桌面端资源相对充裕。同一套代码在不同平台上的性能表现可能完全不同。
5.3 务实的策略
经过行业多年的实践,大家逐渐形成了一个共识:
一码多端不是目标,最大化代码复用才是目标。
具体策略是分三层来做复用:
┌───────────────────────────────┐
│ 业务逻辑层(80%+ 复用) │ 数据模型、API 调用、状态管理
│ → 所有平台完全共用 │ 校验逻辑、工具函数
├───────────────────────────────┤
│ UI 组件层(50-70% 复用) │ 按平台适配交互和布局
│ → 基础组件跨端,复杂组件分端 │ 响应式设计
├───────────────────────────────┤
│ 平台特有层(0% 复用) │ 原生能力、平台 API
│ → 各端独立实现 │ 导航方式、生命周期
└───────────────────────────────┘
80/20 法则在跨端开发中非常适用:花 20% 的精力做好分层设计,就能获得 80% 的代码复用率。剩下 20% 的平台特有代码,老老实实各写各的。
六、技术选型决策框架
面试中最有含金量的回答,不是”RN 好”或”Flutter 好”,而是展示你的决策过程。下面给出一个系统化的决策框架。
6.1 第一步:明确目标平台
首先确定你的产品需要覆盖哪些平台:
| 目标平台 | 推荐方案 |
|---|---|
| 只有 iOS + Android | RN 或 Flutter |
| iOS + Android + Web | RN + react-native-web,或 Flutter(Web 支持渐成熟) |
| iOS + Android + 小程序 | Taro(如果小程序是主力)或 RN + 小程序独立开发 |
| iOS + Android + 小程序 + Web | Taro / uni-app(全端覆盖),或 RN + Taro 组合 |
| 桌面端 | Electron(快速交付)或 Tauri(性能优先) |
| 全平台 | 没有银弹,分层设计 + 组合方案 |
6.2 第二步:评估业务特征
| 业务特征 | 倾向方案 | 原因 |
|---|---|---|
| 需要频繁热更新 | RN | 天然支持动态化 |
| UI 交互复杂(大量动画、手势) | Flutter 或 Native | 自绘引擎 / 原生性能天花板高 |
| 团队是 React 技术栈 | RN / Taro | 学习成本最低 |
| 团队是 Vue 技术栈 | uni-app / Taro | 支持 Vue 语法 |
| 需要深度集成原生 SDK | RN 或 Native | RN 有成熟的 Native Module 生态 |
| 对包体积敏感 | RN(相对较好)或 Native | Flutter 和 Electron 包体积大 |
| 对 UI 一致性要求高 | Flutter | 自绘引擎,跨平台 UI 完全一致 |
| 小程序是核心渠道 | Taro / uni-app | 这是它们的主战场 |
6.3 第三步:评估团队因素
技术选型不只是技术问题,团队因素同样重要:
- 团队规模:小团队优先选学习成本低的方案(RN/Taro/uni-app),大团队可以投入 Flutter 或 Native
- 招聘难度:RN 开发者(会 React 的前端工程师)好招,Flutter 开发者相对少
- 现有技术栈:如果团队已经有 React/Vue 的积累,选对应的跨端方案能最大化复用经验
- 维护成本:跨端方案的长期维护成本(升级框架、适配新系统版本、处理兼容性问题)需要纳入考量
6.4 决策矩阵示例
假设你是一个电商 App 的技术负责人,需要支持 iOS + Android + 微信小程序 + H5,团队是 React 技术栈,需要频繁热更新。
评估维度 权重 RN+Web Taro Flutter uni-app
──────────────────────────────────────────────────────────────
移动端性能 20% 8/10 6/10 9/10 5/10
小程序支持 25% 3/10 9/10 1/10 9/10
动态化能力 20% 10/10 7/10 2/10 7/10
团队匹配度 15% 9/10 8/10 4/10 5/10
Web 端支持 10% 8/10 8/10 5/10 8/10
生态成熟度 10% 9/10 7/10 8/10 6/10
──────────────────────────────────────────────────────────────
加权得分 7.35 7.55 4.35 6.70
在这个场景下,Taro 的得分最高——因为小程序权重高,而 Taro 的小程序能力远超 RN。但如果你把小程序的权重降低(比如小程序只是辅助渠道),RN + react-native-web 可能更优。
面试中怎么回答: 不要说”我觉得 XX 好”,而是说”要看具体场景”,然后展示你的决策过程。即使最终没有给出一个确定答案,面试官也能看出你有系统化的思考能力。
常见误区
误区一:“跨端方案一定比 Native 开发效率高”
不一定。跨端方案节省的是”两端各写一遍”的重复工作,但它也引入了新的成本:学习框架、处理跨端兼容性、踩各种坑、升级维护。对于功能简单的 App,跨端确实省事。但对于功能复杂、需要大量原生交互的 App,跨端方案引入的额外复杂度可能反而拖慢进度。有一个经验法则:如果你的 App 有超过 30% 的功能需要写原生代码,跨端方案的优势就开始减弱了。
误区二:“Flutter 性能一定比 RN 好”
这个说法过于笼统。在渲染性能上,Flutter 的自绘引擎确实有优势(特别是复杂动画和大量自定义 UI)。但在启动速度上,RN(使用 Hermes 引擎)不一定比 Flutter 慢。在内存占用上,两者各有优劣取决于具体场景。更重要的是,新架构(Fabric + JSI)大幅提升了 RN 的渲染性能,很多以前 RN 明显输给 Flutter 的场景现在差距已经不大了。性能比较应该基于具体场景的 benchmark,而不是泛泛而谈。
误区三:“Taro / uni-app 能完美覆盖所有端”
这些框架确实能编译到多个平台,但输出的质量参差不齐。通常在小程序端表现最好(这是它们的核心),H5 端也不错,但到了App 端(通过 RN 或原生 WebView),体验会有明显下降。“能运行”和”体验好”是两回事。如果你的 App 端需要和原生 App 竞争用户体验,Taro/uni-app 的 App 输出可能不够。
误区四:“选了一个方案就要全部用它”
这是一种很常见的思维惯性。实际上,组合使用多个方案是完全合理的。比如:
- 核心交易流程用 RN 开发(保证性能和稳定性)
- 运营活动页用 H5(快速上线和更新)
- 小程序用 Taro 独立开发(这是它的强项)
- 桌面管理后台用 Electron 或纯 Web
不同的业务模块根据自身特点选择最合适的技术方案,比强行用一个方案覆盖所有场景更务实。
小结
本章从跨端方案的全景出发,梳理了 RN 的跨端扩展能力,并给出了一个系统化的技术选型框架。
核心要点
- 跨端全景:移动端(RN/Flutter)、小程序端(Taro/uni-app)、桌面端(Electron/Tauri)、Web 端,各有所长
- RN 跨 Web:react-native-web 将 RN 组件映射为 Web DOM,核心组件和样式可复用,Native Module 不可复用
- RN 跨小程序:通过 Taro 间接支持,适合标准化 UI,复杂交互受限
- RN 跨桌面:react-native-windows/macos 由微软维护,适合已有 RN 代码基础的团队
- 一码多端的现实:100% 复用不可能,分层设计(逻辑层 80%+ / UI 层 50-70% / 平台层各自实现)是务实策略
- 技术选型:先定平台、再看业务特征、最后考虑团队因素,用决策矩阵量化比较
记忆口诀
跨端选型三步走:先看去哪(平台),再看干啥(业务),最后看谁干(团队)。
本章思维导图
- 跨端全景
- 移动端:RN、Flutter、KMP
- 小程序:Taro、uni-app
- 桌面端:Electron、Tauri、RN Windows/macOS
- Web 端:react-native-web、Flutter Web
- 渲染方式:原生渲染 / 自绘渲染 / WebView / 编译转换
- RN 跨 Web
- react-native-web:RN 组件 → DOM 元素
- 能跨:核心组件、样式、纯 JS 逻辑
- 不能跨:Native Modules、平台特有 API
- 处理方式:平台文件分割(.native.tsx / .web.tsx)
- RN 跨小程序
- Taro 3.0+ 支持 RN 输出
- 取各平台能力交集
- 适合标准化 UI,复杂交互受限
- RN 跨桌面
- react-native-windows(微软维护,WinUI/XAML)
- react-native-macos(微软维护,AppKit)
- 成熟度不及 Electron,但性能和包体积更优
- 一码多端的现实
- 100% 复用不可能
- 分层策略:逻辑层(80%+)/ UI 层(50-70%)/ 平台层(各自实现)
- 交互范式、设计规范、平台能力、性能特征的差异
- 技术选型决策框架
- 第一步:明确目标平台
- 第二步:评估业务特征(动态化、UI 复杂度、原生集成度)
- 第三步:评估团队因素(规模、技术栈、招聘)
- 决策矩阵:量化各维度权重和得分
练习挑战
第一题 ⭐(基础):方案匹配
请为以下三个项目分别推荐最合适的跨端方案,并简要说明理由:
- 一个内部使用的 CRM 管理工具,需要在 PC 浏览器和手机上使用
- 一个社交类 App,需要覆盖 iOS + Android,有大量的动画和手势交互
- 一个电商促销活动页面,需要同时在微信小程序、支付宝小程序和 H5 上线
点击查看答案
-
CRM 管理工具 → 响应式 Web(React/Vue) 理由:作为内部工具,PC 浏览器是主要使用场景,手机上也只需要浏览器访问即可。不需要 App 的原生能力,用响应式 Web 开发成本最低、迭代最快。没必要上跨端框架。
-
社交类 App → Flutter 或 RN(新架构) 理由:大量动画和手势交互对渲染性能要求高。Flutter 的自绘引擎在动画性能上有天然优势。RN 新架构 +
react-native-reanimated也能达到接近的效果。如果团队是 React 技术栈选 RN,否则 Flutter 更合适。不推荐 Taro/uni-app,因为它们的 App 端性能不足以支撑复杂交互。 -
电商促销活动页 → Taro 理由:核心需求是多端小程序 + H5,这是 Taro 的主战场。促销活动页通常 UI 标准化、迭代快速、生命周期短,Taro 的一码多端能力可以大幅提高效率。不需要 RN 或 Flutter。
第二题 ⭐⭐(进阶):架构设计
你的公司有一个成熟的 RN App(iOS + Android),现在需要新增 Web 端(PC + Mobile Web)。你会怎么设计跨端架构?请画出分层结构,并说明每一层的复用策略。
点击查看答案
分层架构:
┌─────────────────────────────────────────┐
│ Layer 1: 共享业务逻辑层 (100% 复用) │
│ - API 调用模块(axios/fetch 封装) │
│ - 状态管理(Redux/Zustand store) │
│ - 数据模型和校验逻辑 │
│ - 工具函数(格式化、计算、加密等) │
│ - 业务规则(权限判断、流程控制等) │
├─────────────────────────────────────────┤
│ Layer 2: 跨端 UI 组件层 (70% 复用) │
│ - 基础组件:Button, Input, Card 等 │
│ → 使用 react-native-web 跨端 │
│ - 列表组件:FlatList / 虚拟列表 │
│ → RN 和 Web 各有优化实现 │
│ - 布局组件:用 Flexbox,两端通用 │
├─────────────────────────────────────────┤
│ Layer 3: 平台适配层 (各端独立) │
│ - 导航系统: │
│ RN: @react-navigation │
│ Web: react-router-dom │
│ - 存储: │
│ RN: AsyncStorage │
│ Web: localStorage │
│ - 原生能力: │
│ RN: Native Modules (相机、推送等) │
│ Web: Web API (Notification, Camera等) │
│ - 响应式适配: │
│ Web: 需要处理 PC 和 Mobile 的响应式布局 │
│ RN: 已经是移动端,不需要 │
└─────────────────────────────────────────┘
打包配置:
// metro.config.js (RN 端)
// 正常 RN 配置,无需特殊处理
// webpack.config.js (Web 端)
module.exports = {
resolve: {
alias: { 'react-native$': 'react-native-web' },
extensions: ['.web.tsx', '.tsx', '.web.ts', '.ts', '.web.js', '.js']
}
};
文件命名规范:
src/
shared/ ← Layer 1: 100% 共享
api/
stores/
utils/
components/ ← Layer 2: 尽量共享
Button/
Button.tsx ← 跨端共享
Camera/
Camera.native.tsx ← RN 独有
Camera.web.tsx ← Web 独有
screens/ ← Layer 3: 按平台分
HomeScreen.tsx ← 共享 UI
HomeScreen.web.tsx ← Web 特有适配
navigation/
AppNavigator.native.tsx ← RN 路由
AppRouter.web.tsx ← Web 路由
第三题 ⭐⭐⭐(综合):技术选型答辩
你的面试官问:“我们是一家出行公司,要做一个打车 App。需要覆盖 iOS、Android、微信小程序。有实时地图、司机端/乘客端、聊天功能。团队 10 人,5 个前端(React 技术栈)、3 个后端、2 个测试。你推荐用什么技术方案?为什么?”
请给出完整的技术选型方案和理由。
点击查看答案
推荐方案:RN(App 端)+ 原生小程序(微信端)
为什么不用 Taro 一码三端?
打车 App 有两个特殊需求让 Taro 不太合适:
- 实时地图:需要频繁操作原生地图组件,涉及大量的手势交互和实时位置更新。Taro 的 RN 端对这种重度原生交互的支持不够好。
- 性能要求高:打车场景中,地图的流畅度和实时性直接影响用户体验和安全。App 端必须保证原生级别的性能。
为什么 App 端选 RN 而不是 Flutter?
- 团队匹配:5 个前端都是 React 技术栈,上手 RN 成本极低,选 Flutter 要重新学 Dart
- 动态化:打车 App 需要频繁调整定价策略、活动配置等,RN 的热更新能力很重要
- 地图 SDK 集成:RN 有成熟的地图库(react-native-maps),Native Module 生态丰富
- 双端共用:司机端和乘客端的业务逻辑(订单状态机、聊天模块、支付流程)可以大量复用
为什么微信小程序单独开发而不是用 Taro?
- 微信小程序有自己成熟的地图组件和定位 API,原生开发体验最好
- 小程序功能通常是 App 的简化版(乘客端),不需要完整的功能对等
- 团队只有 5 个前端,小程序原生开发 1-2 人就够了,不值得为了复用而引入 Taro 的复杂度
人员分配建议:
RN App(司机端 + 乘客端):3 个前端
- 共享:订单模块、聊天模块、支付模块、用户模块
- 差异:司机端有接单界面和导航,乘客端有叫车和评价
微信小程序(乘客端简化版):1 个前端
管理后台(Web):1 个前端
后端:3 人
测试:2 人
关键提示: 面试中给出这样的回答,重要的不是结论本身(不同人可能有不同的合理选择),而是你的思考过程——你考虑了业务需求、技术特点、团队现状、成本投入,然后做出了有理有据的选择。
自我检测
读完本章后,对照下面的清单检验一下自己的掌握程度:
- 能画出跨端方案的全景图:移动端、小程序端、桌面端各有哪些方案,它们的渲染方式是什么
- 能解释 RN 和 Flutter 在渲染原理上的本质区别(原生组件 vs 自绘引擎)
- 能说出 react-native-web 的原理:如何将 RN 组件映射为 Web DOM,什么能跨什么不能跨
- 能说清楚 Taro 的 RN 支持是怎么工作的,以及它的局限性
- 能解释”一码多端”为什么是个理想,分层复用的策略是什么
- 能使用技术选型决策框架(目标平台 → 业务特征 → 团队因素)分析具体的选型问题
- 能在面试中给出有理有据的技术选型建议,而不是简单地说”我推荐 XX”
- 理解”组合使用多个方案”比”用一个方案覆盖所有”更务实
购买课程解锁全部内容
大厂前端面试通关:71 篇构建完整知识体系
¥89.90