解读生产环境为何避免使用console.log

console.log:向web开发控制台打印一条消息,常用来在开发时调试分析。有时在开发时,需要打印一些对象信息,但发布时却忘记去掉console.log语句,这可能造成内存泄露。

在传递给console.log的对象是不能被垃圾回收 ♻️,因为在代码运行之后需要在开发工具能查看对象信息。所以最好不要在生产环境中console.log任何对象。

实例------>demos/log.html





  
  
  
  Leaker



  
  


这里结合Chrome的Devtools–>Performance做一些分析,操作步骤如下:

  1. 开启Performance的记录
  2. 执行CG按钮,创建基准参考线
  3. 多次点击【click】按钮,新建Leaker对象
  4. 执行CG按钮
  5. 停止记录

解读生产环境为何避免使用console.log_第1张图片

可以看出【JS Heap】线最后没有降回到基准参考线的位置,显然存在没有被回收的内存。如果将代码修改为

// console.log("Leaking an object %o: %o", (new Date()), this);

重复上述的操作步骤,分析结果如下:

解读生产环境为何避免使用console.log_第2张图片

从对比分析结果可知,console.log打印的对象是不会被垃圾回收器回收的。
因此最好不要在页面中console.log任何对象,包括warn、error等兄弟,这样可能会影响页面的整体性能,特别在生产环境中,这些细节需要特别的关注。

彩蛋

试试以下console代码

const style1 = [
  'color: #fff',
  'background: #848484',
  'padding: 1px',
  'border-radius: 3px 0 0 3px'
].join(';');
const style2 = [
  'color: #fff',
  'background: #1890FF',
  'padding: 1px',
  'border-radius: 0 3px 3px 0'
].join(';');
console.log('%c NODE_ENV %c production ', style1, style2);
console.log('%c BUILD_TIME %c %s ', style1, style2, new Date().toLocaleString());

你可能感兴趣的:(解读生产环境为何避免使用console.log)