需在生产构建时配置terser的drop_console选项:在vue.config.js中于configurewebpack.optimization.minimizer下覆盖默认压缩配置,设置compress.drop_console:true且仅在process.env.node_env==='production'时生效。

打包时如何禁用 console.log 输出
uni-app 打包后仍出现 console.log、console.warn,本质是生产环境未启用代码压缩阶段的日志清除。Terser(Webpack 默认压缩器)支持 drop_console 选项,但需显式配置且仅在 production 模式下生效。
- 确保项目根目录有
vue.config.js,没有则新建 - 必须在
configureWebpack的optimization.minimizer中覆盖默认 Terser 配置,不能只追加 -
process.env.NODE_ENV === 'production'是必要条件,HBuilderX 的“发行”模式会自动设置,命令行需用NODE_ENV=production npm run build(Mac/Linux)或set NODE_ENV=production && npm run build(Windows) - 若使用旧版 uni-app(如基于 Vue CLI 4),可能需降级
terser-webpack-plugin到 v4.x,v5+ 对compress选项结构有变化
示例最小有效配置:
const TerserPlugin = require('terser-webpack-plugin');
module.exports = {
configureWebpack: config => {
if (process.env.NODE_ENV === 'production') {
config.optimization.minimizer = [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true
}
}
})
];
}
}
};
HBuilderX 发行时控制台仍有日志?检查基座包和运行模式
即使配置正确,HBuilderX 真机调试或自定义基座包运行时仍看到日志,大概率不是代码没删,而是你根本没走生产构建流程。
- 点击“运行 → 运行到手机或模拟器”属于开发模式,
process.env.NODE_ENV为development,drop_console不生效 - “发行 → 发行到小程序/APP/H5”才触发生产构建,此时才会应用
vue.config.js中的production分支逻辑 - 若使用自定义基座包,必须用“发行”菜单重新打包基座,旧基座包里仍含日志代码,重装也无法清除
- 华为/小米等厂商系统自带 Log 开关(如工程模式中的 “APK debug log”),仅影响真机控制台接收,不影响打包产物本身
为什么改了配置还是有 console.warn?注意插件和第三方库
drop_console: true 只移除直接调用 console.xxx() 的语句,对以下情况无效:
- 被封装过的日志函数,例如
utils/log.js里写的export const log = (...args) => console.log(...args)—— Terser 不识别这种间接引用 - 某些 UI 库(如 uView、uni-ui)内部带开发提示,它们可能用
process.env.NODE_ENV !== 'production'包裹,这类需靠库自身配置关闭 - 原生插件(如
sunmi-printersdk)的PrinterSdk.log(true)是独立开关,和 Webpack 无关,需手动调用PrinterSdk.log(false) - Vue 本身的警告(如 props 类型校验失败)由
Vue.config.productionTip = false控制,需在main.js顶部设置
取消打包过程中断后残留日志的清理习惯
打包中断(如 Ctrl+C)不会污染最终产物,但容易忽略两个副作用:
- 中断时
dist/或unpackage/目录可能生成不完整文件,下次打包若没清空,旧文件可能被误读 —— 建议每次发行前手动删掉这两个文件夹 - 若用 HBuilderX 的“云端打包”,中断后任务仍在服务器排队,无法取消,只能等超时或完成;本地打包中断则无此问题
- 开发时依赖
vconsole调试,务必用环境变量包裹,否则上线也会加载:if (process.env.NODE_ENV === 'development') { new VConsole() }
真正要“取消打印”,核心就一条:确保走的是 production 构建路径,并且日志调用没被封装或来自不可控的原生层。










