Vue 团队欣喜地宣布,Vue 3.5(代号 Tengen Toppa Gurren Lagann)于9月初发布!本次小版本更新并未引入任何破坏性更改,带来了诸多内部优化以及新功能。在这篇文章中,我们将重点介绍一些新特性和改进。如需了解全部更新内容,请参阅 GitHub 上的完整更新日志。
最近 突然想整理一些前端框架版本更新的历史,想到就开始吧
这是9月后开启的版本,其实vue的更新都比较保守,实际上很多内容都是大版本更新的
我比较印象深刻的改动:
- 数组优化
- teleport defer支持 (这个是真的很好,之前出现过很多次,需要手动setTimeout,因为要挂载到别的组件的某个元素,但那个组件的渲染是慢一丢丢的就会出问题)
1. 响应式系统优化
Vue 3.5 对响应式系统进行了重大重构,性能提升显著,同时内存使用减少了 56%,且行为保持不变。这次重构还解决了 SSR 环境中挂起计算属性导致的内存问题,以及过时的计算值。
此外,对于大型深层响应式数组的追踪操作,性能提升达 10 倍。
详细信息:PR#10397, PR#9511
2. Reactive Props Destructure(响应式属性解构)
响应式属性解构在 3.5 中正式稳定,默认启用。通过 <script setup>
中的 defineProps
,解构的变量现在具有响应式特性。这一功能还支持使用 JavaScript 原生的默认值语法,简化了具有默认值的 prop 声明。
示例:
之前:
const props = withDefaults(defineProps<{count?: numbermsg?: string}>(),{count: 0,msg: 'hello'}
)
现在:
const { count = 0, msg = 'hello' } = defineProps<{count?: numbermsg?: string
}>()
解构后的变量(如 count
)会被编译器自动追踪,因此无需显式绑定到 props。
详细信息:RFC#502
3. SSR 改进
Lazy Hydration(延迟激活)
通过 defineAsyncComponent
的 hydrate
选项,异步组件现在可以指定激活策略。例如,仅在组件可见时激活:
import { defineAsyncComponent, hydrateOnVisible } from 'vue'const AsyncComp = defineAsyncComponent({loader: () => import('./Comp.vue'),hydrate: hydrateOnVisible()
})
详细信息:PR#11458
useId()
新 API useId()
用于生成唯一且跨服务端和客户端稳定的 ID,非常适用于表单元素或无障碍属性:
<script setup>
import { useId } from 'vue'const id = useId()
</script><template><form><label :for="id">Name:</label><input :id="id" type="text" /></form>
</template>
详细信息:PR#11404
data-allow-mismatch
在客户端值与服务端值不可避免会有差异的情况下(如日期),可通过 data-allow-mismatch
属性抑制警告:
<span data-allow-mismatch>{{ data.toLocaleString() }}</span>
4. 自定义元素的增强
Vue 3.5 修复了 defineCustomElement()
的众多历史问题,同时新增以下能力:
- 通过
configureApp
为自定义元素配置应用。 - 新增
useHost()
、useShadowRoot()
和this.$host
API,支持访问宿主元素和 Shadow DOM。 - 支持通过
shadowRoot: false
禁用 Shadow DOM。 - 支持
nonce
选项,为自定义元素注入的<style>
标签提供安全设置。
示例:
import MyElement from './MyElement.ce.vue'defineCustomElements(MyElement, {shadowRoot: false,nonce: 'xxx',configureApp(app) {app.config.errorHandler = ...}
})
5. 其他值得关注的新特性
useTemplateRef()
通过 useTemplateRef()
动态获取模板引用:
<script setup>
import { useTemplateRef } from 'vue'const inputRef = useTemplateRef('input')
</script><template><input ref="input">
</template>
这提升了动态引用的灵活性,并增强了开发体验。
Deferred Teleport(延迟传送)
<Teleport>
组件新增 defer
属性,可延迟目标元素的创建。例如:
<Teleport defer target="#container">...</Teleport>
<div id="container"></div>
详细信息:PR#11387
onWatcherCleanup()
新增 onWatcherCleanup()
API,用于在 watch
中注册清理回调:
import { watch, onWatcherCleanup } from 'vue'watch(id, (newId) => {const controller = new AbortController()fetch(`/api/${newId}`, { signal: controller.signal }).then(() => {// 回调逻辑})onWatcherCleanup(() => {// 终止过期请求controller.abort()})
})
然后今年vue大概更新了3.4 以及3.5两个版本,后面会做个总结,对比下vue和react的年度状况 - 整体来看,vue3进入了稳定器