核心是用 createrenderer 替换默认 dom 渲染逻辑,将 vnode 转为 canvas/webgl 绘图指令;组件写法不变,仅底层“怎么画”改变;需重写 createelement、patchprop、insert、remove 等宿主函数,并封装跨平台绘图上下文,支持响应式更新、分层渲染与手动 requestanimationframe 控制。

核心是用 createRenderer 替换默认 DOM 渲染逻辑,把 Vue 的 VNode 转成 Canvas 绘图指令或 WebGL 渲染调用。组件写法完全不变,变的只是底层“怎么画”。
重写关键平台接口
Vue 通过一组宿主函数(host functions)对接目标环境。Canvas/WebGL 渲染器需实现:
-
createElement:不创建 DOM 元素,返回轻量绘图描述对象,如
{ type: 'rect', props: { x: 10, y: 20, width: 100, fill: '#f00' } } -
patchProp:属性变更时不操作 style 或 class,而是触发重绘逻辑,例如
fill改变时调用ctx.fillStyle = nextValue -
insert:不是插入到 DOM 树,而是将 VNode 加入绘制队列,或立即在
ctx上执行fillRect()等调用 - remove:Canvas 无法真正删除像素,通常清空画布再重绘;高频场景可用脏矩形或分层 canvas 优化
抽象统一的绘图上下文
避免直接耦合平台 API,封装通用绘图方法:
- Web 端传入
canvas.getContext('2d'),封装为drawRect(x, y, w, h)、drawCircle(x, y, r) - WebGL 端传入
gl实例,封装为drawMesh(vertices, indices, uniforms) - 小程序端传入
createCanvasContext('id', this),适配其受限 API
这样同一套组件逻辑可跨环境复用,只需切换 hostContext 实现。
支持响应式更新与分层渲染
让 Canvas/WebGL 具备类似 DOM 的更新能力:
- 用
watchEffect自动追踪响应式数据变化,驱动重绘;不需要手动调用ctx.clearRect()+render() - 按语义分层管理 VNode:BackgroundLayer(静态地图)、GameLayer(角色动画)、EffectLayer(粒子),每层对应独立 canvas 或 framebuffer
- 利用 VNode 的
key实现 diff 复用,位置未变只更新颜色,避免整帧重绘
挂载方式不是 mount,而是 render
不能像 DOM 那样 app.mount('#app'),因为没有根容器节点:
- Canvas 场景:调用
renderer.render(vnode, ctx),vnode 是根组件生成的虚拟节点树,ctx 是 2D 或 WebGL 上下文 - WebGL 场景:vnode 描述几何体、材质、变换矩阵等,renderer 将其转为 shader uniform 设置和 draw call 调用
- 需手动绑定
requestAnimationFrame循环,控制渲染节奏,而非依赖 DOM 事件流
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











