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 能够实现跨平台渲染的核心机。