1) Editor 改 defineAsyncComponent,IEditorConfig 改 import type 2) dev server 绑定 :: 双栈,避免 Windows 下 localhost 走 ::1 超时 3) dev 脚本去掉 POSIX 环境变量前缀,Windows 可直接 pnpm dev
165 lines
4.6 KiB
TypeScript
165 lines
4.6 KiB
TypeScript
import { resolve } from 'path'
|
||
import { loadEnv } from 'vite'
|
||
import type { UserConfig, ConfigEnv } from 'vite'
|
||
import Vue from '@vitejs/plugin-vue'
|
||
import VueJsx from '@vitejs/plugin-vue-jsx'
|
||
import progress from 'vite-plugin-progress'
|
||
import { ViteEjsPlugin } from "vite-plugin-ejs"
|
||
import PurgeIcons from 'vite-plugin-purge-icons'
|
||
import VueI18nPlugin from "@intlify/unplugin-vue-i18n/vite"
|
||
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
|
||
import { createStyleImportPlugin, ElementPlusResolve } from 'vite-plugin-style-import'
|
||
import UnoCSS from 'unocss/vite'
|
||
import { visualizer } from 'rollup-plugin-visualizer'
|
||
|
||
// https://vitejs.dev/config/
|
||
const root = process.cwd()
|
||
|
||
function pathResolve(dir: string) {
|
||
return resolve(root, '.', dir)
|
||
}
|
||
|
||
export default ({ command, mode }: ConfigEnv): UserConfig => {
|
||
let env = {} as any
|
||
const isBuild = command === 'build'
|
||
if (!isBuild) {
|
||
env = loadEnv((process.argv[3] === '--mode' ? process.argv[4] : process.argv[3]), root)
|
||
} else {
|
||
env = loadEnv(mode, root)
|
||
}
|
||
return {
|
||
base: env.VITE_BASE_PATH,
|
||
plugins: [
|
||
Vue({
|
||
script: {
|
||
// 开启defineModel
|
||
defineModel: true
|
||
}
|
||
}),
|
||
VueJsx(),
|
||
progress(),
|
||
env.VITE_USE_ALL_ELEMENT_PLUS_STYLE === 'false'
|
||
? createStyleImportPlugin({
|
||
resolves: [ElementPlusResolve()],
|
||
libs: [
|
||
{
|
||
libraryName: 'element-plus',
|
||
esModule: true,
|
||
resolveStyle: (name) => {
|
||
if (name === 'click-outside') {
|
||
return ''
|
||
}
|
||
return `element-plus/es/components/${name.replace(/^el-/, '')}/style/css`
|
||
}
|
||
}
|
||
]
|
||
})
|
||
: undefined,
|
||
VueI18nPlugin({
|
||
runtimeOnly: true,
|
||
compositionOnly: true,
|
||
include: [resolve(__dirname, 'src/locales/**')]
|
||
}),
|
||
createSvgIconsPlugin({
|
||
iconDirs: [pathResolve('src/assets/svgs')],
|
||
symbolId: 'icon-[dir]-[name]',
|
||
svgoOptions: true
|
||
}),
|
||
PurgeIcons(),
|
||
ViteEjsPlugin({
|
||
title: env.VITE_APP_TITLE
|
||
}),
|
||
UnoCSS(),
|
||
// sveltekit(),
|
||
],
|
||
|
||
css: {
|
||
preprocessorOptions: {
|
||
less: {
|
||
additionalData: '@import "./src/styles/variables.module.less";',
|
||
javascriptEnabled: true
|
||
}
|
||
}
|
||
},
|
||
resolve: {
|
||
extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.less', '.css'],
|
||
alias: [
|
||
{
|
||
find: 'vue-i18n',
|
||
replacement: 'vue-i18n/dist/vue-i18n.cjs.js'
|
||
},
|
||
{
|
||
find: /\@\//,
|
||
replacement: `${pathResolve('src')}/`
|
||
}
|
||
]
|
||
},
|
||
esbuild: {
|
||
pure: env.VITE_DROP_CONSOLE === 'true' ? ['console.log'] : undefined,
|
||
drop: env.VITE_DROP_DEBUGGER === 'true' ? ['debugger'] : undefined
|
||
},
|
||
build: {
|
||
target: 'es2015',
|
||
outDir: env.VITE_OUT_DIR || 'dist',
|
||
sourcemap: env.VITE_SOURCEMAP === 'true',
|
||
// brotliSize: false,
|
||
rollupOptions: {
|
||
plugins: env.VITE_USE_BUNDLE_ANALYZER === 'true' ? [visualizer()] : undefined,
|
||
// 拆包
|
||
output: {
|
||
manualChunks: {
|
||
'vue-chunks': ['vue', 'vue-router', 'pinia', 'vue-i18n'],
|
||
'element-plus': ['element-plus'],
|
||
'wang-editor': ['@wangeditor/editor', '@wangeditor/editor-for-vue']
|
||
}
|
||
}
|
||
},
|
||
cssCodeSplit: !(env.VITE_USE_CSS_SPLIT === 'false')
|
||
},
|
||
server: {
|
||
port: 3005,
|
||
proxy: {
|
||
// 选项写法
|
||
'/api': {
|
||
target: 'http://127.0.0.1:8000',
|
||
changeOrigin: true,
|
||
rewrite: path => path.replace(/^\/api/, '')
|
||
},
|
||
// 短剧服务管理端接口
|
||
'/admin': {
|
||
target: 'http://127.0.0.1:8080',
|
||
changeOrigin: true
|
||
},
|
||
// 本地媒资(封面、视频)
|
||
'/files': {
|
||
target: 'http://127.0.0.1:8080',
|
||
changeOrigin: true
|
||
}
|
||
},
|
||
hmr: {
|
||
overlay: false
|
||
},
|
||
// 必须同时监听 IPv6:Windows 上 localhost 先解析成 ::1,
|
||
// 只绑 0.0.0.0 会让每次新建连接都等 IPv6 超时(约 2s)再回退到 IPv4,
|
||
// 表现为页面白屏很久。'::' 是双栈,IPv4 局域网访问同样可用。
|
||
host: '::'
|
||
},
|
||
optimizeDeps: {
|
||
include: [
|
||
'vue',
|
||
'vue-router',
|
||
'vue-types',
|
||
'element-plus/es/locale/lang/zh-cn',
|
||
'element-plus/es/locale/lang/en',
|
||
'@iconify/iconify',
|
||
'@vueuse/core',
|
||
'axios',
|
||
'qs',
|
||
'@zxcvbn-ts/core',
|
||
'dayjs',
|
||
'xgplayer'
|
||
]
|
||
}
|
||
}
|
||
}
|