perf(web): 降低生产构建内存峰值,并启用 CI 低内存打包模式

关闭按需 Element Plus 样式与构建期 dts、限制 rollup 并行、CI 跳过 gzip;
新增 npm run build:ci,供 Drone 在小内存机器上打包。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-10-24 15:30:38 +08:00
1 parent df6ce133dd
commit 9d93a373ae
8 files changed
+55 -27

No files matched your search

+5 -4
View File
@@ -1,20 +1,21 @@
import AutoImport from 'unplugin-auto-import/vite';
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
export default (path: any) => {
export default (path: any, isBuild = false) => {
return AutoImport({
// 自动导入 Vue 相关函数
imports: ['vue', 'vue-router', '@vueuse/core', 'pinia'],
eslintrc: {
enabled: true,
// 生产构建不重写 eslint 全局声明,避免每次打包全量扫描
enabled: !isBuild,
filepath: './.eslintrc-auto-import.json',
globalsPropValue: true
},
resolvers: [
// 自动导入 Element Plus 相关函数ElMessage, ElMessageBox... (带样式)
ElementPlusResolver()
ElementPlusResolver({ importStyle: false })
],
vueTemplate: true, // 是否在 vue 模板中自动导入
dts: path.resolve(path.resolve(__dirname, '../../src'), 'types', 'auto-imports.d.ts')
dts: isBuild ? false : path.resolve(path.resolve(__dirname, '../../src'), 'types', 'auto-imports.d.ts')
});
};
+5 -3
View File
@@ -2,16 +2,18 @@ import Components from 'unplugin-vue-components/vite';
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
import IconsResolver from 'unplugin-icons/resolver';
export default (path: any) => {
export default (path: any, isBuild = false) => {
return Components({
resolvers: [
// 自动导入 Element Plus 组件
ElementPlusResolver(),
// 全局已引入 element-plus/dist/index.css,关闭按需样式,减少打包模块数
ElementPlusResolver({ importStyle: false }),
// 自动注册图标组件
IconsResolver({
enabledCollections: ['ep']
})
],
dts: path.resolve(path.resolve(__dirname, '../../src'), 'types', 'components.d.ts')
// 生产构建不重写声明文件,避免把全部组件信息留在内存里
dts: isBuild ? false : path.resolve(path.resolve(__dirname, '../../src'), 'types', 'components.d.ts')
});
};
+8 -4
View File
@@ -1,16 +1,20 @@
import compression from 'vite-plugin-compression';
export default (env: any) => {
const { VITE_BUILD_COMPRESS } = env;
// CI 可通过空值或空格关闭:VITE_BUILD_COMPRESS=
const raw = String(env?.VITE_BUILD_COMPRESS ?? '').trim();
const plugin: any[] = [];
if (VITE_BUILD_COMPRESS) {
const compressList = VITE_BUILD_COMPRESS.split(',');
if (raw) {
const compressList = raw.split(',').map((s: string) => s.trim()).filter(Boolean);
if (compressList.includes('gzip')) {
// http://doc.ruoyi.vip/ruoyi-vue/other/faq.html#使用gzip解压缩静态文件
plugin.push(
compression({
ext: '.gz',
deleteOriginFile: false
deleteOriginFile: false,
// 小于 10KB 的分包压缩收益很小,跳过可明显缩短收尾时间
threshold: 10 * 1024,
verbose: false
})
);
}
+3 -3
View File
@@ -1,8 +1,8 @@
import Icons from 'unplugin-icons/vite';
export default () => {
export default (isBuild = false) => {
return Icons({
// 自动安装图标库
autoInstall: true
// 构建时禁止临时 npm install,避免打包过程访问外网卡住
autoInstall: !isBuild
});
};
+3 -5
View File
@@ -1,5 +1,4 @@
import vue from '@vitejs/plugin-vue';
import vueDevTools from 'vite-plugin-vue-devtools'; // 临时禁用以解决localStorage兼容性问题
import createUnoCss from './unocss';
import createAutoImport from './auto-import';
@@ -13,12 +12,11 @@ import path from 'path';
export default (viteEnv: any, isBuild = false): [] => {
const vitePlugins: any = [];
vitePlugins.push(vue());
// vitePlugins.push(vueDevTools()); // 禁用以解决localStorage兼容性问题
vitePlugins.push(createUnoCss());
vitePlugins.push(createAutoImport(path));
vitePlugins.push(createComponents(path));
vitePlugins.push(createAutoImport(path, isBuild));
vitePlugins.push(createComponents(path, isBuild));
vitePlugins.push(createCompression(viteEnv));
vitePlugins.push(createIcons());
vitePlugins.push(createIcons(isBuild));
vitePlugins.push(createSvgIconsPlugin(path));
vitePlugins.push(createSetupExtend());
return vitePlugins;