前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
  • 基础进阶

  • 精选模块

    • 精选篇

      • 1 HTML模块
      • 2 CSS模块
      • 3 JS模块
      • 4 ES6模块
      • 5 浏览器模块
      • 6 React模块
      • 7 Vue模块
      • 8 Node模块
      • 9 前端工程相关
      • 10 移动多端开发
      • 11 小程序模块
      • 12 Uniapp模块
      • 13 前端安全模块
      • 14 性能优化相关
      • 15 HTTP模块
      • 16 常用设计模式
      • 17 框架通识
      • 18 排序算法
      • 19 计算机通识
      • 20 React Native模块
        • 1 基础与选型
          • React Native 到底是什么,和写 React Web 差在哪?
          • 新项目要做 App,RN、Flutter、原生和 WebView 混合你怎么选?
          • RN 里常用的那几个核心组件,各自是干嘛的、有什么坑?
          • RN 的 Flexbox 和浏览器里的 Flexbox 有哪些不一样?
        • 2 运行原理与线程模型
        • 3 iOS、Android 原生桥接与 RN 交互
        • 4 状态、导航、网络与存储
        • 5 列表、动画与性能优化
        • 6 移动端工程与平台差异
        • 7 工程化、构建与发布
        • 8 调试与实战排障
        • 9 高频场景追问
        • 10 Swift、Kotlin 原生开发与 RN 桥接
        • 11 Expo、路由、样式与双端交付
        • 12 线上性能与体验实战
        • 13 岗位能力自检清单
        • 参考资料
      • 21 桌面端模块
      • 22 Flutter模块
      • 23 Android模块
      • 24 iOS模块
    • 进阶篇

这一章不是把 React 面试题换一套组件名,而是围绕真实 React Native 岗位常见要求展开:能写跨端业务、理解运行原理、能和 iOS/Android 原生协作、能定位性能与发布问题。

# 1 基础与选型

# React Native 到底是什么,和写 React Web 差在哪?

30 秒速记

  • 复用的是 React 的组件 + 状态 + 协调模型,宿主换成了 iOS / Android 原生视图,不是 DOM
  • View → UIView / android.view.ViewGroup,Text → 原生文本控件;裸字符串不包 Text 直接报错
  • 布局交给 C++ 写的 Yoga 算,样式是 JS 对象,只有 RN 支持的那部分属性,没有选择器和级联
  • 新架构(0.76 起默认):JSI 直接调 C++,Fabric 渲染,TurboModules 按需加载,老的异步 Bridge 退场
  • 热更新只能换 JS 包和图片,加原生 SDK、改权限声明必须重新发版

React Native 说白了就是 React 换了一个渲染目标:组件、state、diff 那一套照旧,但最后挂上去的是原生控件,不是浏览器 DOM。 所以 div、span、window、document 统统没有,文字必须放进 Text,样式是驼峰对象,默认还是纵向排列。从 0.76 开始新架构默认开启,JS 通过 JSI 直接和 C++ 层打交道,不再走以前那条异步序列化的 Bridge。业务逻辑、请求、状态管理基本能和 Web 共用,但权限、推送、前后台切换这些得按原生的规矩来。

# 一次更新从 setState 到屏幕

React 本身只负责算出「界面应该长什么样」,真正落地交给渲染器:Web 上是 react-dom,RN 里是 Fabric(老架构叫 Paper)。新架构下一次更新大致分三段:

  1. 渲染:React 执行组件拿到 React Element Tree,渲染器在 C++ 里生成对应的 Shadow Tree,每个节点记录类型、props 和样式。
  2. 提交:Yoga 对 Shadow Tree 算布局,得到每个节点的位置和尺寸,新树被标记为「下一棵要挂载的树」。
  3. 挂载:在主线程(UI 线程)上把新旧树的差异变成原生视图的增删改,比如创建一个 UIView、改一个 TextView 的文字。

全程没有 DOM,也没有浏览器那种样式计算。老架构里 JS 线程和原生之间靠 Bridge 传 JSON 消息,全异步、要序列化,大列表快速滚动时容易丢帧;新架构的 JSI 让 JS 能直接持有 C++ 对象的引用,可以同步调用,Fabric 也因此能支持 React 18 的并发特性。版本上记几个节点就够:0.68 能手动开新架构,0.76 默认开启,0.82 起老架构已经关不回去了;引擎方面 Hermes 从 0.70 起是默认 JS 引擎。

# 写代码时最直观的差异

import { Platform, StyleSheet, Text, View } from 'react-native'

export function Badge({ count }: { count: number }) {
  return (
    // View 是容器,默认 flexDirection: 'column'
    <View style={styles.wrap}>
      {/* 文字必须包在 Text 里,写成 <View>{count}</View> 会直接报错 */}
      <Text style={styles.text}>{count > 99 ? '99+' : count}</Text>
    </View>
  )
}

const styles = StyleSheet.create({
  wrap: {
    flexDirection: 'row', // 想横排要显式写
    paddingHorizontal: 6, // 数字,没有 px,单位是逻辑像素
    borderRadius: 9,
    backgroundColor: '#f5222d',
    // 平台差异用 Platform.select 收口,别在 JSX 里到处 if
    ...Platform.select({
      ios: { shadowColor: '#000', shadowOpacity: 0.2, shadowRadius: 2, shadowOffset: { width: 0, height: 1 } },
      android: { elevation: 2 },
    }),
  },
  text: { color: '#fff', fontSize: 12, fontWeight: '600' },
})
@前端进阶之旅: 代码已经复制到剪贴板

几个关键点:StyleSheet.create 只是给样式对象做类型校验和引用复用,本质还是普通对象;Text 的样式只在嵌套的 Text 之间继承,View 上写 color 对里面的字没用;阴影在 iOS 用 shadow* 一组属性,Android 老版本只能靠 elevation,0.76 起新架构才支持统一的 boxShadow。

# 哪些能复用,哪些不能

请求封装、状态管理(zustand、Redux)、表单校验、工具函数基本可以直接搬。路由要换成 React Navigation 这类原生栈导航;存储从 localStorage 换成 AsyncStorage 或 MMKV;相机、定位、推送都要申请原生权限,还要处理 AppState 前后台切换。容易误判的是热更新:CodePush 一类方案替换的是 JS 包和静态资源,只要改动涉及原生代码、新增 SDK 或者 Info.plist / AndroidManifest.xml 里的权限,就只能走商店发版。

面试官追问

追问 1同事把 Web 的头像组件直接拷过来,里面有 <span> 和 window.innerWidth,报什么错、怎么改?
参考回答

span 不是 RN 的宿主组件,会直接报找不到组件;window.innerWidth 是 undefined。换成 Text,宽度用 useWindowDimensions() 拿,它还会在横竖屏切换时自动触发重渲染。

追问 2老架构的 Bridge 到底慢在哪,JSI 解决了什么?
参考回答

Bridge 是异步消息队列,每次调用都要把参数序列化成 JSON,过去再反序列化,量大时会堵。JSI 让 JS 直接持有 C++ 对象引用、同步调用,没有序列化开销,像 react-native-reanimated、MMKV 都是靠它才能做到同步读写。

追问 3升级到 0.76 之后有个老的第三方库白屏了,你先查什么?
参考回答

先看这个库是不是还依赖老架构的 NativeModules / requireNativeComponent 写法。0.76 有兼容层,大部分老库能跑,但用了私有 Bridge API 的会挂;去 React Native Directory 查它的新架构支持情况,不支持就换库或者自己写 TurboModule。

追问 4RN 的 JS 跑在哪个线程,JS 卡住了页面还能滚吗?
参考回答

JS 跑在单独的 JS 线程,原生 ScrollView 的滚动在 UI 线程,所以 JS 卡住时列表还能滑,只是点击没反应、新内容不渲染,FlatList 会露出白块。动画想不受 JS 影响,就用 useNativeDriver: true 或 Reanimated 的 worklet。

追问 5用户说切到后台再回来,上传进度条不动了,这是 React 的问题吗?
参考回答

多半不是。iOS 进后台很快会挂起 JS 执行,普通 fetch 上传也会被系统停掉。要监听 AppState,回到前台时重新同步状态;真要后台继续传,得用原生的后台上传任务,JS 层自己做不到。

# 新项目要做 App,RN、Flutter、原生和 WebView 混合你怎么选?

30 秒速记

  • 先问清楚:页面类型、原生 SDK 有多少、性能硬指标、团队现有技术栈、要维护几年
  • RN:React 团队上手快、业务页迭代快、能热更新 JS;代价是原生依赖升级和双端细节差异
  • Flutter:自绘引擎,双端像素一致;代价是 Dart、包体略大、原生插件生态要自己补
  • 原生:性能和系统能力上限最高,音视频、AR、重图形首选;代价是两套代码两拨人
  • WebView:活动页、协议页最快上线,体验和内存是短板;大应用常见「原生壳 + RN 业务页 + H5 活动」混搭

没有哪个方案通吃,我会先看页面类型和团队,再看性能红线。 团队是 React 背景、主要做电商、社交、工具这类常规业务,我倾向 RN,业务页能和 Web 共用不少逻辑,JS 还能热更新。要求两端视觉完全一致、动效很重,Flutter 更合适,它自己画每一个像素。音视频、AR、深度系统集成这种,老老实实写原生。运营活动页一周几个,用 WebView 最省事。真实项目里一般是混着用,关键是把边界划清楚。

# 四种方案对比

方案 渲染方式 优势 主要代价 适合
RN 映射到原生控件 React 生态、业务迭代快、JS 可热更新 双端差异、原生依赖升级、复杂动画和长列表要调 电商、内容、社交、工具类
Flutter 自绘(Skia,新版本是 Impeller) 双端 UI 一致、动画性能稳 Dart 技术栈、包体偏大、平台控件要靠嵌入 强品牌视觉、多端统一 UI
原生 系统控件 性能和系统能力最完整 两套代码、人力成本最高 音视频、AR
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
  • 基础进阶

  • 精选模块

    • 精选篇

      • 1 HTML模块
      • 2 CSS模块
      • 3 JS模块
      • 4 ES6模块
      • 5 浏览器模块
      • 6 React模块
      • 7 Vue模块
      • 8 Node模块
      • 9 前端工程相关
      • 10 移动多端开发
      • 11 小程序模块
      • 12 Uniapp模块
      • 13 前端安全模块
      • 14 性能优化相关
      • 15 HTTP模块
      • 16 常用设计模式
      • 17 框架通识
      • 18 排序算法
      • 19 计算机通识
      • 20 React Native模块
        • 1 基础与选型
          • React Native 到底是什么,和写 React Web 差在哪?
          • 新项目要做 App,RN、Flutter、原生和 WebView 混合你怎么选?
          • RN 里常用的那几个核心组件,各自是干嘛的、有什么坑?
          • RN 的 Flexbox 和浏览器里的 Flexbox 有哪些不一样?
        • 2 运行原理与线程模型
        • 3 iOS、Android 原生桥接与 RN 交互
        • 4 状态、导航、网络与存储
        • 5 列表、动画与性能优化
        • 6 移动端工程与平台差异
        • 7 工程化、构建与发布
        • 8 调试与实战排障
        • 9 高频场景追问
        • 10 Swift、Kotlin 原生开发与 RN 桥接
        • 11 Expo、路由、样式与双端交付
        • 12 线上性能与体验实战
        • 13 岗位能力自检清单
        • 参考资料
      • 21 桌面端模块
      • 22 Flutter模块
      • 23 Android模块
      • 24 iOS模块
    • 进阶篇

完整面试题地址:
作者:程序员poetry
扫码关注作者公众号:「前端进阶之旅」 每天分享技术干货
前端进阶之旅公众号二维码

20-react-native

这一章不是把 React 面试题换一套组件名,而是围绕真实 React Native 岗位常见要求展开:能写跨端业务、理解运行原理、能和 iOS/Android 原生协作、能定位性能与发布问题。

# 1 基础与选型

# React Native 到底是什么,和写 React Web 差在哪?

30 秒速记

  • 复用的是 React 的组件 + 状态 + 协调模型,宿主换成了 iOS / Android 原生视图,不是 DOM
  • View → UIView / android.view.ViewGroup,Text → 原生文本控件;裸字符串不包 Text 直接报错
  • 布局交给 C++ 写的 Yoga 算,样式是 JS 对象,只有 RN 支持的那部分属性,没有选择器和级联
  • 新架构(0.76 起默认):JSI 直接调 C++,Fabric 渲染,TurboModules 按需加载,老的异步 Bridge 退场
  • 热更新只能换 JS 包和图片,加原生 SDK、改权限声明必须重新发版

React Native 说白了就是 React 换了一个渲染目标:组件、state、diff 那一套照旧,但最后挂上去的是原生控件,不是浏览器 DOM。 所以 div、span、window、document 统统没有,文字必须放进 Text,样式是驼峰对象,默认还是纵向排列。从 0.76 开始新架构默认开启,JS 通过 JSI 直接和 C++ 层打交道,不再走以前那条异步序列化的 Bridge。业务逻辑、请求、状态管理基本能和 Web 共用,但权限、推送、前后台切换这些得按原生的规矩来。

▶视频讲解 · React Native 到底是什么,和写 React Web 差在哪?配音拆解原理、代码示例与常见误区展开观看
🧪​可交互​动手试试

# 一次更新从 setState 到屏幕

React 本身只负责算出「界面应该长什么样」,真正落地交给渲染器:Web 上是 react-dom,RN 里是 Fabric(老架构叫 Paper)。新架构下一次更新大致分三段:

  1. 渲染:React 执行组件拿到 React Element Tree,渲染器在 C++ 里生成对应的 Shadow Tree,每个节点记录类型、props 和样式。
  2. 提交:Yoga 对 Shadow Tree 算布局,得到每个节点的位置和尺寸,新树被标记为「下一棵要挂载的树」。
  3. 挂载:在主线程(UI 线程)上把新旧树的差异变成原生视图的增删改,比如创建一个 UIView、改一个 TextView 的文字。

全程没有 DOM,也没有浏览器那种样式计算。老架构里 JS 线程和原生之间靠 Bridge 传 JSON 消息,全异步、要序列化,大列表快速滚动时容易丢帧;新架构的 JSI 让 JS 能直接持有 C++ 对象的引用,可以同步调用,Fabric 也因此能支持 React 18 的并发特性。版本上记几个节点就够:0.68 能手动开新架构,0.76 默认开启,0.82 起老架构已经关不回去了;引擎方面 Hermes 从 0.70 起是默认 JS 引擎。

# 写代码时最直观的差异

import { Platform, StyleSheet, Text, View } from 'react-native'

export function Badge({ count }: { count: number }) {
  return (
    // View 是容器,默认 flexDirection: 'column'
    <View style={styles.wrap}>
      {/* 文字必须包在 Text 里,写成 <View>{count}</View> 会直接报错 */}
      <Text style={styles.text}>{count > 99 ? '99+' : count}</Text>
    </View>
  )
}

const styles = StyleSheet.create({
  wrap: {
    flexDirection: 'row', // 想横排要显式写
    paddingHorizontal: 6, // 数字,没有 px,单位是逻辑像素
    borderRadius: 9,
    backgroundColor: '#f5222d',
    // 平台差异用 Platform.select 收口,别在 JSX 里到处 if
    ...Platform.select({
      ios: { shadowColor: '#000', shadowOpacity: 0.2, shadowRadius: 2, shadowOffset: { width: 0, height: 1 } },
      android: { elevation: 2 },
    }),
  },
  text: { color: '#fff', fontSize: 12, fontWeight: '600' },
})
@前端进阶之旅: 代码已经复制到剪贴板

几个关键点:StyleSheet.create 只是给样式对象做类型校验和引用复用,本质还是普通对象;Text 的样式只在嵌套的 Text 之间继承,View 上写 color 对里面的字没用;阴影在 iOS 用 shadow* 一组属性,Android 老版本只能靠 elevation,0.76 起新架构才支持统一的 boxShadow。

# 哪些能复用,哪些不能

请求封装、状态管理(zustand、Redux)、表单校验、工具函数基本可以直接搬。路由要换成 React Navigation 这类原生栈导航;存储从 localStorage 换成 AsyncStorage 或 MMKV;相机、定位、推送都要申请原生权限,还要处理 AppState 前后台切换。容易误判的是热更新:CodePush 一类方案替换的是 JS 包和静态资源,只要改动涉及原生代码、新增 SDK 或者 Info.plist / AndroidManifest.xml 里的权限,就只能走商店发版。

面试官追问

追问 1同事把 Web 的头像组件直接拷过来,里面有 <span> 和 window.innerWidth,报什么错、怎么改?
参考回答

span 不是 RN 的宿主组件,会直接报找不到组件;window.innerWidth 是 undefined。换成 Text,宽度用 useWindowDimensions() 拿,它还会在横竖屏切换时自动触发重渲染。

追问 2老架构的 Bridge 到底慢在哪,JSI 解决了什么?
参考回答

Bridge 是异步消息队列,每次调用都要把参数序列化成 JSON,过去再反序列化,量大时会堵。JSI 让 JS 直接持有 C++ 对象引用、同步调用,没有序列化开销,像 react-native-reanimated、MMKV 都是靠它才能做到同步读写。

追问 3升级到 0.76 之后有个老的第三方库白屏了,你先查什么?
参考回答

先看这个库是不是还依赖老架构的 NativeModules / requireNativeComponent 写法。0.76 有兼容层,大部分老库能跑,但用了私有 Bridge API 的会挂;去 React Native Directory 查它的新架构支持情况,不支持就换库或者自己写 TurboModule。

追问 4RN 的 JS 跑在哪个线程,JS 卡住了页面还能滚吗?
参考回答

JS 跑在单独的 JS 线程,原生 ScrollView 的滚动在 UI 线程,所以 JS 卡住时列表还能滑,只是点击没反应、新内容不渲染,FlatList 会露出白块。动画想不受 JS 影响,就用 useNativeDriver: true 或 Reanimated 的 worklet。

追问 5用户说切到后台再回来,上传进度条不动了,这是 React 的问题吗?
参考回答

多半不是。iOS 进后台很快会挂起 JS 执行,普通 fetch 上传也会被系统停掉。要监听 AppState,回到前台时重新同步状态;真要后台继续传,得用原生的后台上传任务,JS 层自己做不到。

# 新项目要做 App,RN、Flutter、原生和 WebView 混合你怎么选?

30 秒速记

  • 先问清楚:页面类型、原生 SDK 有多少、性能硬指标、团队现有技术栈、要维护几年
  • RN:React 团队上手快、业务页迭代快、能热更新 JS;代价是原生依赖升级和双端细节差异
  • Flutter:自绘引擎,双端像素一致;代价是 Dart、包体略大、原生插件生态要自己补
  • 原生:性能和系统能力上限最高,音视频、AR、重图形首选;代价是两套代码两拨人
  • WebView:活动页、协议页最快上线,体验和内存是短板;大应用常见「原生壳 + RN 业务页 + H5 活动」混搭

没有哪个方案通吃,我会先看页面类型和团队,再看性能红线。 团队是 React 背景、主要做电商、社交、工具这类常规业务,我倾向 RN,业务页能和 Web 共用不少逻辑,JS 还能热更新。要求两端视觉完全一致、动效很重,Flutter 更合适,它自己画每一个像素。音视频、AR、深度系统集成这种,老老实实写原生。运营活动页一周几个,用 WebView 最省事。真实项目里一般是混着用,关键是把边界划清楚。

▶视频讲解 · 新项目要做 App,RN、Flutter、原生和 WebView 混合你怎么选?配音拆解原理、代码示例与常见误区展开观看

# 四种方案对比

方案 渲染方式 优势 主要代价 适合
RN 映射到原生控件 React 生态、业务迭代快、JS 可热更新 双端差异、原生依赖升级、复杂动画和长列表要调 电商、内容、社交、工具类
Flutter 自绘(Skia,新版本是 Impeller) 双端 UI 一致、动画性能稳 Dart 技术栈、包体偏大、平台控件要靠嵌入 强品牌视觉、多端统一 UI
原生 系统控件 性能和系统能力最完整 两套代码、人力成本最高 音视频、AR、重图形、深度系统集成
WebView 混合 浏览器内核 发布不走商店、Web 资产直接复用 首屏慢、内存高、手势和键盘体验差 活动页、帮助中心、低交互内容

# 我会怎么推进决策

光看表不够,要拿真实页面去验证。我一般会挑三类代表页各做一个原型:一个长列表加图片的信息流、一个有复杂手势或动画的页面、一个依赖原生 SDK 的页面(比如支付或扫码)。在中低端 Android 机上测帧率、首屏时间和包体增量,比争论「谁性能好」有用得多。

几个容易被忽略的维度:

  • 原生 SDK 数量:地图、支付、推送、埋点、客服这些厂商一般先给原生 SDK,RN / Flutter 的封装可能滞后或者没人维护,每多一个就要算一份桥接和升级成本。
  • 升级成本:RN 每次大版本升级都可能牵扯一批原生依赖,要预留人力;Flutter 的插件生态也有同样问题。
  • 发版节奏:RN 的 JS 热更新能绕开商店审核修线上问题,但苹果只允许不改变应用主要功能的脚本更新,别拿它上线新业务形态。

# 混合架构里的 WebView 通信

← 19 计算机通识21 桌面端模块 →

fe