Vue Cli項(xiàng)目重構(gòu)為Vite的方法步驟
我們知道 VueCli 使用的是 webpack 打包工具,而 Vite 是基于 ESM 的打包工具,所以我們可以使用 Vite 來(lái)替換 VueCli,來(lái)提升我們的開(kāi)發(fā)體驗(yàn)。
更新依賴(lài)與 package.json
我們先將項(xiàng)目中的 VueCli 相關(guān)依賴(lài)刪除,然后安裝 Vite 相關(guān)依賴(lài)。
::: tip 包管理工具我們使用 pnpm,如果你使用的是 npm 或 yarn,請(qǐng)自行替換。 :::
- 刪除
VueCli相關(guān)依賴(lài)
pnpm remove @vue/cli-plugin-babel @vue/cli-plugin-eslint @vue/cli-service
- 安裝
Vite相關(guān)依賴(lài)
::: warning 注意 如果你用的是 vue2.6, 請(qǐng)安裝 vite-plugin-vue2, 并且不需要 jsx 支持 :::
pnpm add -D vite @vitejs/plugin-vue @vitejs/plugin-vue2 @vitejs/plugin-vue2-jsx
- 同時(shí)我們可以移除
babel相關(guān)依賴(lài)
pnpm remove -D babel-plugin-dynamic-import-node babel-eslint
- 修改 scripts
修改 package.json 中的 scripts
{
"scripts": {
"dev": "vite --host",
"build:prod": "vite build",
"build:stage": "vite build --mode staging"
}
}配置 Vite
- 創(chuàng)建
vite.config.js,并添加基本配置
import { defineConfig, loadEnv } from 'vite';
// 如果使用的是 vue2.6, 請(qǐng)使用 vite-plugin-vue2
// import { createVuePlugin as vue } from 'vite-plugin-vue2';
import vue from '@vitejs/plugin-vue2';
import { resolve } from 'path';
import rollupNodePolyFill from 'rollup-plugin-node-polyfills';
import { dataToEsm } from '@rollup/pluginutils';
import vueJsx from '@vitejs/plugin-vue2-jsx';
export default ({ mode }) => {
process.env = { ...process.env, ...loadEnv(mode, process.cwd(), '') };
return defineConfig({
plugins: [
// vue2.6
// vue({ jsx: true }),
// vue2.7
vue(),
vueJsx(),
],
server: {
port: 75,
proxy: {
[process.env.VITE_APP_BASE_API]: {
target: process.env.VITE_APP_PROXY_API,
changeOrigin: true,
rewrite: (path) => path.replace(new RegExp(`^${process.env.VITE_APP_BASE_API}`), ''),
},
},
},
resolve: {
alias: {
'@': resolve('src'),
},
extensions: ['.js', '.vue', '.json'],
},
});
};- 如果你的項(xiàng)目中使用了 node 的一些模塊,需要在
resolve.alias中添加對(duì)應(yīng)的 polyfill
::: tip 提示 需要添加 rollup-plugin-node-polyfills 依賴(lài) :::
defineConfig({
// ...
resolve: {
alias: {
'@': resolve('src'),
// 如果你的項(xiàng)目中使用了node的一些模塊,需要在這里添加對(duì)應(yīng)的polyfill,如沒(méi)有配置.js的extensions,需要在末尾添加.js
path: 'rollup-plugin-node-polyfills/polyfills/path',
}
})- 如果你的項(xiàng)目需要使用
build的配置,可以參考如下配置
defineConfig({
// ...
build: {
rollupOptions: {
output: {
chunkFileNames: 'js/[name]-[hash].js',
entryFileNames: 'js/[name]-[hash].js',
assetFileNames: 'assets/[ext]/[name]-[hash][extname]',
// 分離依賴(lài)包
manualChunks: {
vue: ['vue'],
echarts: ['echarts'],
'element-ui': ['element-ui'],
},
},
},
},
});- 移除
vue.config.js - 若你的項(xiàng)目中使用了
jsx,請(qǐng)將 '.js' 文件修改為 '.jsx'
全局替換 Env 變量與 require
- 將所有的
process.env替換為import.meta.env,如:
// 替換前 const uploadFileUrl = process.env.VUE_APP_BASE_API + '/upload'; // 替換后 const uploadFileUrl = import.meta.env.VITE_APP_BASE_API + '/upload';
::: tip 參考正則 process\.env\.VUE_APP_ replace import.meta.env.VITE_APP_ :::
::: danger 注意 請(qǐng)勿將 vite.config.js 中的 process.env 替換為 import.meta.env :::
- 將所有直接導(dǎo)入的
require替換為import,如:
// 替換前
const { version } = require('../../package.json');
// 替換后
import { version } from '../../package.json';::: tip 參考正則 const\s+\{(.+?)\}\s+=\s+require\((.+?)\); replace import {$1} from $2; :::
- 移除動(dòng)態(tài)導(dǎo)入的
require.context,如:
// 替換前
const svgIcons = require.context('@/assets/icons/svg', false, /\.vue$/);
// 替換后
const svgIcons = import.meta.globEager('@/assets/icons/svg'); - 動(dòng)態(tài)導(dǎo)入的 Vue 路由組件需要調(diào)整為
import(),如:
// 替換前
route.component = () => require([`@/views/${route.component}`]);
// 替換后
// 動(dòng)態(tài)導(dǎo)入
const views = import.meta.glob('@/views/**/**.vue');
route.component = views[`@/views/${route.component}.vue`];
// 確定文件路徑的動(dòng)態(tài)導(dǎo)入
// 替換前
route.component = () => require('@/views/index/index');
// 替換后
route.component = () => import('@/views/index/index.vue');調(diào)整 ESLint 配置
移除 babel-eslint parser
// .eslintrc.js
module.exports = {
// ...
// 移除
// parser: 'babel-eslint',
// ...
};調(diào)整 index.html
移動(dòng) public/index.html 至 index.html,并添加 JavaScript 模塊 的引入方式
<!-- ... --> <script type="module" src="/src/main.js"></script> <!-- ... -->
::: tip 提示 <script>標(biāo)簽一般添加在 </body> 前 :::
SVG 支持
- 安裝依賴(lài)
pnpm add -D vite-plugin-svg-icons
- 修改
vite.config.js,參考配置如下:
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
defineConfig({
// ...
plugins: [
// ...
createSvgIconsPlugin({
// 圖標(biāo)文件夾中,所有的svg文件將被轉(zhuǎn)換為svg精靈
iconDirs: [resolve(process.cwd(), 'src/assets/icons/svg')],
// 指定symbolId格式
symbolId: 'icon-[dir]-[name]',
}),
],
});- 添加虛擬模塊至入口文件,如:
// src/main.js // ... import 'virtual:svg-icons-register'; // ...
- 添加
SvgIcon/index.vue組件
<template>
<div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
<svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
<use :xlink:href="iconName" rel="external nofollow" />
</svg>
</template>
<script>
import { isExternal } from '@/utils/validate';
export default {
name: 'SvgIcon',
props: {
iconClass: {
type: String,
required: true,
},
className: {
type: String,
default: '',
},
},
computed: {
isExternal() {
return isExternal(this.iconClass);
},
iconName() {
return `#icon-${this.iconClass}`;
},
svgClass() {
if (this.className) {
return 'svg-icon ' + this.className;
} else {
return 'svg-icon';
}
},
styleExternalIcon() {
return {
mask: `url(${this.iconClass}) no-repeat 50% 50%`,
'-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`,
};
},
},
};
</script>
<style scoped>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
.svg-external-icon {
background-color: currentColor;
mask-size: cover !important;
display: inline-block;
}
</style>總結(jié)
至此,我們已經(jīng)完成了 vue-cli 項(xiàng)目的遷移,接下來(lái)我們可以使用 vite 的各種優(yōu)勢(shì)了。
如果遇到構(gòu)建產(chǎn)物無(wú)法正常使用的情況,請(qǐng)?jiān)谀愕膭?dòng)態(tài)路由中導(dǎo)入 import.meta.glob
參考
到此這篇關(guān)于Vue Cli項(xiàng)目重構(gòu)為Vite的方法步驟的文章就介紹到這了,更多相關(guān)Vue Cli項(xiàng)目重構(gòu)為Vite內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue和webpack項(xiàng)目構(gòu)建過(guò)程常用的npm命令詳解
本文通過(guò)實(shí)例代碼給大家介紹了vue和webpack項(xiàng)目構(gòu)建過(guò)程常用的npm命令,需要的朋友可以參考下2018-06-06
vue3+elementPlus實(shí)現(xiàn)年份選擇器
這篇文章主要為大家詳細(xì)介紹了vue3如何通過(guò)elementPlus實(shí)現(xiàn)一個(gè)簡(jiǎn)單的年份選擇器,文中的示例代碼講解詳細(xì),需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01
vue和thymeleaf相結(jié)合的注意事項(xiàng)詳解
這篇文章主要介紹了vue和thymeleaf相結(jié)合的注意事項(xiàng)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
Vue.js實(shí)現(xiàn)數(shù)據(jù)雙向綁定的代碼示例
在我們使用vue的時(shí)候,當(dāng)數(shù)據(jù)發(fā)生了改變,界面也會(huì)跟著更新,但這并不是理所當(dāng)然的,我們修改數(shù)據(jù)的時(shí)候vue是如何監(jiān)聽(tīng)數(shù)據(jù)的改變以及當(dāng)數(shù)據(jù)發(fā)生改變的時(shí)候vue如何讓界面刷新的,所以本文就給大家講講Vue.js 數(shù)據(jù)雙向綁定是如何實(shí)現(xiàn)的2023-07-07
Vue中用JSON實(shí)現(xiàn)刷新界面不影響倒計(jì)時(shí)
這篇文章主要為大家詳細(xì)介紹了Vue中用JSON實(shí)現(xiàn)刷新界面不影響倒計(jì)時(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10
vue3如何使用watch監(jiān)聽(tīng)props中的數(shù)據(jù)
在vue項(xiàng)目中,父子組件數(shù)據(jù)傳遞是最常見(jiàn)的場(chǎng)景,但是今天在開(kāi)發(fā)過(guò)程中父級(jí)數(shù)據(jù)傳遞到子組件,控制子組件的顯隱,下面這篇文章主要給大家介紹了關(guān)于vue3如何使用watch監(jiān)聽(tīng)props中數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2022-10-10
Vue 針對(duì)瀏覽器參數(shù)過(guò)長(zhǎng)實(shí)現(xiàn)瀏覽器參數(shù)加密解密的操作方法
文章介紹了如何在Vue項(xiàng)目中使用crypto-js庫(kù)對(duì)瀏覽器參數(shù)進(jìn)行加密和解密,以解決參數(shù)過(guò)長(zhǎng)的問(wèn)題,在router/index.js中添加了相關(guān)代碼,并在utils工具類(lèi)中添加了encryption.js和query.js源碼,感興趣的朋友一起看看吧2024-12-12

