2. 跨端技术基础高频问答:Flutter/RN/Weex 核心概念、生命周期、通信机制

本章聚焦面试中最高频的三大跨端技术对比型问题。面试官常从“原理差异”切入,考察你是否真正理解底层设计,而非仅会写 demo。建议先通读下方对比图,再逐个击破问答卡片。

三大跨端技术核心概念 & 通信机制对比 Flutter React Native Weex 引擎自绘 Skia 直接渲染 Widget ↔ Element ↔ Render Dart 单线程 + Isolate 桥接模式 Virtual DOM → Native JS ↔ Native Module 批量异步通信 Vue + 原生渲染 JS Bundle 执行 Native Render 渲染 通信: JSBridge State 生命周期 initState build → setState → didUpdate deactivate → dispose React 组件生命周期 constructor → render componentDidMount componentWillUnmount Vue 生命周期 beforeCreate → created beforeMount → mounted beforeDestroy → destroyed Dart → C++ Platform Channel 异步消息,编解码 JS → Native 异步桥 队列批量发送 JSBridge 双向通信 回调 + 事件

卡片 1|Flutter:Widget 三棵树与 State 生命周期

面试问题:请描述 Flutter 中 Widget、Element、Render 三者的关系,以及 State 的生命周期。

面试官考察点:是否真正理解 Flutter 渲染管线;能否用简洁语言区分三棵树角色;生命周期各阶段触发时机。

回答框架:
① 三棵树定义:Widget(配置描述)→ Element(实例持有状态)→ Render(布局绘制)
② 对应关系:每个 Widget 对应一个 Element,但只有 RenderObjectWidget 才对应 RenderObject
③ State 生命周期:initState → build → setState → didUpdateWidget → deactivate → dispose

简短示例回答:
“Widget 是描述 UI 的不可变配置,Element 是创建并持有状态的可变对象,RenderObject 负责布局和绘制。State 生命周期从 initState 开始,每次 setState 触发 build,组件被移除时走 dispose 释放资源。”

可能追问:
• 为什么 Flutter 选择三棵树而非更少层级?
• 什么情况下会触发 didUpdateWidget?
• GlobalKey 如何影响 Element 复用?

避坑提醒:
不要混淆 Widget 和 Element 的“更新”概念——Widget 重建不等于 Element 重建。实际面试中常见错误是将 State 生命周期与组件生命周期等同。

卡片 2|React Native:JSBridge 与原生模块通信

面试问题:React Native 如何实现 JavaScript 与原生端的通信?请简述其核心机制。

面试官考察点:对 JSBridge 底层实现的理解;能否区分同步/异步调用;是否了解原生模块注册与回调。

回答框架:
① JSBridge 是 RN 通信核心,JS 端通过序列化 JSON 消息发送到原生侧
② 原生侧通过 Native Modules 接收,执行后异步返回结果
③ 批量处理:JS 线程将调用打包成 batch,一次传递减少性能开销

简短示例回答:
“JS 调用原生方法时,消息会序列化后通过 JSBridge 传给 Native 侧。Native Modules 执行后在下一个 JS 帧通过回调返回结果。所有通信都是异步且批量发送,避免主线程阻塞。”

可能追问:
• 如何实现同步调用?什么场景下才允许?
• 如果原生模块抛出异常,JS 侧会 crash 吗?
• 新架构 Fabric 的 JSI 如何优化通信效率?

避坑提醒:
切勿回答“JS 直接调用原生函数”——RN 通信本质是序列化消息传递。面试时补充“批量处理和 JSON 编解码”项,能体现深度。

卡片 3|Weex:JS Bundle、Native Render 与 Vue 生命周期

面试问题:Weex 如何将 Vue 页面渲染为原生组件?请说明其整体流程。

面试官考察点:是否理解 Weex 的“Vue 运行时 + 原生渲染”架构;对 JS Bundle 生成、桥接通信、生命周期映射的掌握。

回答框架:
① 开发阶段:Vue 代码经 weex-loader 打包为 JS Bundle
② 运行时:JS 引擎(如 JSC)执行 Bundle,通过 JSBridge 向 Native 发送渲染指令
③ 原生侧:解析指令调用对应原生组件(TextView/ImageView 等),渲染成真实 UI
④ 生命周期映射:Vue 生命周期通过钩子映射到 Native 渲染阶段

简短示例回答:
“Weex 中的 Vue 组件在 JS 引擎中执行,通过 JSBridge 将渲染指令传递给 Native 线程。Native 根据指令创建原生视图并挂载。Vue 的 mounted 钩子对应原生视图已渲染完毕的时刻。”

可能追问:
• Weex 如何支持自定义原生组件?
• 与 RN 相比,Weex 在通信模型上有何差异?
• Weex 2.0 为何不再维护?技术债主要体现在哪些方面?

避坑提醒:
不要只说“Vue 写页面、原生渲染”,要体现“JS Bundle 在独立引擎中执行”这个关键点。面试官会追问 Bundle 是如何被加载和执行的。

对比维度FlutterReact NativeWeex
核心语言DartJavaScriptJavaScript (Vue)
渲染引擎Skia 自绘原生组件 + Yoga 布局原生组件 + CSS 布局
通信方式Platform Channel (Dart → C++)JSBridge (异步批量)JSBridge (双向回调)
生命周期模型State 生命周期React 组件生命周期Vue 组件生命周期
性能瓶颈Dart Isolate 通信Bridge 排队 & 序列化JS 线程与 UI 线程同步

💡 面试加分点:当被问到“你用过哪个跨端方案”时,主动说出“Flutter 的三棵树优化了布局效率、RN 的异步桥可能产生通信延迟、Weex 更依赖 Vue 生态”——能立刻体现技术广度。