zoukankan      html  css  js  c++  java
  • npm--debug模块

    资料原文

    原文

    作者笔记


    概述

    dubug模块暴露一个函数,返回一个修饰过的console.error函数:

    修饰:

    • 加前缀(传入的字符串参数,用于区分不同的debug实例)
    • 给前缀加颜色

    通过不同debug实例的前缀和颜色区分, 能方便的实现模块之间及模块各部分之间的debug的切换.


    用法简介(debug使用+DEBUG环境变量启用)

    • 使用方法:

      • 在代码中引入debug模块(构造函数)
      • 用debug模块构造debug实例(传入区分字符串)
      • 用在适当位置调用合适的debug实例进行输出
      • 通过环境变量DEBUG来控制debug实例的允许输出列表(启用列表)
    • 代码举例: (basic.js)

      var debug = require('debug')('http'); //引入debug模块并创建debug实例
      var http = require('http'); //引入http模块用于构造http服务器
      var name = 'My App';
      
      debug('booting %o', name); //调用debug输出(printf风格输出--详见util.inspect及console模块)
      http.createServer(function(req, res){ //创建服务器
      	debug(req.method + ' ' + req.url); //收到请求时打印http方法及url
      	res.end('hello
      ');
      }).listen(3000, function(){
      	debug('listening'); //开启服务器监听时打印listening
      });
      

      运行服务器命令行代码:

      • linux端: DEBUG=http node basic.js

      • windows端: set DEBUG=http & node basic.js

      控制台效果:
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述


    DEBUG环境变量与debug实例的启用列表

    ​ 要想debug实例在控制台打印出输出, 仅仅在相应位置调用还不够, 还需要启用对应name的debug实例才可以.启用debug实例有两种方法:

    • 启动app的命令里通过设置DEBUG环境变量实现
    • 代码内动态设置debug的启用

    本段说明如何通过DEBUG环境变量设置启用列表:

    ​ 根据DEBUG环境变量的值来启用对应name的debug输出,这样对应的debug才能将信息打印到控制台. 所以,要打印name为test的debug,需要满足两个条件:

    1.引入debug模块,传name参数构建debug实例并在对应位置调用
    2.该name值被包含在启动时的DEBUG环境参数值中

    DEBUG环境变量的设置语法总结

    • 设置惯例

      • 如果在多个库之间使用debug模块, 为方便阅读使用,debug的name应该使用库名
      • 如果你同一个库里同时使用多个debugger,应该使用 库名:功能名 的格式来进行区分
    • 语法说明

      • DEBUG设置的各个项用空格或者逗号之一进行分隔

        set DEBUG=http,net,util & node basic.js
        set DEBUG=http net util & node basic.js
        
      • *号与带-号的项表示name集合,不带的表示单个name

        set DEBUG=http:* & node basic.js #启用所有name以'http:'开头的debug实例
        set DEBUG=-http,net & node basic.j #不启用所有以'http'开头的debug实例,启用name为net的debug实例
        
      • *号与-号的使用:

        • *号: 通配符,表示后面的字符串可以是任何内容
        • -号: 取补集
      • DEBUG的各个项(以空格或逗号分隔)与最终启用情况的关系:
        关于DEBUG的设置和对应的处理,就是一个简单的字符匹配和处理过程
        处理顺序(优先级由低到高):
        1.处理并合并一般的项(不带-号)
        3.检查尾项是否为*:
        (1)是:重置合并项为所有name,进行下一步
        (2)不是:直接进行下一步
        4.按照带-的项的要求对合并项进行过滤

      • 测试代码:

        js程序:

        //test.js
        //引入模块
        const{debug} = require('debug');
        
        //新建多个debug
        var test1 = debug('l1:l2:l3:test');
        var test2 = debug('l1:l2:test');
        var test3 = debug('l1:test');
        var test4 = debug('test');
        
        //依次调用
        test1('l1:l2:l3:test');
        test2('l1:l2:test');
        test3('l1:test');
        test4('test');
        
        //结论: 关于DEBUG的设置和对应的处理,就是一个简单的字符匹配和处理过程
        //处理顺序(优先级由低到高):
        //1.处理并合并一般的项(不带-)
        //2.检查尾项是否为*
        //	(1)是:重置合并项为所有name,进行下一步
        //	(2)不是:直接进行下一步
        //3.按照带-的项的要求对合并项进行过滤
        

        命令行(bat程序):

        #test.bat
        cd /d %~dp0 #切换到当前目录
        set DEBUG=-l2:* & node test.js
        set DEBUG=-l2:*,* & node test.js
        
        set DEBUG=*,l1:l2:* & node test.js
        set DEBUG=l1:l2:*,* & node test.js
        
        set DEBUG=*,-l1:l2:* & node test.js
        set DEBUG=-l1:l2:*,* & node test.js
        
        set DEBUG=*,-l1:l2:*,* & node test.js
        #分析(其余命令当做练习,请读者自行分析)
        # 没有一般的项,直接进入第二步: 尾项为*,启用列表设为所有name的debug实例
        # 第三步: 包含-l1:l2:*,不启用所有以l1:l2开头的name的debug实例
        # 最终结果: debug的实例只有test3与test4被启用
        
        set DEBUG=*,-l1:l2:*,-l1:l2:l3:* & node test.js
        pause
        

        控制台:
        在这里插入图片描述


    命名空间的颜色

    ​ 每个debug模块的实例都有一个基于它的name而生成的颜色, 这样更容易区分哪一行属于哪一个debug实例.

    服务端的support-color颜色扩展

    • 当stderr是一个终端时,nodejs的颜色机制被启用
    • 但只支持小部分颜色
    • 通过安装support-color模块来增加

    支持web检查器的客户端的支持

    在那些能够理解 %c 格式化选项的web检查器中,颜色机制也会被启用

    (例如: webkit web检查器, 火狐(31版本之后)以及火狐的FireBug插件)
    在这里插入图片描述


    毫秒级别的调用间隔检测(对console模块的计时器方法的包装)

    • 获取和显示在两个debug实例调用之间所经过的时间是很有用的

    • 在debug实例的输出之后的 ‘+NNNms’ 就是这个功能
      在这里插入图片描述

    • 当stdout不是终端时, Date#toISOString被调用,使得debug信息的记录更加有用
      在这里插入图片描述


    其他影响debug行为的环境变量

    在这里插入图片描述

    这些以DEBUG_打头的环境变量,最终会被转换为一个Options对象, 该对象会在使用util.inspect()使用时,出现%o或%O格式占位符时显示效果.(大部分是debug内部自动调用)

    注: 关于util.inspect及console的内容请参考作者对应的博文


    自定义占位符

    • 什么是占位符?

      请参考作者对应的博文(console与util.format及util.inspect)

    • 自定义占位符:

      • 你可以通过扩展debug.formatters对象来添加自定义占位符

      举例: 自定义%h占位符来渲染Buffer数据

      const createDebug = require('debug');
      createDebug.formatters.h = (v) => {
      	return v.toString('hex');
      }
      
      const debug = createDebug('foo');
      debug('this is hex: %h', new Buffer('hello world'));
      

      浏览器端使用debug模块

      可以使用browserify工具来构建debug的浏览器端脚本, 或者直接使用browserify-as- a-service-build来获取自动构建好的浏览器端脚本:
      在这里插入图片描述
      在这里插入图片描述

    • 说明:

      • 浏览器端debug的启用状态由localStorage实现的(相当于服务器端的DEBUG环境变量

        localStorage.debug = 'worker:*'


    配置输出位置(默认是stderr)

    ​ debug实例默认输出位置是process.stderr,但每个name的debug实例可以通过覆盖log方法来自定义自身的输出位置.

    • 举例:

      1.将debug实例的输出位置配置为process.stdout

      var debug = require('debug');
      var error = debug('app:error');
      error('goes to stderr!'); //默认是输出到stderr
      var log = debug('app:log');
      // 将这个实例的输出位置设置为stdout
      log.log = console.log.bind(console); // 别忘了绑定全局console
      log('goes to stdout');
      error('still goes to stderr!');
      
      // 将debug模块所有的输出通过console.info打印
      // 这会覆盖所有单个name的debug实例的设置
      debug.log = console.info.bind(console);
      error('now goes to stdout via console.info');
      log('still goes to stdout, but via console.info now');
      

      2.绑定debug实例到自定义的Console实例

      //文件: 绑定debug到可配置Console实例.js
      const debug = require('debug'); //引入debug模块
      const fs = require('fs'); //引入fs模块
      let logDes = fs.createWriteStream('./log.txt','utf8'); //创建可写流logDes
      
      const consoleLog = new console.Console({
      	stdout: logDes //将logDes作为自定义Console实例的stdout
      });
      
      const debugLog = debug('debugLog'); //创建debug实例debugLog
      debugLog.log = consoleLog.log.bind(consoleLog); //覆盖debugLog的log方法
      
      consoleLog.log('consoleLog
      '); //自定义Console实例的输出
      debugLog('helloWorld'); //debugLog输出
      
      #文件: test.bat
      cd /d %~dp0
      set DEBUG=* & set DEBUG_COLORS=false & node 绑定debug到可配置Console实例.js
      pause
      

    在这里插入图片描述
    在这里插入图片描述


    动态生成子级debug实例

    • 你可以简单地扩展已有的debug实例来动态生成子级的debug实例

    • 扩展debug: 实质仍旧是命名空间字符串的拼接

      const log = require('debug')('auth');
      //创建子级debug实例
      const logSign = log.extend('sign');
      const logLogin = log.extend('login');
      log('hello'); // auth hello
      logSign('hello'); //auth:sign hello
      logLogin('hello'); //auth:login hello
      

    代码内动态设置debug的启用列表

    • 在引入的debug模块构造函数上设置

      • 启用设置(enable()函数)
      const debug = require('debug');
      debug.enable("http,net,-util"); //启用name为http和net的debug实例, 不启用所有name以util开头的debug实例
      
      • 禁用设置(disable()函数)
      const debug = require('debug');
      debug.disable("http,net,-util"); //禁用name为http和net的debug实例, 启用所有name以util开头的debug实例
      
    • 在debug实例属性上设置(debugInstance.enabled属性)

      //利用debug实例属性启用禁用该实例.js
      const debug = require('debug');
      const debugLog = debug('debugLog');
      console.log(`debugLog: ${debugLog.enabled}`);
      debugLog('one');
      debugLog.enabled = false;
      console.log(`debugLog: ${debugLog.enabled}`);
      debugLog('two');
      debugLog.enabled = true;
      console.log(`debugLog: ${debugLog.enabled}`);
      debugLog('three');
      

      命令行: set DEBUG=* & node 利用debug实例属性启用禁用该实例.js

      控制台:
      在这里插入图片描述

  • 相关阅读:
    CSS尺寸单位 % px em rem 详解
    【MySQL】mysql在Windows下使用mysqldump命令备份数据库
    CSS教程:vlink,alink,link和a:link
    正则表达式入门教程
    【MySQL】MySQL支持的数据类型
    iOS应用程序状态图
    Java开发
    Java开发
    iOS开发点滴
    Android开发点滴
  • 原文地址:https://www.cnblogs.com/peterzhangsnail/p/12521644.html
Copyright © 2011-2022 走看看