返回

Vue三大系统揭秘:带你手把手实现Mini-Vue(十七)

前端

一览 Vue 三大支柱

Vue 的成功归功于其精妙的架构,而三大核心系统——编译模板系统、渲染模块和响应式模块——正是这栋摩天大楼的基石。

1. 编译模板系统

编译模板系统将 HTML 模板转换为更易于处理的渲染函数。它采用创新方法,将模板解析为抽象语法树(AST),然后将其编译为更优化的渲染函数。

2. 渲染模块

渲染模块负责将编译后的渲染函数转换成虚拟 DOM。虚拟 DOM 是一种轻量级的 DOM 表示形式,它可以高效地更新实际 DOM,从而实现更流畅的渲染性能。

3. 响应式模块

响应式模块是 Vue 的核心,它允许数据状态发生变化时自动更新视图。它使用数据劫持和发布-订阅模式来监听数据更改并触发视图更新。

亲手打造 Mini-Vue

为了加深理解,我们将打造一个 Mini-Vue 版本,它将包含 Vue 的核心模块,如渲染、响应式系统和应用入口。

1. 渲染模块

function render(vnode) {
  if (typeof vnode.tag === 'string') {
    return document.createElement(vnode.tag)
  } else {
    return createElement(vnode.tag, vnode.props)
  }
}

function createElement(tag, props) {
  const element = document.createElement(tag)
  for (const key in props) {
    element.setAttribute(key, props[key])
  }
  return element
}

2. 响应式模块

class Dep {
  constructor() {
    this.subs = []
  }

  depend() {
    this.subs.push(Dep.target)
  }

  notify() {
    this.subs.forEach(sub => sub())
  }
}

Dep.target = null

class Observer {
  constructor(data) {
    this.data = data
    this.walk(data)
  }

  walk(data) {
    for (const key in data) {
      defineReactive(data, key)
    }
  }
}

function defineReactive(data, key) {
  const dep = new Dep()
  Object.defineProperty(data, key, {
    get() {
      dep.depend()
      return data[key]
    },
    set(newVal) {
      data[key] = newVal
      dep.notify()
    }
  })
}

3. 应用入口

const app = new Vue({
  data: {
    count: 0
  },
  render(h) {
    return h('div', {
      onClick: () => { this.count++ }
    }, `count: ${this.count}`)
  }
})

app.$mount('#app')

总结

通过构建 Mini-Vue,我们亲身体验了 Vue 的核心系统如何协同工作,实现高效的渲染、响应式更新和组件化开发。这将极大地帮助我们深入理解 Vue3 的架构,为更复杂的应用开发奠定坚实的基础。