likes
comments
collection
share

Vue Vaporvue vapor是没有虚拟 DOM 的 vue 变体,基于 @vue/reactivity 响应式系

作者站长头像
站长
· 阅读数 25

本文整理自 三咲智子 老师在VueConf 2024上的分享 Vue Vapor:重新发明,项目地址:vuejs/core-vapor

一、什么是 Vue Vapor

vue vapor 是没有虚拟 DOM 的 vue 变体,基于 @vue/reactivity 响应式系统,通过追踪数据变化直接操作 DOM 更新,性能更好、包体积更小。是 vue 一个新的开始。

二、Vue Vapor 原理

引用智子老师提供的点击按钮数字增加的 demo,点击按钮时,基于 @vue/reactivity 响应式原理,对 DOM 元素进行直接操作更新,不再像传统 vue 那样首先根据状态更新虚拟 DOM,进而基于虚拟 DOM 对 diff 部分重新渲染。

import { effect, ref } from '@vue/reactivity'

// 初始化
const container = document.createElement('div')
const label = document.createElement('h1')
const button = document.createElement('button')
button.textContent = 'Increase'

button.addEventListener('click', increase) // 注册事件
const count = ref(0)
effect(() => {
  label.textContent = `Count: ${count.value}`
})
function increase() {
  count.value++
}

document.body.append(container)
container.append(label, button)

另外,补充一个尤大提供的 demo,方便理解。

三、Vue Vapor 使用与编译

使用时,仅需在 setup script 标签添加 vapor 标识即可被识别为 vapor 脚本并进行编译,vue vapor SFC 编译原理如下:

编译前

<script setup vapor>
import { ref } from 'vue'

const count = ref(0)

function increase() {
  count.value++
}
</script>

<template>
  <h1>Count: {{ count }}</h1>
  <button @click="increase">Increase</button>
</template>

编译后

import { delegate, delegateEvents, renderEffect, setText, template } from 'vue/vapor'
import { ref } from 'vue'

const t0 = template('<h1>')
const t1 = template('<button>Increase')
delegateEvents('click')

export default {
  setup() {
    const count = ref(0)
    function increase() {
      count.value++
    }

    const n0 = t0()
    const n1 = t1()
    delegate(n1, 'click', () => increase)
    renderEffect(() => setText(n0, 'Count: ', count.value))
    return [n0, n1]
  },
}

四、Vue Vapor 包体积与性能

  • 包体积相比虚拟 DOM 模式减少 33.6% (持续优化中)
  • 与主流框架性能对比数据如下(持续优化中,完整数据): Vue Vaporvue vapor是没有虚拟 DOM 的 vue 变体,基于 @vue/reactivity 响应式系

五、Vue Vapor JSX 模式

vue vapor 支持 JSX 模式,JSX 模式编译架构与 SFC 模式对比图如下:

Vue Vaporvue vapor是没有虚拟 DOM 的 vue 变体,基于 @vue/reactivity 响应式系

六、Vue Vapor 定位

  • vue vapor 是 vue vDOM 模式的子集:
    • 仅支持 Composition API,后续Options API 或许会作为第三方库
    • 仅构建工具编译 (Vite / Webpack…)
    • 仅支持 <script setup>
  • vapor 组件支持 vDOM 模式,vDOM 将支持 vapor 模式,支持纯 vapor 模式。因此,不存在破坏性变动,在已有 vue 项目中可以无痛引入 vue vapor,可以在对性能要求较高的组件中首先使用
  • 不支持 vue2

七、Vue Vapor 规划

  • 将提出 RFC 征求意见稿,并在 Vue Macros 第三方项目中率先实验,以 Feature Flag 的形式引入 Vue Vapor
  • 将持续优化性能和包体积
  • 将在今年底发布 beta 版本,并支持 VitePress
  • TODO: SSR/水合支持、DevTools兼容优化、异步组件支持内部组件支持
转载自:https://juejin.cn/post/7389064690125766708
评论
请登录