2026.01.01
自定义渲染器 -> 初始渲染器实现
什么是渲染器?
Vue 是基于 虚拟 DOM 的框架,渲染器负责将 虚拟 DOM 转换为 真实 DOM 节点并渲染到页面上。
什么是虚拟 DOM?如何创建?
const vnode = h('div', null, 'hello world')
console.log(vnode)
虚拟 DOM 本质上是一个普通的 JavaScript 对象,用来描述真实 DOM 的结构:

渲染器的工作流程
渲染器的职责就是将虚拟 DOM 渲染到页面上,其工作流程如下:

/**
* 通过渲染器 将虚拟 DOM 转为真实 DOM 渲染在页面中
* vnode -> rener -> DOM
*/
import { h, render } from 'vue'
const vnode = h('div', null, 'hello world')
render(vnode, document.body)
实现一个自定义的渲染器
Vue 通过 createRenderer 开放了底层接口,允许我们自定义在不同环境下的渲染行为。这为跨平台渲染(如 SSR、Weex 等)提供了可能。
官方文档:createRenderer API
import { createRenderer, h } from 'vue'
const renderer = createRenderer()
console.log(renderer)

通过一步步解决控制台中的问题:

最终的代码如下:
import { createRenderer, h } from '../../../node_modules/vue/dist/vue.esm-browser.js'
const vnode = h('div', {}, 'hello world')
// 创建自定义渲染器,提供 DOM 操作方法
const renderer = createRenderer({
// 将元素插入到父节点中
insert(el, parent, anchor = null) {
// anchor: 锚点元素,用于指定插入位置
// 如果有 1、2、3 节点,要将新节点插入到 1 和 3 之间,则 anchor 为 3
parent.insertBefore(el, anchor)
},
// 创建元素节点
createElement(type) {
return document.createElement(type)
},
// 设置元素的文本内容
setElementText(el, text) {
el.textContent = text
},
// 移除元素
remove(el) {
const parent = el.parentNode
if (parent) {
parent.removeChild(el)
}
},
// 创建文本节点
createText(text) {
return document.createTextNode(text)
},
// 设置文本节点的内容
setText(node, text) {
return (node.nodeValue = text)
},
// 获取父节点
parentNode(el) {
return el.parentNode
},
// 获取下一个兄弟节点
nextSibling(el) {
return el.nextSibling
},
// 查询元素
querySelector(selector) {
return document.querySelector(selector)
}
})
// 将虚拟节点渲染到页面
renderer.render(vnode, document.body)
// 2 秒后卸载
setTimeout(() => {
renderer.render(null, document.body)
}, 2000)
关键 API
| 方法 | 作用 |
|---|---|
insert | 将元素插入到父节点中 |
createElement | 创建元素节点 |
setElementText | 设置元素的文本内容 |
remove | 移除元素 |
createText | 创建文本节点 |
setText | 设置文本节点的内容 |
parentNode | 获取父节点 |
nextSibling | 获取下一个兄弟节点 |
querySelector | 查询元素 |
通过实现这些核心 API,我们就能创建一个功能完整的自定义渲染器。这也是 Vue 能够实现跨平台渲染的核心机。