本文最后更新于 68 天前,其中的信息可能已经有所发展或是发生改变。
| |
| Object.defineProperty(obj, key, { |
| get() { }, |
| set(newVal) { } |
| }) |
| |
| |
| const reactive = (target) => { |
| return new Proxy(target, { |
| get(target, key) { }, |
| set(target, key, value) { } |
| }) |
| } |
| + 支持数组索引变化检测 |
| + 自动追踪动态添加的属性 |
| + 更好的Map/Set支持 |
| |
| - 放弃IE11以下兼容性 |
| |
| function patchVnode(oldVnode, vnode) { } |
| |
| |
| const render = () => { |
| _createBlock("div", null, [ |
| _hoisted_1, |
| _createVNode("p", { class: _ctx.dynamicClass }, ...) |
| ]) |
| } |
| |
| <script> |
| export default { |
| data() { return { count: 0 } }, |
| computed: { double() { return this.count * 2 } }, |
| methods: { increment() { this.count++ } } |
| } |
| </script> |
| |
| |
| <script setup> |
| import { ref, computed } from 'vue' |
| |
| const count = ref(0) |
| const double = computed(() => count.value * 2) |
| const increment = () => count.value++ |
| </script> |
Vue2 生命周期 |
Vue3 生命周期 |
变化说明 |
beforeCreate |
setup() |
合并到 setup 阶段 |
created |
setup() |
合并到 setup 阶段 |
beforeMount |
onBeforeMount |
命名更语义化 |
mounted |
onMounted |
– |
beforeUpdate |
onBeforeUpdate |
– |
updated |
onUpdated |
– |
beforeDestroy |
onBeforeUnmount |
命名更准确 |
destroyed |
onUnmounted |
命名更准确 |
| |
| import { createApp, ref } from 'vue' |
| |
| |
| import Vue from 'vue' |
测试场景 |
Vue2 FPS |
Vue3 FPS |
提升幅度 |
静态节点更新 |
120 |
240 |
100% |
大规模列表渲染 |
45 |
85 |
89% |
复杂组件树更新 |
32 |
58 |
81% |
| |
| <template> |
| <div> |
| <header/> |
| <main/> |
| </div> |
| </template> |
| |
| |
| <template> |
| <header/> |
| <main/> |
| <footer/> |
| </template> |
| <template> |
| <teleport to="#modal-root"> |
| <div class="modal"> |
| <slot/> |
| </div> |
| </teleport> |
| </template> |
| |
| const { createRenderer } = require('vue') |
| const { nodeOps, patchProp } = require('./webgl-renderer') |
| |
| createRenderer({ ...nodeOps, patchProp }).createApp(App).mount('#gl-canvas') |
| |
| import { createApp } from 'vue' |
| import Vue2App from './legacy/Vue2App.vue' |
| |
| const app = createApp({ |
| components: { Vue2App }, |
| template: `<div> |
| <vue2-app/> |
| <vue3-component/> |
| </div>` |
| }) |
| // 使用Vue2风格写法 |
| app.config.compatConfig = { |
| MODE: 2, // 启用兼容模式 |
| ATTR_FALSE_VALUE: false |
| } |
| |
| - Vue.prototype.$bus = new Vue() |
| + import mitt from 'mitt' |
| + const bus = mitt() |
考量维度 |
Vue2 优势场景 |
Vue3 推荐场景 |
项目规模 |
小型维护中项目 |
新项目 / 大型复杂应用 |
团队技能 |
熟悉选项式 API 团队 |
追求现代化开发的团队 |
性能需求 |
常规性能要求 |
高并发 / 复杂交互场景 |
维护周期 |
短期维护 |
长期迭代项目 |
TypeScript |
基本支持 |
原生深度支持 |
| + 立即体验Vue3新特性:https://vue3-demo.org |
| + 官方迁移指南:https://v3-migration.vuejs.org |
| - 注意:IE11支持需要额外polyfill |
升级决策公式:
(项目复杂度 × 维护周期) + (团队技能 × 性能需求) > 迁移成本
当公式成立时,建议升级到 Vue3