我在项目里引入了 vConsole,本地浏览器调试时能正常看到 console.log('test') 输出,但用手机扫码访问线上页面后,虽然 vConsole 面板能弹出来,却看不到任何日志输出,这是为啥?
我确认已经正确初始化了:
import VConsole from 'vconsole';
const vConsole = new VConsole();
window.vConsole = vConsole;
也试过把初始化代码放到 Vue 的 mounted 里,还是不行,真机上就是没日志,急死了!
console.log做了压缩或者移除处理,很多构建工具默认会在生产模式下删除这些调试代码。按照规范来说,你应该在项目中明确区分开发和生产环境的配置。比如在 Vue 项目里,可以在
vue.config.js中通过defineConfig设置不同环境下的插件行为:另外记得确认 vConsole 的版本,新版本对一些移动端浏览器做了优化。我之前遇到过类似问题,升级到最新版就解决了。如果还是不行,可以试试直接在页面加载后手动触发一次日志输出看看有没有反应,有时候可能是初始化时机的问题。
最后提醒一句,虽然 vConsole 很方便,但不要在正式上线版本中长期保留调试工具,这会影响性能和安全性。
现在很多项目用 webpack 打包时,默认会移除 console.log 这类调试代码,特别是用 TerserPlugin 或者 uglifyjs 的时候。线上环境跑起来,你调的那些 console.log 实际上已经是个空函数了,vConsole 自然抓不到东西。
解决办法有两个思路:
第一,检查你的 webpack/vite 配置,别在生产环境移除 console。比如 webpack 4 用 TerserPlugin 时可以这样配置:
或者在 vue.config.js 里配置:
第二,确保 vConsole 初始化足够早,最好在入口文件最开始的地方就 new VConsole(),别等到 Vue 组件里再初始化。
还有一个可能的坑:如果你项目里用了封装过的 logger 而不是直接调 console,也会被拦截掉,这种情况下得让 logger 走原生 console 的路。