You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
constDEBUG=process.env.DEBUG.split(',');functionlog(key, ...items){if(typeofDEBUG!=='undefined'&&DEBUG.includes(key)){console.log(...items)}}log('database','results recieved');// using database keylog('http','route not found',request.url);// using http key
vara=require('debug')('worker:a'),b=require('debug')('worker:b');vara=require('debug')('worker:a'),b=require('debug')('worker:b');functionwork(){a('doing lots of uninteresting work');setTimeout(work,Math.random()*1000);}work();functionworkb(){b('doing some work');setTimeout(workb,Math.random()*2000);}workb();
constcreateDebug=require('debug')createDebug.formatters.h=(v)=>{returnv.toString('hex')}// …elsewhereconstdebug=createDebug('foo')debug('this is hex: %h',newBuffer('hello world'))// foo this is hex: 68656c6c6f20776f726c6421 +0ms
目录
背景
当我们在写代码的时候,总是需要调试的,而比较常用的一种方式则是使用console.log来打印一些我们想要看到的信息,已读写文件的代码为例,如下所示
我们在开发的时候通过console.log来打印信息,当项目准备上线的时候在删掉console.log,当下次这里出现bug的时候又可能把console.log加回来,那么有没有一种更好的方式,保证我在开发的时候可以console.log,上线的时候把console.log去掉
我们做如下改进
我们自定义一个log方法,然后通过变量DEBUG来开启打印与不打印,这样我们就达到了只写一次代码,可以通过变量来控制console.log
但是这里带来了两个问题
第一个问题,在node端我们可以通过环境变量来解决
第二个问题,我们可以通过增加命名空间,然后环境变量传入命名空间来决定console哪个
最终改进代码如下所示
到这里我们的console.log已经可以根据环境变量来控制是否需要console,且console哪个命名空间,最终我们也不需要将我们的console代码删除,因为代码内已经是具体的log方式,而不是console.log
那么我们需要自己去封装这个console功能吗?目前来看是不需要的,因为已经有现成的npm包debug封装了这个能力,且提供了更丰富的功能
使用debug包
安装
基础使用
创建一个命名空间的debug函数
开启console输出
创建一个库下面不同模块之间的命名空间
开启所有模块的console输出,以linux为例
开启部分模块的console输出,以linux为例
注意可以通
-
来排除某个模块进阶使用
环境变量
通过不同的环境变量控制输出
DEBUG
DEBUG_HIDE_DATE
DEBUG_COLORS
DEBUG_DEPTH
DEBUG_SHOW_HIDDEN
比如输出的时候不使用颜色
DEBUG=* DEBUG_COLORS=false node app.js
比如输出的时候隐藏时间
DEBUG=* DEBUG_COLORS=false DEBUG_HIDE_DATE=true node app.js
格式化输出
通过内置的与自定义的格式化方法帮助我们优化输出内容的格式
%O
%o
%s
%d
%j
%%
%o与%O内部借助的是util.inspect方法实现的
举个例子
自定义格式化输出方法
比如将Buffer 转化为十六进制
动态开启与关闭
通过enable与disable来实现动态开启与关闭,而不是环境变量的方式
注意事项
node端%O的时候对象没有换行输出
原因%O内部使用的是
util.inspect
方法来输出对象,而该方法breakLength的默认值为100,也就是字符长度大于100的时候才会换行输出,更多参数参考util.inspect浏览器端也可以使用debug这个库
原因:这个库内部做了判断,实现了node端与browser端,browser端通过通过localStorage保存开启与关闭状态
总结
debug库很好的帮助我们解决了频繁删除与添加console.log的问题,也在其它的一些大型开源库中也看到使用debug这个库,比如babel、jest、eslint等,所以我们在开发一些命令行工具的时候很有必要引入这个包帮助我们console.log代码,提高我们的开发效率
The text was updated successfully, but these errors were encountered: