vue-cli迁移Vite实战

21

动机

Vite:

  • 快速冷启动

  • 即时热模块替换

  • 生产环境优化

  • 10x以上的性能优化

最主要的原因还是因为Vite热编译速度快,而且随着vite来到了5.x版本,已经可以作为生产版本,遂准备升级。

流程

修改package.json

删除vue-cli相关插件:

    # 删除vue-cli 相关插件
    "@vue/cli-plugin-babel": "~4.5.0",
    "@vue/cli-plugin-eslint": "~4.5.0",
    "@vue/cli-service": "~4.5.0",
    "@vue/compiler-sfc": "^3.0.0",
    # 由于vite的打包方式从Webpack变更为了Rollup,所以同时需要删除Webpack相关插件
    "@open-wc/webpack-import-meta-loader": "^0.4.7",
    "compression-webpack-plugin": "^6.1.1",
    # 删除babel相关插件
    "babel-eslint": "^10.1.0",
    # 删除sass相关插件
    "sass-loader": "^8.0.2",

然后安装vite核心插件

npm install --save-dev vite @vitejs/plugin-vue

最后的部分package.json如下所示,主要修改了启动脚本和开发环境。

  "scripts": {
    "dev": "vite",
    "serve": "vite",
    "build": "vite build",
    "preview": "vite preview"
  },  

"devDependencies": {
    "@vitejs/plugin-vue": "^5.1.5",
    "bootstrap": "^5.1.3",
    "eslint": "^6.7.2",
    "eslint-plugin-vue": "^7.0.0",
    "lint-staged": "^9.5.0",
    "unplugin-auto-import": "^0.11.2",
    "unplugin-vue-components": "^0.22.4",
    "uuid": "^9.0.0",
    "vite": "^5.4.11",
    "vite-plugin-compression": "^0.5.1",
    "vue-router": "^4.0.12",
    "vuex": "^4.0.2"
  },

修改index.html

Vite相比vue-cli的第二点不同是入口文件不同。我们需要将public/index.html首先迁移到根目录下的index.html

同时,Vite 将 HTML 文件作为应用的入口,通过 <script type="module"> 标签引入 JavaScript 模块。我们在index.html中引入这个脚本,并将src指向main.js: <script type="module" src="/src/main.js"></script>

与webpack有关的变量手动替换:

<!--  <title><%= htmlWebpackPlugin.options.title %></title>-->
  <title>XXXX博客</title>

vite 不再使用 node 的环境变量加载,而是将环境变量在一个特殊的对象上暴露,这个对象即是 import.meta.env, 并且 .env 文件只有 VITE_ 前缀的变量才会被 vite 处理,全局搜一下这些变量然后替换掉。

修改配置

新建vite.config.js,依据vue.config,js将配置文件迁移到新的配置文件中,这里原本的vue-cli项目中采用了compression-webpack-plugin 插件做压缩,所以这里替换为vite-plugin-compression

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
import viteCompression from 'vite-plugin-compression'

function resolve(dir) {
    return path.join(__dirname, dir)
}

// https://vitejs.dev/config/
export default defineConfig({
    plugins: [
        vue(),
        viteCompression({
            algorithm: 'gzip',
            ext: '.gz',
            threshold: 10240,
            minRatio: 0.8,
            deleteOriginFile: false
        })
    ],
    base: './',
    build: {
        outDir: 'dist',
        assetsDir: 'static',
        sourcemap: false, // 对应 productionSourceMap
        rollupOptions: {
            external: ['Cesium', 'echarts']
        }
    },
    server: {
        host: '0.0.0.0',
        port: 8080,
        proxy: {
          ...//填入相关代理
        }
    },
    resolve: {
        extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'],
        alias: {
            '@': path.resolve(__dirname, './src')
        }
    }
})

注意extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue'] 是为了在js里导入vue文件的时候,让框架自己尝试补全,因为 vite 导入文件的时候必须指定完整的文件名,而 vue-cli-service 是可以省略文件名后缀的,我们同样可以用正则匹配的方式补全所有省略的.vue后缀。

然后,成功!享受飞一般的构建过程!