weex 中 vnode 不参与原生渲染,仅用于生成可序列化的 render commands(如 create、update),通过 jsbridge 发送至原生端执行;原生侧维护独立 native node tree,样式布局由 yoga 完成,通信基于任务队列与模块回调,vnode 与 dom 完全隔离。

Vue.js 的 VNode 在 Weex 中并不直接参与原生渲染,Weex 采用的是“中间层映射 + 原生组件桥接”机制,VNode 仅存在于 JS 引擎中,不会被序列化或跨进程传递到原生端。
VNode 不进入原生层,只用于生成渲染指令
Weex 的 Vue 运行时经过定制,其 patch 过程不操作真实 DOM,而是将 VNode 树解析为可序列化的 render commands(如 create、update、destroy),这些命令是轻量 JSON 对象,包含组件类型、属性、事件名、子节点 ID 等结构化信息。
- VNode 的
el属性为空,不绑定任何真实节点 -
render函数产出的 VNode 会被weex-vue-framework的 virtual-dom diff 模块处理,输出最小变更指令集 - 指令通过 JSBridge(iOS/Android 原生桥)异步发送,非逐个 VNode 映射
原生端无 VNode 解析逻辑,只有指令执行器
原生引擎(如 iOS 的 WXRenderManager 或 Android 的 WXRenderManager)接收的是扁平化的指令数组,内部维护一套独立的 native node tree(非 VNode 树),每个节点对应一个原生视图对象(如 UIView / View)。
使用 `@ainative/vue-sdk` 为 Vue 3 应用添加 AI 聊天功能。适用于以下场景:(1) 安装 `@ainative/vue-sdk`,(2) 在 Vue 组件中使用 `useChat` 组合式函数,(3) 提供……
- 指令中的
ref字段用于关联 JS 节点 ID 和原生节点 ID,实现双向引用 - 事件回调(如
click)触发时,原生端通过 ref 查找 JS 上下文,调用callJS执行绑定的 handler,不还原 VNode - 样式和布局计算由原生端完成(使用 Yoga 布局引擎),CSS-in-JS 属性在 JS 层已预处理为驼峰键(如
backgroundColor)
通信依赖三类通道:JSBridge、TaskQueue 与 Native Module
Weex 的 JS 与原生通信不是基于 VNode 流动,而是围绕任务调度展开:
-
JSBridge:同步/异步调用原生模块(如
stream.fetch),返回 Promise,不涉及 UI 结构 - Render Task Queue:批量提交 render 指令,避免频繁跨线程,原生端按序消费并更新 native node tree
-
Native Module Callbacks:原生模块主动回调 JS(如
geolocation定位结果),通过全局callbackId匹配,与当前 VNode 树无关
开发中需注意的关键边界
由于 VNode 与原生完全隔离,以下行为在 Weex 中受限或不可用:
- 不能在
mounted钩子中访问this.$el(始终为 null) - 不支持
v-html、v-show(底层无 DOM,显示靠show指令控制 visibility) - 自定义指令(
directives)若依赖 DOM API(如insertBefore)会失效,必须通过binding.value触发 render 指令变更 -
ref获取的是 JS 端的 proxy 对象(VueComponentRef),调用.setStyle()实际是触发一次 update 指令
本质上,Weex 把 Vue 视为声明式配置生成器,VNode 是中间表示,真正驱动原生的是精简、语义明确的指令流。理解这点,就能避开“模拟 DOM”的思维惯性,写出更符合 Weex 架构的代码。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










