深色模式
Vue 3.6 是 Evan You 在 2025 VueConf 上预览的下一个大版本,核心主题是「编译时优化 + Vapor Mode 正式稳定」。本文基于 RFC 和早期 alpha 版本,分析 3.6 中最值得关注的变化。
响应式系统:Ref Sugar 正式稳定
Ref Sugar($ref、$computed)从实验性功能进入稳定版,彻底解决了 ref.value 的冗余问题。
vue
<script setup lang="ts">
// Vue 3.5:需要 .value
const count = ref(0);
const doubled = computed(() => count.value * 2);
watch(count, (val) => console.log(val));
// Vue 3.6 Ref Sugar:编译期自动脱糖
$ref: let count = 0;
$computed: let doubled = count * 2;
// watch 也可以简化
$watch: count, (val) => console.log(val);
function increment() {
count++; // 不需要 .value
}
// 类型推导完全正确
$ref: let user = { name: '张三', age: 25 };
// user 的类型是 { name: string; age: number }
// 不是 Ref<{ name: string; age: number }>
</script>
<template>
<button @click="increment">{{ count }} ({{ doubled }})</button>
</template>编译器会把 $ref 转换为 ref(),$computed 转换为 computed(),模板中的访问自动添加 .value。这意味着零运行时开销,纯粹是语法糖。
defineProps 解构默认值
3.6 终于支持了 props 解构的默认值声明,不再需要 withDefaults:
vue
<script setup lang="ts">
// Vue 3.5:需要 withDefaults
// const props = withDefaults(defineProps<{ title: string; size?: number }>(), {
// size: 16,
// });
// Vue 3.6:直接解构 + 默认值
const { title, size = 16, color = '#1a1a1a' } = defineProps<{
title: string;
size?: number;
color?: string;
}>();
// 编译器自动处理:解构后的变量仍然是响应式的
// 不需要担心解构丢失响应性
console.log(size); // 直接使用,不需要 props.size
// 复杂默认值也支持
const { items = [], onSelect = () => {} } = defineProps<{
items?: Item[];
onSelect?: (item: Item) => void;
}>();
</script>这个改动消除了 Vue 项目中最常见的代码噪音之一,类型推导也更自然。
组件懒加载改进
vue
<script setup lang="ts">
import { defineAsyncComponent, hydrateOnVisible } from 'vue';
// Vue 3.6 新增:条件性懒加载
const AdminPanel = defineAsyncComponent({
loader: () => import('./AdminPanel.vue'),
// 只有当用户有权限时才加载
condition: () => userStore.isAdmin,
loadingComponent: () => import('./AdminSkeleton.vue'),
// SSR 注水策略
hydrate: hydrateOnVisible(),
});
// 批量预加载
import { prefetchComponents } from 'vue';
function onRouteHover() {
// 鼠标悬停时预加载目标页面
prefetchComponents([
() => import('./Dashboard.vue'),
() => import('./Analytics.vue'),
]);
}
</script>hydrateOnVisible 是 3.6 新增的注水策略——组件进入视口时才注水,大幅减少首屏 JS 执行量。
响应式 Props 解构的陷阱与最佳实践
3.6 的响应式解构虽然方便,但有几个需要注意的点:
vue
<script setup lang="ts">
const { items, filter } = defineProps<{
items: Item[];
filter: string;
}>();
// ❌ 错误:解构后的数组方法不会触发更新
// items.push(newItem); // 不会触发重新渲染
// ✅ 正确:修改操作通过 emit 或 toRef
const emit = defineEmits<{
'update:items': [items: Item[]];
}>();
function addItem(item: Item) {
emit('update:items', [...items, item]);
}
// ✅ 如果确实需要可变的本地副本
import { toRef } from 'vue';
const localItems = toRef(() => items);
// localItems 是一个 Ref,会跟随 props.items 变化
</script>小结
- Ref Sugar 正式稳定,
$ref/$computed消除.value冗余,零运行时开销 - Props 解构支持原生默认值,不再需要
withDefaults包裹 hydrateOnVisible实现视口级注水,优化 SSR 首屏性能- 批量预加载 API 让路由切换更丝滑
- Vue 3.6 的核心策略是「编译期做更多优化,让开发者写更少的胶水代码」