【譯】使用 ndb 除錯 node 應用
Google Chrome 實驗室釋出了一款新的 node debug 工具來提升開發者體驗,本文將會全面介紹 ndb 這款 node 工具
熟悉 node 的人可能知道,node 一直支援一個無頭除錯工具:
它使用了一個已經被棄用的協議叫做 V8 偵錯程式協議,並且它並不算是一個功能完備的偵錯程式,只有一些簡單的檢查功能。
過去在這種情況下,一個新的基於 V8 偵錯程式協議和 Blink 的除錯工具出現在開發者眼前,它能夠允許我們在任何一個 Webkit 核心的瀏覽器 DevTools 上面除錯我們的 node 應用,是的,它就是 node-inspector,它的出現大幅增加了我們除錯 node 應用的效率。
在 node 的 V6.3.0 版本中,V8 Inspector 作為一個實驗特性被加入到這個版本中,它帶來了一個非常強大的除錯協議,同時還集成了 Chrome 的 DevTools 並且支援非常多的新特性如Blackbox、profiling、workspaces和sourcemap等等。此外,它並不依賴已經被棄用的 V8 偵錯程式協議,而是直接基於 Chrome 的除錯協議,因此它可以直接跑在除錯客戶端裡面,像 Chromium 核心瀏覽器、VSC ode、WebStorm這些。啟動它也非常簡單,只需要輸入命令 node --inspect scrip.js
即可。
在 7.20 號的時候,一個叫做 ndb 的全新 node 除錯工具也同步開源了。
有新的 node 除錯工具的確令人振奮,但這個新的 ndb 擁有哪些新特性呢?
ndb 出現的背景
首先附上 ndb 的官方定義:
ndb is an improved debugging experience for Node.js, enabled by Chrome DevTools (ndb 是一次對 node 除錯體驗的升級,Chrome DevTools 原生支援 ndb)
從上面的定義中,我們可以發現:
- ndb 能夠提升除錯體驗
- Chrome DevTools 原生支援 ndb,意味著它使用的是 Chrome 的除錯協議,類似於 V8 Inspector
- ndb是谷歌 Chrome 實驗室維護的
因此,你可能認為 ndb 只是提供了一個升級版的 V8 Inspector ,然而事實並非如此。
我們可以發現,使用 V8 Inspector 和 Chrome DevTools 有兩個前提:一是 node 版本要大於 6.3.0,另一個是必須要用 Chrome 或者 Chromium 核心的瀏覽器。如果我們不滿足這兩個條件或者想在非 Chromium 核心下除錯的話怎麼辦呢?
前面我們沒說到 ndb 的使用依賴什麼環境,它依賴一個叫做 Puppeteer
的包,Puppeteer 是一個通過 Chrome DevTools 協議來控制 Chromium 的包,它提供了很多封裝好的介面。
當 ndb 安裝了 Puppeteer 之後,一個最新的與當前環境相容的 Chromium 也被安裝到了依賴包裡。
因為是獨立安裝的,所以 ndb 不依賴作業系統的瀏覽器,這種對瀏覽器不依賴的特性也成為了 ndb 的一個優勢。
但它同時也帶來一個問題,那就是 node_modules 會比較大,畢竟裡面有一個 Chromium。
那麼 ndb 在除錯上的體驗如何呢?
探索ndb
第一步我們先用 express 建一個 node 應用 demo:
// app.js
const express = require('express');
const app = express();
app.get('/', (req, res) => res.send('Hello World!'));
app.listen(3000, () => console.info('Example app listening on port 3000!'));
複製程式碼
再在 package.json 定義一個執行指令碼:
"scripts": {
"start": "node app.js"
}
複製程式碼
如何安裝
首先我們在全域性環境或者本地安裝 ndb。
npm install -g ndb
複製程式碼
啟動ndb
我們有好幾種方法啟動 ndb:
1️⃣ - 直接執行檔案
我們可以通過直接用 ndb 命令執行一個檔案來開啟 ndb,如:
ndb app.js
複製程式碼
2️⃣ - 執行一個二進位制可執行檔案
有時候我們想要用 ndb 來除錯一些可執行二進位制檔案啟動的服務,如 npm 指令碼、webpack、單元測試這些。
只需要執行如下命令:
ndb npm start
複製程式碼
上面我們用 ndb 運行了一個 npm 指令碼,同樣的,只要配置妥當我們還可以執行 ndb webpack
或 ndb mocha
等命令
3️⃣ - 執行一個專案
如果我們只是需要開啟一個 ndb 服務,可以直接在專案目錄裡面執行 ndb .
來開啟,這個命令允許我們在執行指令碼之前設定斷點、編輯檔案或其他任何東西。
PS:接下來的示例我們都採用第三種啟動方法來示範
放置斷點
在除錯的時候放置斷點非常簡單
我們可以在模組被實際載入之前就放置斷點
處理檔案
使用 Chrome DevTools,我們可以在專案中建立和編輯檔案,並將它們儲存
執行 npm 指令碼
如果專案中包含一些 npm 指令碼,可以通過 ndb 的面板中執行
內建終端
通過 ndb 也可以直接訪問終端
Blackboxing
在預設情況下,ndb 會遮蔽一些外部檔案,如 node 內建庫,我們除錯的時候對這些外部檔案並不需要關心
程序面板
這個面板會列出當前由 ndb 啟動的所有 node 程序。此外,子程序會收攏到它的父程序中,方便管理和終止
程式碼片段
ndb 支援建立一些程式碼片段來執行和除錯
變數訪問
當前程序變數和 node 的全域性變數,ndb 都可以訪問到
《IVWEB 技術週刊》 震撼上線了,關注公眾號:IVWEB社群,每週定時推送優質文章。