const path = require('path'); const { zionUniMpLoadPackagePlugin } = require('zion-uniapp-mp-load-package/webpack'); // 打印出process.env // for (let key in process.env) { // console.log(key, process.env[key]); // } // 定义UNI_OUTPUT_DIR环境变量 try { if (!process.env.NODE_ENV) { throw new Error('NODE_ENV 环境变量未设置'); } const buildDir = process.env.NODE_ENV === 'production' ? 'build' : 'dev'; const UNI_SCRIPT = process.env.UNI_SCRIPT ?? ''; if ([ // 参照 package.json 中定义的 "uni-app" --> "scripts" 'h5-xcx20.5g-quickapp.com', 'h5-xcx.aigc-quickapp.com', 'h5-5g.aigc-quickapp.com', 'h5-test.aigc-quickapp.com' ].includes(UNI_SCRIPT)) { process.env.UNI_OUTPUT_DIR = path.join(__dirname, `unpackage/dist/${buildDir}/h5/${UNI_SCRIPT}`); console.log('UNI_OUTPUT_DIR = ', process.env.UNI_OUTPUT_DIR); } } catch (e) { console.log('NODE_ENV 环境变量未设置,默认使用开发模式'); } // 导出配置 module.exports = { productionSourceMap: false, configureWebpack: config => { console.log('config.mode = ', config.mode); if (config.mode === 'production') { console.log('开始尝试配置极限压缩'); // 配置zion-uniapp-mp-load-package插件 config.plugins.push(new zionUniMpLoadPackagePlugin({ optimization: { minimize: true, moduleIds: 'named' }, packages: [ 'pages', 'pages_tool', 'pages_goods', 'pages_order', 'pages_promotion' ] })); // 确保minimizer数组存在 if (config.optimization && config.optimization.minimizer && Array.isArray(config.optimization.minimizer)) { // 查找TerserWebpackPlugin实例,而不是依赖索引 const terserPluginIndex = config.optimization.minimizer.findIndex(plugin => { return plugin.constructor && plugin.constructor.name === 'TerserWebpackPlugin' || (plugin.options && plugin.options.terserOptions); }); if (terserPluginIndex !== -1) { // 确保options对象存在 if (!config.optimization.minimizer[terserPluginIndex].options) { config.optimization.minimizer[terserPluginIndex].options = {}; } // 设置terserOptions - 极限压缩配置 config.optimization.minimizer[terserPluginIndex].options.terserOptions = { compress: { drop_console: true, // 去除所有console语句 drop_debugger: true, // 去除debugger语句 dead_code: true, // 移除死代码 unused: true, // 移除未使用的变量 toplevel: true, // 清理顶层作用域未使用的变量 passes: 5, // 增加压缩次数以获得更好的压缩效果 sequences: true, // 合并连续的变量声明 evaluate: true, // 提前计算常量表达式 reduce_vars: true, // 合并或移除变量 join_vars: true, // 合并变量声明 conditionals: true, // 优化条件表达式 comparisons: true, // 优化比较操作 booleans: true, // 优化布尔表达式 typeofs: true, // 优化typeof操作 collapse_vars: true, // 折叠定义后不再修改的变量 reduce_funcs: true, // 合并或移除未使用的函数 inline: true, // 内联简单函数 side_effects: true, // 移除有副作用的代码 keep_fargs: false, // 移除未使用的函数参数 keep_fnames: false, // 不保留函数名称 pure_funcs: ['console.log', 'console.warn', 'console.error', 'console.info'], // 标记为纯函数的console方法 pure_getters: true // 假设getter函数没有副作用 }, format: { ascii_only: true, // 确保输出ASCII字符 comments: false, // 去除所有注释 beautify: false, // 不美化输出 ecma: 5, // 输出兼容ECMAScript 5 wrap_func_args: false, // 不包裹函数参数 bracketize: true, // 使用大括号包裹所有块 quote_style: 1 // 使用单引号 }, parse: { ecma: 8, // 使用ECMAScript 8解析 bare_returns: true // 允许顶级return语句 }, mangle: { toplevel: true, // 混淆顶层作用域的变量名 keep_fnames: false, // 不保留函数名称 keep_classnames: false // 不保留类名称 }, module: false, // 不是ES模块 sourceMap: false // 不生成source map }; console.log('配置极限压缩完成'); } } } } };