这个升级
对应的代码文件夹架子
以及技术栈层面
代码语法层面
打包编译层面都有影响
把握这四个领域的变化,就可以把握住vue2到vue3的变化了。
我们先讲讲这个打包的影响,我们看看java语言升级,我们需要做什么:
这个就是相当于java8到-java17的区别
看看后端处理的案例:
其实一般来说,
我们有两个步骤
maven打成jar包,
在pom中
指定java语言
2.找对应的jdk版本,jdk17,jdk8去编译jar包
然后才可以启动
由于vue3底层是由于ts写的,所以对应的
运行环境nodejs,通常要换成18+以上的。
第二点就是我们创建vue-cli
这个时候就要有很多变化了
第三点就是使用对应的技术栈
第四点就是,对应的vue语法升级
你总结得非常到位------Vue2 → Vue3 的升级确实可以拆解为这四个维度,而且打包编译是底层基础,它决定了上层工具链能否跑通。下面我沿着你的思路,把这四个领域的关键变化和具体操作讲透,补全"第三点技术栈"和"第四点语法",并给出一个可落地的升级路线图。
一、打包编译层面(你已开篇,我深化)
类比 Java:
| Java | Vue |
|---|---|
| JDK 版本(8 → 17) | Node.js 版本(≥16,推荐18+) |
| Maven/Gradle 构建 | 构建工具(Vue CLI / Vite) |
| pom.xml 指定 language level | package.json 中的依赖版本 + 构建配置 |
| 编译成 jar,用对应 JDK 运行 | 编译成 js bundle,用 node 环境执行构建脚本 |
具体影响与操作:
- Node.js 版本必须升到 18+(Vue3 核心库用 TypeScript 编写,依赖新语法特性,且 Vite 要求较高)。
- 构建工具选择 :
- 旧项目若用 Vue CLI(webpack) ,需升级
@vue/cli-service到 v5,并调整 webpack 配置(如 chainWebpack 中的 loader 规则)。 - 新项目推荐 Vite ,更快,且天然支持 Vue3。迁移时需重写
vite.config.js,替换环境变量process.env为import.meta.env。
- 旧项目若用 Vue CLI(webpack) ,需升级
package.json中关键依赖版本 :"vue": "^3.x""@vue/compiler-sfc": "^3.x"(替代vue-template-compiler)- 若用 Vue CLI:
"@vue/cli-service": "~5.0.0" - 若用 Vite:
"@vitejs/plugin-vue": "^4.x"
- TypeScript 支持 :Vue3 对 TS 更友好,若想用 TS,需安装
typescript及@vue/tsconfig,并配置tsconfig.json。 - 环境变量 :
VUE_APP_*改为VITE_*(Vite)或保持兼容(Vue CLI 仍可用)。
二、代码文件夹架子(项目结构)
Vue2 典型结构(Vue CLI):
src/
assets/
components/
views/
router/index.js
store/index.js (Vuex)
App.vue
main.js
public/
index.html
Vue3 推荐结构(Vite + 组合式 API):
src/
assets/
components/
views/
router/index.js (使用 createRouter)
store/ (Pinia 替代 Vuex)
index.js (createPinia)
composables/ (新增,存放组合式函数)
App.vue
main.js (或 main.ts)
public/
index.html
关键变化:
main.js中实例化方式:
Vue2:new Vue({ router, store, render: h => h(App) }).$mount('#app')
Vue3:createApp(App).use(router).use(pinia).mount('#app')router/index.js:
Vue2:new Router({ mode: 'history', routes })
Vue3:createRouter({ history: createWebHistory(), routes })store:若用 Pinia,store文件夹下每个模块是一个defineStore的实例,不再有 modules 嵌套。- 新增
composables/目录,用于存放可复用的组合式逻辑(替代 mixins)。 public/index.html中挂载点不变,但 Vue3 支持多根节点组件,模板结构更灵活。
三、技术栈层面(必须同步升级的生态库)
| 类别 | Vue2 常用库 | Vue3 兼容版本 / 替代方案 |
|---|---|---|
| 核心 | Vue 2.x | Vue 3.x |
| 路由 | Vue-router 3.x | Vue-router 4.x(使用 createRouter) |
| 状态管理 | Vuex 3.x / 4.x | Pinia (官方推荐,更轻量,组合式 API 友好) 若坚持用 Vuex,需升级到 Vuex 4.x(与 Vue3 兼容但仍有缺陷) |
| UI 组件库 | Element UI, Vuetify 2, Ant Design Vue 1.x | Element Plus, Vuetify 3, Ant Design Vue 2/3.x(大多有破坏性更新) |
| 脚手架 | Vue CLI | Vite(推荐)或继续用 Vue CLI 5 |
| HTTP | axios | 无变化,仍可用 |
| 工具库 | lodash, dayjs | 无变化 |
| 国际化 | vue-i18n 8.x | vue-i18n 9.x(API 变化) |
| 测试 | Jest + @vue/test-utils 1.x | @vue/test-utils 2.x(适配 Vue3) |
关键操作:
- 升级所有依赖到对应版本,注意检查兼容性(可用
npm outdated或npx vue-upgrade辅助)。 - 若使用全局注册(如
Vue.use(ElementUI)),Vue3 改为app.use(ElementPlus)。 - 全局 API 变化:
Vue.prototype改为app.config.globalProperties。
四、语法层面(最核心的代码改动)
这是工作量最大的一块,但也是升级的价值所在。
1. 组件定义方式
- Options API(Vue2 风格) 仍然支持(通过
defineComponent),但推荐 Composition API。 - Composition API :在
setup()中组织逻辑,或使用<script setup>语法糖(最简洁)。
示例对比:
vue
// Vue2
export default {
data() { return { count: 0 } },
methods: { increment() { this.count++ } },
mounted() { console.log('mounted') }
}
vue
// Vue3 (script setup)
<script setup>
import { ref, onMounted } from 'vue'
const count = ref(0)
const increment = () => count.value++
onMounted(() => console.log('mounted'))
</script>
2. 生命周期钩子
| Vue2 | Vue3 (Composition API) |
|---|---|
beforeCreate |
无需(setup 本身) |
created |
无需(setup 本身) |
beforeMount |
onBeforeMount |
mounted |
onMounted |
beforeUpdate |
onBeforeUpdate |
updated |
onUpdated |
beforeDestroy |
onBeforeUnmount |
destroyed |
onUnmounted |
3. 响应式系统
data改为ref/reactive。- 不再有
this.$set,直接通过value或toRefs解构。 - 计算属性:
computed(() => ...)。 - 侦听器:
watch/watchEffect。
4. 组件通信
props声明:defineProps({ ... })(<script setup>)或props: {...}。emit:defineEmits(['update'])。v-model变化:
Vue2:<Child v-model="val" />相当于:value+@input。
Vue3: 默认modelValue+update:modelValue,可支持多个v-model:title。$attrs包含所有未声明的属性,且组件可以绑定多个根节点。- 事件总线(
$bus)被移除,推荐使用mitt或 Pinia。
5. 全局 API 迁移
Vue.filter→ 改为app.config.globalProperties或直接用方法。Vue.directive→app.directive。Vue.mixin→app.mixin(不推荐,改用 composables)。Vue.extend→ 不再需要,直接使用defineComponent或普通对象。
6. 其他细节
async组件:defineAsyncComponent。- 渲染函数:
h函数参数变化(扁平化)。 - 自定义指令钩子名称改变(
bind→beforeMount,inserted→mounted等)。
五、升级路线图(四维度统筹)
- 环境准备:升级 Node.js → 18+,更新 npm/pnpm。
- 打包工具:决定继续用 Vue CLI 5 还是切到 Vite(若项目复杂,可先保留 Vue CLI 降低风险)。
- 依赖升级 :在
package.json中批量更新所有相关库至 Vue3 兼容版本(可借助vue-upgrade工具辅助识别)。 - 代码迁移(分模块) :
- 先修改
main.js、router、store(改为 Pinia)。 - 再逐个组件转换:从 Options API 逐步改为 Composition API(可先保持 Options 运行,后续重构)。
- 处理全局注册、混入、指令等。
- 先修改
- 语法调整 :根据 ESLint 报错和运行时警告逐一修复(如
v-model、事件侦听器等)。 - 测试与构建 :确保
npm run build通过,并验证生产环境。
六、工具辅助
- 官方迁移指南:https://v3-migration.vuejs.org/
- 迁移构建(Migration Build):Vue3 提供了一个兼容模式,可同时运行 Vue2 和 Vue3 代码,逐步迁移。
- 自动化工具 :
@vue/compat(已废弃,不推荐),建议手动升级。 - 代码检查 :
eslint-plugin-vue升级到 v9,开启vue/setup-compiler-macros等规则。
最后,打包编译是地基 ,它决定了你的开发环境能否启动;文件夹架子 体现项目组织思想的变化;技术栈 是生态配合;语法 是每天写代码的触点。四个维度相互依赖,但可以分步推进,不必一次性全改。先让项目跑起来(打包编译 + 技术栈),再逐步优化语法和结构,是最稳妥的策略。
如果你们团队正在规划升级,可以先跑一个"试点模块"验证流程,再铺开全项目。有任何具体问题(比如某个库的迁移细节),随时可以继续追问。祝升级顺利!🚀