feat: 项目加载优化

This commit is contained in:
Gsh
2026-02-01 00:30:44 +08:00
parent 3b6887dc2e
commit 11cbb1b612
29 changed files with 1490 additions and 299 deletions

View File

@@ -1,7 +1,7 @@
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) => {
@@ -10,6 +10,11 @@ export default defineConfig((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: {
@@ -27,6 +32,124 @@ export default defineConfig((cnf) => {
},
},
// 构建优化配置
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,