Vue 3.4 灌篮高手
昨天,Vue3.4灌篮高手🏀正式发布,此版本包括一些实质性的内部改进-最值得注意的是重写的模板解析器,速度提高了2倍,以及重构的反应系统,使效果触发更加准确和高效。它还打包了大量的生活质量API改进,包括defineModel的稳定和绑定道具时的同名简写。
有关更改的完整列表,请参阅GitHub 上的完整更改日志。
依赖关系更新,升级到 3.4 时,建议同时更新以下依赖项:
- Volar / vue-tsc@^1.8.27
- vite@^5.0.0
- @vitejs/plugin-vue@^5.0.0
- vue-loader@^17.4.0 (如果使用 webpack 或 vue-cli)
一、功能亮点
1. 2倍更快的解析器和改进的SFC构建性能
Vue3.4完全重写了模板解析器。以前,Vue使用递归下降解析器,依赖于许多正则表达式和前瞻搜索。新的解析器使用基于htmlparser2中的标记器的状态机标记器,它只遍历整个模板字符串一次。结果是,对于所有大小的模板,解析器的速度始终是原来的两倍。得益于广泛的测试用例和ecosystem-ci,它对Vue终端用户也是100%向后兼容的。
基准测试显示,在编译Vue SFC的脚本和模板部分时,同时生成源代码映射时,性能提高了约44%,因此3.4应该会为大多数使用Vue SFC的项目带来更快的构建速度。但是,请注意,Vue SFC编译只是真实的项目中整个构建过程的一部分。与孤立的基准测试相比,端到端构建时间的最终增益可能要小得多。
在Vue核心之外,新的解析器也将有利于Volar / vue-tsc的性能,以及需要解析Vue SFC或模板的社区插件,例如Vue Macros。
Context:PR#9647
2. 更高效的反应系统
Vue3.4还提供了反应性系统的大量重构,目的是提高计算属性的重新计算效率。
为了说明正在改进的内容,让我们考虑以下场景:
const count = ref(0)
const isEven = computed(() => count.value % 2 === 0)
watchEffect(() => console.log(isEven.value)) // logs true
count.value = 2 // logs true again在Vue 3.4之前,每当count.value被更改时,即使计算结果保持不变,watchEffect的回调也会被触发。在Vue3.4之后的优化中,回调现在仅在计算结果实际发生变化时才会触发。
此外,在Vue3.4中:
- 多个计算的深度变化只会触发一次同步效果。
- 数组 shift 、 unshift 、 splice 方法只触发一次同步效果。
除了基准测试中显示的收益之外,这应该在许多场景中减少不必要的组件重新呈现,同时保持完全的向后兼容性。
Context: PR#5912
3. defineModel 稳定
defineModel是一个新的<script setup>宏 ,旨在简化支持v-model的组件的实现。它以前在Vue3.3中作为实验特性发布,并在3.4中逐渐稳定。它现在还为使用 v-model 修饰符提供了更好的支持:
// making the v-model required
const model1 = defineModel({ required: true })
// providing a default value
const model2 = defineModel({ default: 0 })
// providing a default value and making it required
const model3 = defineModel('title', { required: true })
// providing a type
const model4 = defineModel({ type: String })
// or use in ts
const model5 = defineModel<string>()
// default model with options, required removes possible undefined values
const model6 = defineModel<string>({ required: true })
const [modelValue, modifiers] = defineModel<string, 'trim' | 'uppercase'>()Context:RFC#503
4. v-bind 同名速记
<!-- before -->
<img :id="id" :src="src" :alt="alt" />
<!-- after -->
<img :id :src :alt />Context:PR#9451
5. watch支持once选项
现在,watch 支持一个新的 once 选项,它将使回调只触发一次:
watch(
() => state.count,
() => {
// do something
},
{ once: true }
)Context:PR#9034
二、删除的功能
响应性语法糖在3.3中被标记为弃用,现在在3.4中被删除。由于该功能是实验性的,因此此更改不需要专业人员。希望继续使用该功能的用户可以通过Vue Macros插件进行操作。app.config.unwrapInjectedRef 已删除。它在3.3中被弃用并默认启用。在3.4中,不再可能禁用此行为。
模板中的 @vnodeXXX 事件侦听器现在是编译器错误而不是弃用警告。使用 @vue:XXX 监听器代替。
v-is 指令已删除。它在3.3中被弃用。请改用带 vue: 前缀的 is 属性。
三、其他改动
剩余改动🤪:https://blog.vuejs.org/posts/vue-3-4#improved-hydration-mismatch-errors
