nodejs debug模組原始碼解析

2021-09-24 22:14:45 字數 2743 閱讀 3717

最近發生了乙個特別詭異的問題, 無奈只能乙個乙個模組去去解讀,包管理是好,但遇到一些詭異的問題, 只能一行一行原始碼去讀, 索性是開源的, 如果非開源的。。。邊讀邊寫加深印象

作為乙個debug工具基本功能應該具備以下幾點

列印日誌(核心功能)

顯示 區分 不同的日誌

控制 輸出 不同的日誌

開啟關閉 日誌

我們帶著這些需求去看這個模組的原始碼,首先我們看下檔案結構

index.js (入口檔案)

debug.js (核心模組)

node.js (node 格式化輸出)

browser.js (browser 格式化輸出)

不管做什麼都是從開頭開始的, 首先看 index.js

if

(typeof process !==

'undefined'

&& process.type ===

'renderer'

)else

這段**很容易看出根據環境來判斷應該使用哪種型別的debug功能

我對 browser 不是很了解, 就不去管這個了,直接看node.js

exports = module.exports =

require

('./debug');

exports.log = log;

exports.formatargs = formatargs;

很容易看出來 核心模組是debug, node.js是在該模組上新增或者修改了某一些功能

接著我看下重頭戲 debug.js

exports = module.exports = debug.debug = debug;

function

debug

(namespace)

disabled.enabled =

false

;// define the `enabled` version

function

enabled()

enabled.enabled =

true

;var fn = exports.

enabled

(namespace)

? enabled : disabled;

fn.namespace = namespace;

// 返回對應處理函式

return fn;

}// 使用 require載入debug模組, debug 作為函式並呼叫 debug('socket.io:client') 賦值給debug

var debug =

require

('debug')(

'socket.io:client'

);

首先我們看之前的第乙個需求, 列印debug資訊

var logfn = enabled.log || exports.log || console.log.

bind

(console)

; logfn.

(self, args)

;

該段**說明列印功能的實現

如果需要擴充套件列印 enabled.log || exports.log 可對這兩個方法進行擴充套件, 並附帶優先順序

需求4 開啟關閉日誌
var fn = exports.

enabled

(namespace)

? enabled : disabled;

該處判斷了,對某類 debug 資訊 開啟還是關閉

由於這個功能我們需要使用, 就深入看一下 exports.enabled 原始碼

function

enabled

(name)

return

false;}

function

enable

(namespaces)

那什麼時候加入到 exports.names 中的呢? 看 node.js 這段**

exports.

enable

(load()

);function

load()

說明他讀取的 是 環境變數 debug 的值, 就是說, 我們對環境變數 debug 賦值 且正則 匹配正確以後 才會輸出資訊, 否則不會

注意 debug賦值只是開啟,而正確的正則匹配才是真實的輸出日誌 這裡就實現了需求3

args = exports.formatargs.

(self, args)

;對列印的引數進行格式化

node.js

function

formatargs()

該段**就是控制 具體的顯示的顏色的

好了, 模組分析到此結束。 囉嗦一句, 這個可以稍微改進一下, 對控制層進行再次封裝, 實現不重啟進行列印日誌

Mybatis中Logging模組的原始碼分析

週末又來到了公司吹吹空調,順便記錄下mybatis的點點滴滴。首先mybatis不定義日誌系統,完全依賴於第三方系統完成日誌記錄,利用介面卡模式完成實際操作,原始碼如下 1 定義乙個log介面,具有如下方法 public inte ce log2 然後引入第三方日誌,比如 loggingimpl,實...

Python bisect模組的使用與原始碼分析

本文基於python3.7分析 bisect提供了六個方法 不難發現,bisect 方法和bisect right 方法以及insort 方法和insort right 方法功能一致,在下面原始碼分析中會有解釋 import bisect l 1,2,4,4,5 n 4 idx1 bisect.bi...

AbstractCollection原始碼分析

abstractcollection抽象類提供了collection的骨架實現,collection分析請看 這裡直接看它的 是如何實現的.public abstract iterator iterator 該方法沒有實現.public abstract int size 該方法沒有實現.publi...