• vue2升级vue3指南(一)—— 环境准备和构建篇


    1、nodejs和npm

    注意二者的版本,版本过低需要升级,本人升级后的版本如下:

    $ node -v
    v16.15.1
    
    $ npm -v
    8.11.0
    

    2、package.json 和依赖升级

    由于我的项目采用的原架构是vue2+vant2+sass+axios+webpack,由于项目是通过vue-cli搭建的,因此升级完nodejs和npm后,便要对vue-cli进行升级。而后除了vue和webpack需要按照官方迁移构建文档进行升级处理,sass和vant也需要进行升级,vant由v2升级至v3,本着反正要升级的原则,axios也顺便做了升级处理(axios升级不是必须的,不想升级也无所谓)。

    以下是我升级前后相关依赖的版本号对比:
    升级前:

    "dependencies": {
        ...
        "axios": "^0.21.1",
        "vant": "^2.12.40",
        "vue": "^2.6.11",
        "vue-router": "^3.2.0",
        "vuex": "^3.4.0"
        ...
    },
    "devDependencies": {
        ...
        "@vue/cli-plugin-babel": "~4.5.0",
        "@vue/cli-plugin-eslint": "~4.5.0",
        "@vue/cli-plugin-router": "~4.5.0",
        "@vue/cli-plugin-vuex": "~4.5.0",
        "@vue/cli-service": "~4.5.0",
        "node-sass": "^4.14.1",
        "sass-loader": "^8.0.2",
        "vue-template-compiler": "^2.6.11",
        ...
    }
    

    升级后:

    "dependencies": {
        ...
        "axios": "^0.27.2",
        "vant": "^3.5.2",
        "vue": "^3.1.0",
        "vue-router": "^4.1.1",
        "vuex": "^4.0.2"
        ...
    },
    "devDependencies": {
        ...
        "@vue/babel-plugin-jsx": "^1.1.1",
        "@vue/cli-plugin-babel": "^5.0.7",
        "@vue/cli-plugin-eslint": "^5.0.7",
        "@vue/cli-plugin-router": "^5.0.7",
        "@vue/cli-plugin-vuex": "^5.0.7",
        "@vue/cli-service": "^5.0.7",
        "@vue/compiler-sfc": "^3.1.0",
        "node-sass": "^7.0.1",
        "sass-loader": "^13.0.2",
        // "vue-template-compiler": "^2.6.11", // 删除
        ...
    }
    

    3、修改 vue.config.js

    module.exports = {
      ...
      devServer: {
        ...
        // 可以将这部分功能关闭,因为项目虽然可以运行构建,但是文件中还有很多代码警告
        overlay: {
          //  当出现编译器错误或警告时,在浏览器中显示全屏覆盖层
          warnings: false,
          errors: true
        },
        ...
      },
      css: {
        ...
        loaderOptions: {
          scss: {
            // 升级后,属性名需要由 prependData 改为 additionalData
            additionalData:`
              @import "assets/css/mixin.scss";
              @import "assets/css/variables.scss";
              $cdn: "${defaultSettings.$cdn}";
              `
          }
        },
        ...
      },
      chainWebpack: config => {
        ...
        // 添加 vue 别名
        config.resolve.alias
          .set('vue', '@vue/compat')
        ...
        // vue-loader的相关部分也需要进行处理
        // 以下注释部分为原代码
        // config.module
        //   .rule('vue')
        //   .use('vue-loader')
        //   .loader('vue-loader')
        //   .tap(options => {
        //     options.compilerOptions.preserveWhitespace = true
        //     return options
        //   })
        //   .end()
        // 以下为新代码
        config.module
          .rule('vue')
          .use('vue-loader')
          .tap(options => {
            return {
              ...options,
              compilerOptions: {
                compatConfig: {
                  MODE: 2 // 设置为2,表示开启兼容 VUe2 模式
                }
              }
            }
          })
        ...
      },
      ...
    }
    
    折叠

    4、vuex 调整

    升级前,我们使用时写法一般如下:

    import Vue from 'vue'
    import Vuex from 'vuex'
    Vue.use(Vuex)
    const store = new Vuex.Store({
      modules: {
        ...
      },
      ...
    })
    

    升级后,修改为如下写法:

    import { createStore } from 'vuex'
    const store = createStore({
      modules: {
        ...
      },
      ...
    })
    

    5、vue-router 调整

    升级前,我们使用时写法一般如下:

    import Vue from 'vue'
    import Router from 'vue-router'
    
    const constantRouterMap = {
      // 路由配置
      ...
    }
    Vue.use(Router)
    
    const createRouter = () =>
      new Router({
        ...
        routes: constantRouterMap
      })
    
    const router = createRouter()
    export default router
    

    升级后,修改为如下写法:

    import { createRouter, createWebHashHistory } from 'vue-router'
    const constantRouterMap = {
      // 路由配置
      ...
    }
    
    /*
    官方文档说明:
    新的 history 配置取代 mode#
    mode: 'history' 配置已经被一个更灵活的 history 配置所取代。根据你使用的模式,你必须用适当的函数替换它:
    
    "history": createWebHistory()
    "hash": createWebHashHistory()
    "abstract": createMemoryHistory()
    
    更多内容可以参见官方文档:https://router.vuejs.org/zh/guide/migration/index.html#%E6%96%B0%E7%9A%84-history-%E9%85%8D%E7%BD%AE%E5%8F%96%E4%BB%A3-mode
    */
    
    const router = createRouter({
      history: createWebHashHistory(), // hash模式
      scrollBehavior: () => ({ y: 0 }),
      routes: constantRouterMap,
    })
    
    export default router
    

    6、main.js 调整

    升级前,我们使用时写法一般如下:

    import Vue from 'vue'
    import router from './router'
    import store from './store'
    ...
    import util from './utils/export' // 自己封装的全局通用方法库
    // 可以直接这样绑定到VUe的原型链上
    Vue.prototype.$util = util
    ...
    new Vue({
      el: '#app',
      router,
      store,
      render: h => h(App)
    }).$mount('#app')
    

    升级后,修改为如下写法:

    import { createApp } from 'vue'
    import router from './router'
    import store from './store'
    ...
    import util from './utils/export'
    ...
    const app = createApp(App)
    app.use(router)
    app.use(store)
    app.prototype.$util = util
    ...
    app.mount('#app')
    

    7、npm run

    至此,可以执行 npm run servenpm run build 了。不过,升级并没有就此结束,相反,这只是一个开始,我们现在运行的代码还是兼容vue2模式,此外,在运行构建过程中,你会发现,尽管现在是兼容vue2模式,但是你的项目文件中还会有很多语法warning,这需要我们后续排查修改,直到真正完成Vue3的升级。

    参考文献
    用于迁移的构建版本
    VUe-router 从 Vue2 迁移
    vuex 从 3.x 迁移到 4.0
    Vue CLI 文档

    本文链接:https://www.cnblogs.com/xsilence/p/16465770.html

  • 相关阅读:
    (十)Mybatis之动态SQL
    SSM+基于SSM的智慧社区宠物医院 毕业设计-附源码211621
    大专学历,33岁宝妈又怎样?我照样销售转测试,月入13k+
    Landsat Collection 2 数据集详细介绍(T1/T2产品差异)
    RabbitMQ支持的消息模型
    Python 连接数据库添加字段
    【js】Date相关方法总结以及格式化的使用
    囊个搭建自己的图床
    http与https的区别
    读<深入理解Java虚拟机-第3版>
  • 原文地址:https://www.cnblogs.com/xsilence/p/16465770.html