Vue2项目打包方式webpack升级vite
配置文件
vite.config.ts
源代码
ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue2'
import vueJsx from '@vitejs/plugin-vue2-jsx'
import createSvgSpritePlugin from 'vite-plugin-svg-sprite'
const path = require('path')
import legacy from '@vitejs/plugin-legacy'
export default defineConfig(({ mode }) => {
const configFile = require(`./config/${mode}.env.js`)
const defineMap = {}
// 解决vite不兼容process.env
Object.keys(configFile).forEach(key => {
defineMap[`process.env.${key}`] = JSON.stringify(configFile[key])
})
return {
build: {
target: 'es2015'
},
plugins: [
vue(),
vueJsx(), // 兼容jsx语法
createSvgSpritePlugin({
symbolId: 'icon-[name]'
}), // 兼容svg图片
legacy({
targets: ['chrome >= 65', 'edge >= 79', 'safari >= 11.1', 'firefox >= 67'],
ignoreBrowserslistConfig: true,
renderLegacyChunks: false,
additionalLegacyPolyfills: ['regenerator-runtime/runtime'],
modernPolyfills: true
}) // 兼容部分老旧浏览器
],
server: {
host: '0.0.0.0',
port: 9700,
open: false, //自动打开
proxy: {
'/web': {
target: 'http://www.dev.com', // 开发环境
// target: 'http://www.test.com', // 测试环境
changeOrigin: true
}
}
},
define: defineMap,
esbuild: {
pure: ['console.log'],
drop: ['debugger'],
target: 'es2015'
},
resolve: {
alias: {
'@': path.resolve(__dirname, 'src')
},
extensions: ['.vue', '.mjs', '.js', '.ts', '.jsx', '.tsx', '.json']
}
}
})
升级结果
- 升级完成项目启动由约3min多减少约2s内
- 代码更新效果时间约10s减少到无感
- 代码包体积减少1/4以上
- 打包时间减少2/5左右
升级流程
一、安装依赖
js
npm install vue@2.7.14
npm install vite
npm install vite-plugin-vue2
npm install vite-plugin-svg-sprite
npm install vitejs/plugin-legacy
npm install -D sass
plugin | 说明 |
---|---|
vue@2.7.14 | vue2已经是最终版了,直接升级到2.7.14,这样才可以兼容vite同样 elementUI应该也是最终版了,建议升级最终版 |
vite | 使用vite打包 |
vite-plugin-vue2 | 兼容vue2语法 |
vitejs/plugin-vue2-jsx | 兼容vue2的jsx语法 |
vitejs/plugin-legacy | 传统浏览器兼容 |
sass | vite打包需要安装sass,版本过低的sass需要升级sass版本 |
二、修改打包命令
package.json
文件
json
"scripts": {
"dev": "vite --mode dev",
"build:dev": "vite build --mode dev",
"build:test": "vite build --mode test"
},
三、修改vite打包入口
index.html
修改入口文件
html
<script type="module" src="/src/index.js"></script>
四、根目录新建vite.config.ts文件
遇到的问题
css的 /deep/
- vite打包css不可以使用sass的
/deep/
语法 - 全局替换成
::v-deep
webpack中使用require引入文件
vite中需要改成 import
引入
svg字体图标的批量导入变更
js
const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)
盗版浏览器
升级的项目是对外的,遇到了 2345浏览器非官网版本
白屏
报错Uncaught ReferenceError: globalThis is not defined
粗暴的解决方案(暂未有其他解决方案)
js
// 在index.html文件添加
<script>
if (globalThis === 'undefined') {
var globalThis = window
}
</script>
vue2生态升级使用
vue-router的使用
vue2可以使用
ref
和reactive
,没有使用proxy
实现,还是用了defineProperty
的getter, setter
js
<script>
import { useRoute } from 'vue-router';
const route = useRoute();
route.path // /home
</script>
在vue2.7 + vite
中使用vue-router
js
<script>
import { useRoute } from 'vue-router/composables'
const route = useRoute();
</script>