| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- /**
- * Vite 打包配置
- */
- /**
- * 获取打包基础配置
- */
- export function getBuildBase(isProd) {
- return {
- target: 'es2015',
- outDir: 'dist',
- emptyOutDir: true,
- sourcemap: isProd ? false : 'inline',
- chunkSizeWarningLimit: 1500,
- cssCodeSplit: true,
- cssMinify: isProd,
- assetsInlineLimit: 4096,
- reportCompressedSize: false
- };
- }
- /**
- * 获取压缩配置
- */
- export function getTerserOptions(isProd) {
- if (!isProd) return undefined;
-
- return {
- compress: {
- drop_console: true,
- drop_debugger: true,
- pure_funcs: ['console.log', 'console.info', 'console.debug', 'console.trace'],
- passes: 2,
- },
- format: {
- comments: false,
- }
- };
- }
- /**
- * 获取静态资源文件名配置
- */
- export function getAssetFileNames(assetInfo) {
- const info = assetInfo.name.split('.');
- let extType = info[info.length - 1];
-
- if (/\.(png|jpe?g|gif|svg|webp|ico)$/i.test(assetInfo.name)) {
- extType = 'img';
- } else if (/\.(woff2?|eot|ttf|otf)$/i.test(assetInfo.name)) {
- extType = 'fonts';
- } else if (/\.css$/i.test(assetInfo.name)) {
- extType = 'css';
- }
-
- return `${extType}/[name]-[hash].[ext]`;
- }
- /**
- * 手动代码分割策略 - 优化版
- */
- export function manualChunks(id) {
- // 将 node_modules 中的代码分割为不同的 chunk
- if (id.includes('node_modules')) {
- // 获取包名
- const packageName = id.split('node_modules/')[1].split('/')[0].replace('@', '');
-
- // 核心Vue生态库 - 最高优先级,确保基础框架独立
- if (id.includes('vue/') && !id.includes('vue-router') && !id.includes('vue-request') && !id.includes('ant-design-vue') && !id.includes('@ant-design')) {
- return 'vue-core';
- }
- if (id.includes('vue-router')) {
- return 'vue-router';
- }
- if (id.includes('pinia')) {
- return 'pinia';
- }
- if (id.includes('@vueuse')) {
- return 'vueuse';
- }
-
- // Ant Design Vue 统一打包,避免循环依赖
- if (id.includes('ant-design-vue')) {
- return 'antd-vue';
- }
- if (id.includes('@ant-design/icons-vue')) {
- return 'antd-icons';
- }
-
- // 表单设计器
- if (id.includes('@form-create/ant-design-vue')) {
- return 'form-create-antd';
- }
- if (id.includes('@form-create/antd-designer')) {
- return 'form-designer';
- }
- if (id.includes('@form-create')) {
- return 'form-create-core';
- }
-
- // 编辑器相关
- if (id.includes('@wangeditor/editor-for-vue')) {
- return 'wangeditor-vue';
- }
- if (id.includes('@wangeditor')) {
- return 'wangeditor-core';
- }
- if (id.includes('highlight.js')) {
- return 'highlight';
- }
- if (id.includes('vue3-highlightjs')) {
- return 'vue-highlight';
- }
-
- // 图表库
- if (id.includes('echarts')) {
- if (id.includes('echarts/core')) {
- return 'echarts-core';
- }
- if (id.includes('echarts/charts')) {
- return 'echarts-charts';
- }
- if (id.includes('echarts/components')) {
- return 'echarts-components';
- }
- if (id.includes('echarts/renderers')) {
- return 'echarts-renderers';
- }
- return 'echarts-base';
- }
-
- // 工具库
- if (id.includes('axios')) {
- return 'axios';
- }
- if (id.includes('dayjs')) {
- return 'dayjs';
- }
- if (id.includes('js-cookie')) {
- return 'js-cookie';
- }
- if (id.includes('nprogress')) {
- return 'nprogress';
- }
-
- // 其他工具库
- if (id.includes('sortablejs')) {
- return 'sortable';
- }
- if (id.includes('file-saver')) {
- return 'file-saver';
- }
- if (id.includes('particles.js')) {
- return 'particles';
- }
- if (id.includes('@vueuse')) {
- return 'vueuse';
- }
- if (id.includes('vue-request')) {
- return 'vue-request';
- }
-
- // polyfills
- if (id.includes('core-js')) {
- return 'polyfills';
- }
-
- return 'vendor-misc';
- }
-
- // 项目内部代码分割 - 优化版
- if (id.includes('src/')) {
- // 布局和核心组件 - 优先级高,单独打包
- if (id.includes('src/layout/')) {
- return 'layout';
- }
- if (id.includes('src/components/layout')) {
- return 'components-layout';
- }
- if (id.includes('src/components/common')) {
- return 'components-common';
- }
- if (id.includes('src/components/')) {
- return 'components-other';
- }
-
- // 路由相关 - 按模块分割
- if (id.includes('src/router/')) {
- return 'router';
- }
-
- // 状态管理
- if (id.includes('src/stores/')) {
- return 'stores';
- }
-
- // API 按业务模块分割
- if (id.includes('src/api/system/')) {
- return 'api-system';
- }
- if (id.includes('src/api/monitor/')) {
- return 'api-monitor';
- }
- if (id.includes('src/api/tool/')) {
- return 'api-tool';
- }
- if (id.includes('src/api/')) {
- return 'api-common';
- }
-
- // 业务页面按模块分割
- if (id.includes('src/views/system/')) {
- return 'views-system';
- }
- if (id.includes('src/views/monitor/')) {
- return 'views-monitor';
- }
- if (id.includes('src/views/tool/')) {
- return 'views-tool';
- }
- if (id.includes('src/views/frontend/')) {
- return 'views-frontend';
- }
- if (id.includes('src/views/')) {
- return 'views-common';
- }
-
- // 工具和配置
- if (id.includes('src/utils/')) {
- return 'utils';
- }
- if (id.includes('src/directive/')) {
- return 'directive';
- }
- if (id.includes('src/config/')) {
- return 'config';
- }
- if (id.includes('src/plugins/')) {
- return 'plugins';
- }
-
- // 静态资源
- if (id.includes('src/assets/')) {
- return 'assets';
- }
- }
- }
- /**
- * 获取完整的打包配置
- */
- export function getBuildConfig(isProd) {
- const baseConfig = getBuildBase(isProd);
-
- return {
- ...baseConfig,
- minify: isProd ? 'terser' : false,
- terserOptions: getTerserOptions(isProd),
- rollupOptions: {
- output: {
- chunkFileNames: 'js/[name]-[hash].js',
- entryFileNames: 'js/[name]-[hash].js',
- assetFileNames: getAssetFileNames,
- manualChunks
- },
- external: isProd ? [] : [],
- },
- optimizeDeps: {
- include: [
- 'vue',
- 'vue-router',
- 'pinia',
- 'dayjs',
- 'axios',
- 'js-cookie',
- 'nprogress'
- ],
- exclude: [
- '@wangeditor/editor',
- '@wangeditor/editor-for-vue',
- '@form-create/antd-designer',
- '@form-create/ant-design-vue',
- 'ant-design-vue',
- '@ant-design/icons-vue'
- ]
- }
- };
- }
|