一、公共资源CDN引入
import importToCDN from 'vite-plugin-cdn-import'
export default function createImportCDN() {
return importToCDN({
modules: [
{
name: 'vue',
var: 'Vue',
path: 'https://cdn.jsdelivr.net/npm/vue@3.2.38/dist/vue.global.prod.js'
},
{
name: 'vue-router',
var: 'VueRouter',
path: 'https://unpkg.com/vue-router@4.1.5/dist/vue-router.global.prod.js'
},
{
name: 'element-plus',
var: 'ElementPlus',
path: `https://unpkg.com/element-plus@2.2.36/dist/index.full.js`,
css: 'https://unpkg.com/element-plus/dist/index.css'
},
{
name: 'vue-demi',
var: 'VueDemi',
path: 'https://cdn.bootcdn.net/ajax/libs/vue-demi/0.13.11/index.iife.js'
},
{
name: 'pinia',
var: 'Pinia',
path: 'https://cdn.bootcdn.net/ajax/libs/pinia/2.0.32/pinia.iife.prod.min.js'
},
{
name: 'echarts',
var: 'Echarts',
path: 'https://cdn.bootcdn.net/ajax/libs/echarts/5.3.2/echarts.min.js'
}
]
})
}
import createImportCDN from './cdnImport'
export default function createVitePlugins() {
vitePlugins.push(createImportCDN())
return vitePlugins
}
import { defineConfig, loadEnv } from 'vite'
import createVitePlugins from './vite'
export default defineConfig(({ mode, command }) => {
return {
plugins: createVitePlugins(),
build: {
rollupOptions: {
external: ['vue', 'pinia', 'vue-router', 'element-plus', 'echarts'],
},
},
}
})
二 、echarts按需加载
import * as echarts from 'echarts/core';
import {
BarChart,
PieChart,
MapChart,
LineChart,
LinesChart,
ScatterChart
} from 'echarts/charts';
import {
TitleComponent,
TooltipComponent,
GridComponent,
LegendComponent,
PolarComponent
} from 'echarts/components';
import {
CanvasRenderer
} from 'echarts/renderers';
echarts.use(
[
TitleComponent,
TooltipComponent,
GridComponent,
LegendComponent,
BarChart,
CanvasRenderer,
PieChart,
LineChart,
MapChart,
LinesChart,
ScatterChart,
PolarComponent
]
)
export default echarts
import { createApp } from 'vue'
import echarts from './utils/echarts'
const app = createApp(App)
app.config.globalProperties.$echarts = echarts;
<template>
<div class="echarts-box">
<div id="myEcharts" :style="{ width: '900px', height: '900px' }"></div>
</div>
</template>
import { onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance() as any;
onMounted(() => {
echartInit();
});
const echartInit = () => {
var myChart = proxy.$echarts.init(document.getElementById("myEcharts"));
var option = {
};
myChart.setOption(option);
document.getElementById("myEcharts").setAttribute("_echarts_instance_", "");
};
三、vite-plugin-imagemin图片压缩
"resolutions": {
"bin-wrapper": "npm:bin-wrapper-china"
}
import viteImagemin from 'vite-plugin-imagemin'
export default function createViteImage() {
return viteImagemin({
gifsicle: {
optimizationLevel: 7,
interlaced: false,
},
optipng: {
optimizationLevel: 7,
},
mozjpeg: {
quality: 20,
},
pngquant: {
quality: [0.8, 0.9],
speed: 4,
},
svgo: {
plugins: [
{
name: 'removeViewBox',
},
{
name: 'removeEmptyAttrs',
active: false,
},
],
},
})
}
import { defineConfig, loadEnv } from 'vite'
import createViteImage from './viteImage'
export default function createVitePlugins() {
vitePlugins.push(createViteImage())
return vitePlugins
}
import createVitePlugins from './vite'
export default defineConfig(({ mode, command }) => {
return {
plugins: createVitePlugins(),
})
四、vite-plugin-compression进行gzip压缩
import compressPlugin from "vite-plugin-compression";
export default function configCompressPlugin(env) {
const { VITE_BUILD_COMPRESS } = env
const plugin = []
if (VITE_BUILD_COMPRESS) {
const compressList = VITE_BUILD_COMPRESS.split(',')
if (compressList.includes('gzip')) {
plugin.push(
compressPlugin({
ext: '.gz',
deleteOriginFile: false
})
)
}
if (compressList.includes('brotli')) {
plugin.push(
compressPlugin({
ext: '.br',
algorithm: 'brotliCompress',
deleteOriginFile: false
})
)
}
}
return plugin
}
import configCompressPlugin from './compression'
export default function createVitePlugins(viteEnv, isBuild = false) {
isBuild && vitePlugins.push(...configCompressPlugin(viteEnv))
return vitePlugins
}
import { defineConfig, loadEnv } from 'vite'
import createVitePlugins from './vite'
export default defineConfig(({ mode, command }) => {
const env = loadEnv(mode, process.cwd())
const { VITE_APP_ENV } = env
return {
plugins: createVitePlugins(env, command === 'build'),
})
五、常规配置
import { fileURLToPath, URL } from 'node:url'
import { defineConfig, loadEnv } from 'vite'
import createVitePlugins from './vite'
export default defineConfig(({ mode, command }) => {
const env = loadEnv(mode, process.cwd())
const { VITE_APP_ENV } = env
return {
base: VITE_APP_ENV === 'production' ? './' : '/',
plugins: createVitePlugins(env, command === 'build'),
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
},
},
server: {
port: 80,
open: true,
host: '0.0.0.0'
},
build: {
chunkSizeWarningLimit: 1500,
minify: 'terser',
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true
}
},
rollupOptions: {
output: {
chunkFileNames: 'js/[name]-[hash].js',
entryFileNames: 'js/[name]-[hash].js',
manualChunks(id) {
if (id.includes('node_modules')) {
return id.toString().split('node_modules/')[1].split('/')[0].toString()
}
}
},
external: ['vue', 'pinia', 'vue-router', 'element-plus', 'echarts'],
},
},
}
})