跳到主要内容
预计阅读 45 分钟

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 一致性弱
自绘渲染FlutterUI 一致性强,性能优秀包体积大,平台融合弱
WebView 渲染Cordova、Ionic开发门槛最低性能最差,体验与原生差距大
编译转换Taro、uni-app一套代码多端小程序受限于各端能力交集
混合方案uni-app(App 端)灵活复杂度高

1.3 核心方案对比

维度React NativeFlutterTarouni-appElectron
开发语言JavaScript/TSDartJS/TS(React/Vue)VueJS/TS
渲染方式原生组件自绘引擎编译转换编译转换 / WebViewChromium
核心平台iOS + AndroidiOS + 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 的配置中,通过 aliasreact-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-mapsreact-native-camera
  • 部分平台特定的 API(StatusBarPermissionsAndroid 等)

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-windowsreact-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/macOSElectron
生态成熟度一般,第三方库支持有限极其成熟,生态丰富
性能好(原生渲染)一般(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 + AndroidRN 或 Flutter
iOS + Android + WebRN + react-native-web,或 Flutter(Web 支持渐成熟)
iOS + Android + 小程序Taro(如果小程序是主力)或 RN + 小程序独立开发
iOS + Android + 小程序 + WebTaro / uni-app(全端覆盖),或 RN + Taro 组合
桌面端Electron(快速交付)或 Tauri(性能优先)
全平台没有银弹,分层设计 + 组合方案

6.2 第二步:评估业务特征

业务特征倾向方案原因
需要频繁热更新RN天然支持动态化
UI 交互复杂(大量动画、手势)Flutter 或 Native自绘引擎 / 原生性能天花板高
团队是 React 技术栈RN / Taro学习成本最低
团队是 Vue 技术栈uni-app / Taro支持 Vue 语法
需要深度集成原生 SDKRN 或 NativeRN 有成熟的 Native Module 生态
对包体积敏感RN(相对较好)或 NativeFlutter 和 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 的跨端扩展能力,并给出了一个系统化的技术选型框架。

核心要点

  1. 跨端全景:移动端(RN/Flutter)、小程序端(Taro/uni-app)、桌面端(Electron/Tauri)、Web 端,各有所长
  2. RN 跨 Web:react-native-web 将 RN 组件映射为 Web DOM,核心组件和样式可复用,Native Module 不可复用
  3. RN 跨小程序:通过 Taro 间接支持,适合标准化 UI,复杂交互受限
  4. RN 跨桌面:react-native-windows/macos 由微软维护,适合已有 RN 代码基础的团队
  5. 一码多端的现实:100% 复用不可能,分层设计(逻辑层 80%+ / UI 层 50-70% / 平台层各自实现)是务实策略
  6. 技术选型:先定平台、再看业务特征、最后考虑团队因素,用决策矩阵量化比较

记忆口诀

跨端选型三步走:先看去哪(平台),再看干啥(业务),最后看谁干(团队)


本章思维导图

RN 跨端方案
  • 跨端全景
    • 移动端: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 复杂度、原生集成度)
    • 第三步:评估团队因素(规模、技术栈、招聘)
    • 决策矩阵:量化各维度权重和得分

练习挑战

第一题 ⭐(基础):方案匹配

请为以下三个项目分别推荐最合适的跨端方案,并简要说明理由:

  1. 一个内部使用的 CRM 管理工具,需要在 PC 浏览器和手机上使用
  2. 一个社交类 App,需要覆盖 iOS + Android,有大量的动画和手势交互
  3. 一个电商促销活动页面,需要同时在微信小程序、支付宝小程序和 H5 上线
点击查看答案
  1. CRM 管理工具 → 响应式 Web(React/Vue) 理由:作为内部工具,PC 浏览器是主要使用场景,手机上也只需要浏览器访问即可。不需要 App 的原生能力,用响应式 Web 开发成本最低、迭代最快。没必要上跨端框架。

  2. 社交类 App → Flutter 或 RN(新架构) 理由:大量动画和手势交互对渲染性能要求高。Flutter 的自绘引擎在动画性能上有天然优势。RN 新架构 + react-native-reanimated 也能达到接近的效果。如果团队是 React 技术栈选 RN,否则 Flutter 更合适。不推荐 Taro/uni-app,因为它们的 App 端性能不足以支撑复杂交互。

  3. 电商促销活动页 → 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 不太合适:

  1. 实时地图:需要频繁操作原生地图组件,涉及大量的手势交互和实时位置更新。Taro 的 RN 端对这种重度原生交互的支持不够好。
  2. 性能要求高:打车场景中,地图的流畅度和实时性直接影响用户体验和安全。App 端必须保证原生级别的性能。

为什么 App 端选 RN 而不是 Flutter?

  1. 团队匹配:5 个前端都是 React 技术栈,上手 RN 成本极低,选 Flutter 要重新学 Dart
  2. 动态化:打车 App 需要频繁调整定价策略、活动配置等,RN 的热更新能力很重要
  3. 地图 SDK 集成:RN 有成熟的地图库(react-native-maps),Native Module 生态丰富
  4. 双端共用:司机端和乘客端的业务逻辑(订单状态机、聊天模块、支付流程)可以大量复用

为什么微信小程序单独开发而不是用 Taro?

  1. 微信小程序有自己成熟的地图组件和定位 API,原生开发体验最好
  2. 小程序功能通常是 App 的简化版(乘客端),不需要完整的功能对等
  3. 团队只有 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