VueConf 2022 - Vue 的进化历程

库阶段(Library) 2013-2015

库与框架: 库更像是一个小模块嵌入于在大项目中, 而框架则定义了一套自己的工程实践与配套工具

库阶段实现了基于 ES5 getter/setter 的响应式系统, MVVM, 模板数据绑定. 并没有对构建工具等做出限制

此时 Vue 的组件与响应式系统强耦合, 没有编译过程, 直接将模板实例为 DOM 并遍历实现数据绑定

框架阶段(Framework Phase) 2015-2016

实现 Vue 1.0

  • 引入了 Vue Router(SPA), vue-cli, Vuex(状态管理) 此时 Vue 更像是一个框架了
  • 引入了 v-bind, v-on, v-for 及其缩写
  • 实现了热更新与 Scoped CSS

通用框架阶段(Universal Framework Phase) 2016-2019

完全重写, 实现 Vue 2.0.

  • 引入了模板编译 Virtual DOM
  • 引入了基于 Virtual DOM 的服务端渲染
  • 引入了基于 Virtual DOM 的跨端渲染
  • 手动实现了 TS 定义
  • 扩展了 vue-cli, 完成了工具链与 vue 的解绑
  • 2.1 引入了作用域插槽
  • 2.2 引入了基于路由的代码分割(SSR)
  • 2.3 引入了基于路由的资源预加载(SSR, 基于 webpack 生成的 manifest 文件分析资源引用关系)
  • 2.4 引入了异步组件支持与编译输出(SSR)

编译/运行时混合阶(Compiler/Runtime Hybrid Phase) 2019-now

Vue 2 的编译与运行模块是完全解耦的, 两者互不通信息, 这导致编译器与运行时无法协作优化.

Vue 3

  • 实现了基于编译优化的 Virtual DOM 性能策略(Block Tree, PatchFlags)
  • 提出了 Composition API(当时也提出了基于 class 的 API, 但是因为 class 的装饰器语法不稳定, 最后选择了 Composition API). 切换 Composition API 后
    • 可扩展性得到了显著提升, 逻辑易于重组, 抽取, 复用
    • TS 更加友好
  • 实现了完全优化的 SSR 编译输出
  • 开发了 Vite, 将 vue-cli 功能部分剥离到 Vite.
  • 实现了同一份模版,不同的编译输出
    • 浏览器: 高度优化的 Virtual DOM 渲染函数
    • SSR: buffer + 字符串拼接
    • 将来: Vapor mode (无 Virtual DOM 的渲染代码)
  • 单文件组件语法糖
    • <script setup>
    • CSS v-bind()
    • Reactivity Transform
  • 3.1 引入了 Migration Build
  • 3.2 引入了 <script setup>

现在的 Vue3

  • core: 运行时, 编译器
  • 文档
  • 工具链 (create-vue)
  • SPA 路由 (Vue Router)
  • 状态管理 (Pinia)
  • 浏览器开发工具 (vue-devtools)
  • IDE 支持 (Volar)
  • TypeScript 支持 (将 tsc 扩展为 vue-tsc 以支持 sfc 检查)
  • 静态分析 (eslint-plugin-vue)
  • 单元测试 (@vue/test-utils)

未来

  • 短期
    • Reactivity Transform / Suspense 稳定化
    • SSR 水合改进 (lazy / on-demand / server-only)
  • 中到长期
    • Vapor mode (受 Solid 启发的模版编译策略)