Vue 3.4 官宣升级,版本代号“灌篮高手”,爷青回~

大家好,这里是大家的林语冰。持续关注,坚持阅读,每天一次,进步一点。

免责声明

本文属于是语冰的直男翻译了属于是,略有删改,仅供粉丝参考。

英文原味版请传送 Announcing Vue 3.4

今天我们十分鸡冻,Vue 团队官宣 Vue 3.4 正式发布,版本代号"Slam Dunk"(灌篮高手)。

教练,我想打篮球!emm....不是,尤大,我想学 Vue 3~

此版本包括若干重量级内部优化 ------ 最大有可观的是,重写的模板解析器速度提高了整整 2 倍,以及重构的响应性系统,使得作用(effect)更精准高效。它还包含了一大坨生活质量 API 优化,包括但不限于:

  • defineModel 的稳定性
  • 绑定 props 时的全新同名简写

本文概述了 Vue 3.4 的亮点功能。关于变更的完整列表,请传送 GitHub 的完整变更日志。

  • 潜在需要的 action
  • 亮点功能
    • 解析器速度提高 2 倍,优化 SFC 的构建性能
    • 更高效的响应性系统
    • defineModel 现已稳定
    • v-bind 同名简写
    • 改良水合(hydration)的不匹配错误
    • 错代码和编译时标志参考
  • 移除已废弃功能
    • 全局 JSX 命名空间
    • 其他已删除功能

潜在需要的 action

  1. 为了充分利用 Vue 3.4 的功能,建议在升级到 Vue 3.4 时,同时更新下列依赖:
  • Volar/vue-tsc@^1.8.27(必要
  • @vitejs/plugin-vue@^5.0.0(如果使用了 Vite)
  • nuxt@^3.9.0(如果使用了 Nuxt)
  • vue-loader@^17.4.0(如果使用了 webpack 或 vue-cli)
  1. 如果使用 TSX 与 Vue 梦幻联动,请检查需要的 action(已移除:全局 JSX 命名空间中)。
  2. 确保您不再使用任何已废弃功能(否则,console 应该会警告您)。它们在 Vue 3.4 可能已被移除。

功能亮点

解析器速度提高 2 倍,优化 SFC 的构建性能

在 Vue 3.4 中,我们完全重写了模板解析器。之前,Vue 使用递归下降解析器,该解析器依赖一大坨正则表达式和前向搜索。新的解析器使用基于 htmlparser2 的状态机 tokenizer(分词器),它有且仅有迭代整个模板字符串一次。结果是对于所有尺寸的模板而言,解析器始终优化 2 倍。多亏了我们广泛的测试用例和 ecosystem-ci,它也 100% 向后兼容 Vue 终端用户。

在将新的解析器与系统的其他部分集成时,我们还发现了若干进一步优化整体 SFC 编译性能的机会。基准测试显示,生成源码映射的同时,编译 Vue SFC 的脚本和模板部分的时候,性能优化了约 44%,因此 Vue 3.4 应该会优化大多数使用 Vue SFC 的项目构建。虽然但是,粉丝请注意,Vue SFC 编译只是现实项目中整个构建过程的一部分。与单独的基准测试相比,端到端构建时间的最终收益可能要小得多。

在 Vue 核心库之外,新的解析器还将优化 Volar/vue-tsc,以及需要解析 Vue SFC 或模板的社区插件的性能,比如 Vue Macros。

更高效的响应性系统

Vue 3.4 还对响应性系统进行了重大重构,旨在优化计算属性重新计算的效率。

为了说明正在优化的细节,让我们瞄一下以下场景:

js 复制代码
const count = ref(0)
const isEven = computed(() => count.value % 2 === 0)

watchEffect(() => console.log(isEven.value)) // 打印 true

count.value = 2 // 再次打印 true

在 Vue 3.4 之前,每当 count.value 变更时,即使计算结果不变,也会触发 watchEffect 的回调。通过 Vue 3.4 优化之后,现在当且仅当仅计算结果实际变更时,才会触发回调。

另外,在 Vue 3.4 中:

  • 多个计算依赖变更能且仅能触发一次同步作用。
  • 数组的 shift/unshift/splice 方法能且仅能触发一次同步作用。

除了基准测试中展示的收益之外,这还可以减少一大坨场景中多余的组件重新渲染,同时保留完整的向后兼容性。

defineModel 现已稳定

defineModel 是一个新的 <script setup> 宏,旨在简化支持 v-model 的组件的实现。它之前作为实验性功能在 Vue 3.3 中发布,并在 Vue 3.4 中尘埃落定。现在,它还为 v-model 修饰符的使用提供了更好的支持。

相关文档:

  • 修订后的组件 v-model 部分
  • defineModel API 参考

v-bind 同名简写

您现在可以简写下列用例:

html 复制代码
<img :id="id" :src="src" :alt="alt" />

<!-- 优雅简写为: -->
<img :id :src :alt />

过去经常需要此功能。最初,我们担心它的用法会与布尔属性混淆。虽然但是,重新审视此功能后,考虑到其动态特性,我们现在认为 v-bind 的行为比原生属性更像 JS 是有意义的。

优化水合作用的不匹配错误

Vue 3.4 对水合不匹配错误消息进行了多项优化:

  1. 提高了措辞的清晰度(SSR vs 客户端预期渲染)。
  2. 该消息现在包含有问题的 DOM 节点,因此您可以在页面或元素面板中快速定位它。
  3. 水合不匹配检查现在也适用于类、样式和其他动态绑定属性。

此外,Vue 3.4 还新增了一个编译时标志 __VUE_PROD_HYDRATION_MISMATCH_DETAILS__,它可用于强制水合不匹配错误包含完整的详细信息,即使是在生产环境。

错误代码和编译时标志参考

为了减小打包体积,Vue 在生产构建中移除了长错误消息字符串。虽然但是,这意味着,生产中的错误处理程序捕获的错误会收到简短的错误代码,如果不深入 Vue 的源代码,这些代码难以破译。

为了改良这一点,我们在文档中新增了生产错误参考页面。错误代码会在 Vue 最新稳定版自动生成。

我们还添加了编译时标志参考,其中包含有关如何为不同构建工具配置这些标志的说明。

移除已废弃功能

全局 JSX 命名空间

从 Vue 3.4 开始,Vue 默认不再注册全局 JSX 命名空间。这对于避免与 React 的全局命名空间冲突是必要的,这样这两个库的 TSX 才可以在同一项目中共存。这不会影响使用最新版本 Volar 的仅 SFC 用户。

如果您使用 TSX,有两种选择:

  1. 在升级到 Vue 3.4 之前,请将 tsconfig.json 中的 jsxImportSource 显式设置为 'vue'。您还可以通过在文件顶部添加 /* @jsxImportSource vue */ 注释,在每个文件选择弃启用。
  2. 如果您的代码依赖全局 JSX 命名空间的存在,比如使用 JSX.Element 等类型,您可以显式引用 vue/jsx,注册全局 JSX 命名空间,明确保留 Vue 3.4 之前的全局行为。

其他已移除功能

  • 响应性转换在 Vue 3.3 中被标记为已废弃,现已在 Vue 3.4 中移除。由于该功能处于实验阶段,因此此变更不要求主版本升级。希望继续使用该功能的用户可以诉诸 Vue Macros 插件来实现。
  • app.config.unwrapInjectedRef 已移除。它已废弃,且在 Vue 3.3 中默认启用。在 Vue 3.4 中,无法再禁用此行为。
  • 模板中的 @vnodeXXX 事件侦听器现在是编译器错误,而不是废弃警告。请改用 @vue:XXX 侦听器。
  • v-is 指令已被移除。它在 Vue 3.3 中已废弃。请改用带有 vue: 前缀的 is 属性。

《前端 9 点半》每日更新,持续关注,坚持阅读,每天一次,进步一点。

谢谢大家的点赞,掰掰~

相关推荐
gnip17 小时前
链式调用和延迟执行
前端·javascript
SoaringHeart17 小时前
Flutter组件封装:页面点击事件拦截
前端·flutter
杨天天.17 小时前
小程序原生实现音频播放器,下一首上一首切换,拖动进度条等功能
前端·javascript·小程序·音视频
Dragon Wu17 小时前
React state在setInterval里未获取最新值的问题
前端·javascript·react.js·前端框架
Jinuss17 小时前
Vue3源码reactivity响应式篇之watch实现
前端·vue3
YU大宗师17 小时前
React面试题
前端·javascript·react.js
木兮xg17 小时前
react基础篇
前端·react.js·前端框架
ssshooter18 小时前
你知道怎么用 pnpm 临时给某个库打补丁吗?
前端·面试·npm
IT利刃出鞘18 小时前
HTML--最简的二级菜单页面
前端·html
yume_sibai19 小时前
HTML HTML基础(4)
前端·html