feat: 项目加载优化
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user