175 lines
5.4 KiB
TypeScript
175 lines
5.4 KiB
TypeScript
import { defineConfig, loadEnv } from "vite";
|
||
import path from "path";
|
||
import plugins from "./.build/plugins";
|
||
import { APP_VERSION, APP_NAME } from "./src/config/version";
|
||
|
||
// https://vite.dev/config/
|
||
export default defineConfig((cnf) => {
|
||
|
||
const { mode } = cnf;
|
||
const env = loadEnv(mode, process.cwd());
|
||
const { VITE_APP_ENV } = env;
|
||
return {
|
||
// 注入全局常量,供 index.html 和项目代码使用
|
||
define: {
|
||
__APP_VERSION__: JSON.stringify(APP_VERSION),
|
||
__APP_NAME__: JSON.stringify(APP_NAME),
|
||
},
|
||
base: VITE_APP_ENV === "production" ? "/" : "/",
|
||
plugins: plugins(cnf),
|
||
resolve: {
|
||
alias: {
|
||
"@": path.resolve(__dirname, "./src"),
|
||
"@components": path.resolve(__dirname, "./src/vue-element-plus-y/components"),
|
||
},
|
||
},
|
||
css: {
|
||
// css全局变量使用,@/styles/variable.scss文件
|
||
preprocessorOptions: {
|
||
scss: {
|
||
additionalData: '@use "@/styles/var.scss" as *;',
|
||
},
|
||
},
|
||
},
|
||
|
||
// 构建优化配置
|
||
build: {
|
||
target: 'es2015',
|
||
cssTarget: 'chrome80',
|
||
// 代码分割策略
|
||
rollupOptions: {
|
||
output: {
|
||
// 分包策略 - 更精细的分割以提高加载速度
|
||
manualChunks: (id) => {
|
||
// Vue 核心库
|
||
if (id.includes('node_modules/vue/') || id.includes('node_modules/@vue/') || id.includes('node_modules/vue-router/')) {
|
||
return 'vue-vendor';
|
||
}
|
||
// Pinia 状态管理
|
||
if (id.includes('node_modules/pinia/')) {
|
||
return 'pinia';
|
||
}
|
||
// Element Plus UI 库
|
||
if (id.includes('node_modules/element-plus/') || id.includes('node_modules/@element-plus/')) {
|
||
return 'element-plus';
|
||
}
|
||
// Markdown 相关
|
||
if (id.includes('node_modules/unified/') || id.includes('node_modules/remark-') || id.includes('node_modules/rehype-') || id.includes('node_modules/marked/')) {
|
||
return 'markdown';
|
||
}
|
||
// 工具库
|
||
if (id.includes('node_modules/lodash-es/') || id.includes('node_modules/@vueuse/')) {
|
||
return 'utils';
|
||
}
|
||
// 代码高亮
|
||
if (id.includes('node_modules/highlight.js/') || id.includes('node_modules/shiki/')) {
|
||
return 'highlight';
|
||
}
|
||
// 图表库
|
||
if (id.includes('node_modules/echarts/')) {
|
||
return 'echarts';
|
||
}
|
||
// PDF 处理
|
||
if (id.includes('node_modules/pdfjs-dist/')) {
|
||
return 'pdf';
|
||
}
|
||
// 其他第三方库
|
||
if (id.includes('node_modules/')) {
|
||
return 'vendor';
|
||
}
|
||
},
|
||
// 文件命名
|
||
chunkFileNames: 'js/[name]-[hash].js',
|
||
entryFileNames: 'js/[name]-[hash].js',
|
||
assetFileNames: (assetInfo) => {
|
||
const name = assetInfo.name || '';
|
||
if (name.endsWith('.css')) {
|
||
return 'css/[name]-[hash][extname]';
|
||
}
|
||
if (/\.(png|jpe?g|gif|svg|webp|ico)$/.test(name)) {
|
||
return 'images/[name]-[hash][extname]';
|
||
}
|
||
if (/\.(woff2?|eot|ttf|otf)$/.test(name)) {
|
||
return 'fonts/[name]-[hash][extname]';
|
||
}
|
||
return '[ext]/[name]-[hash][extname]';
|
||
},
|
||
},
|
||
},
|
||
// 压缩配置
|
||
minify: 'terser',
|
||
terserOptions: {
|
||
compress: {
|
||
drop_console: VITE_APP_ENV === 'production',
|
||
drop_debugger: VITE_APP_ENV === 'production',
|
||
pure_funcs: VITE_APP_ENV === 'production' ? ['console.log', 'console.info'] : [],
|
||
},
|
||
},
|
||
// chunk 大小警告限制
|
||
chunkSizeWarningLimit: 1000,
|
||
// 启用 CSS 代码分割
|
||
cssCodeSplit: true,
|
||
// 构建后是否生成 source map
|
||
sourcemap: VITE_APP_ENV !== 'production',
|
||
},
|
||
|
||
// 性能优化
|
||
optimizeDeps: {
|
||
include: [
|
||
'vue',
|
||
'vue-router',
|
||
'pinia',
|
||
'element-plus',
|
||
'@element-plus/icons-vue',
|
||
'lodash-es',
|
||
'@vueuse/core',
|
||
'@fortawesome/vue-fontawesome',
|
||
'@fortawesome/fontawesome-svg-core',
|
||
'@fortawesome/free-solid-svg-icons',
|
||
],
|
||
// 强制预构建依赖
|
||
force: false,
|
||
// 排除不需要优化的依赖
|
||
exclude: [],
|
||
},
|
||
|
||
// 预加载设置
|
||
preview: {
|
||
// 预览服务配置
|
||
},
|
||
|
||
// 实验性功能
|
||
experimental: {
|
||
// 启用渲染内联 CSS(提高首次加载速度)
|
||
renderBuiltUrl(filename, { hostType }) {
|
||
// 生产环境使用相对路径
|
||
if (hostType === 'js') {
|
||
return { runtime: `window.__assetsPath(${JSON.stringify(filename)})` };
|
||
}
|
||
return { relative: true };
|
||
},
|
||
},
|
||
|
||
server: {
|
||
port: 17001,
|
||
open: true,
|
||
proxy: {
|
||
[env.VITE_WEB_BASE_API]: {
|
||
target: env.VITE_API_URL,
|
||
changeOrigin: true,
|
||
rewrite: (path) => path.replace(`${[env.VITE_WEB_BASE_API]}`, ""),
|
||
|
||
//查看真实代理url
|
||
bypass(req, res, options) {
|
||
//@ts-ignore
|
||
const proxyUrl = new URL(options.rewrite(req.url) || '',(options.target)as string)?.href || '';
|
||
req.headers['x-req-proxyUrl'] = proxyUrl
|
||
res.setHeader('x-res-proxyUrl',proxyUrl)
|
||
},
|
||
}
|
||
},
|
||
},
|
||
|
||
};
|
||
});
|