【譯】使用 ndb 除錯 node 應用

騰訊IVWEB團隊發表於2018-10-02

原文連結:Debugging Node.js Application Using ndb

Google Chrome 實驗室釋出了一款新的 node debug 工具來提升開發者體驗,本文將會全面介紹 ndb 這款 node 工具

熟悉 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)

從上面的定義中,我們可以發現:

  1. ndb 能夠提升除錯體驗
  2. Chrome DevTools 原生支援 ndb,意味著它使用的是 Chrome 的除錯協議,類似於 V8 Inspector
  3. ndb是谷歌 Chrome 實驗室維護的

因此,你可能認為 ndb 只是提供了一個升級版的 V8 Inspector ,然而事實並非如此。

我們可以發現,使用 V8 Inspector 和 Chrome DevTools 有兩個前提:一是 node 版本要大於 6.3.0,另一個是必須要用 Chrome 或者 Chromium 核心的瀏覽器。如果我們不滿足這兩個條件或者想在非 Chromium 核心下除錯的話怎麼辦呢?

前面我們沒說到 ndb 的使用依賴什麼環境,它依賴一個叫做 Puppeteer 的包,Puppeteer 是一個通過 Chrome DevTools 協議來控制 Chromium 的包,它提供了很多封裝好的介面。

Puppeteer is a dependency of ndb

當 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


複製程式碼

Debugging a script file directly

2️⃣ - 執行一個二進位制可執行檔案

有時候我們想要用 ndb 來除錯一些可執行二進位制檔案啟動的服務,如 npm 指令碼、webpack、單元測試這些。

只需要執行如下命令:


ndb npm start

複製程式碼

上面我們用 ndb 執行了一個 npm 指令碼,同樣的,只要配置妥當我們還可以執行 ndb webpackndb mocha 等命令

Debugging by running npm script

3️⃣ - 執行一個專案

如果我們只是需要開啟一個 ndb 服務,可以直接在專案目錄裡面執行 ndb . 來開啟,這個命令允許我們在執行指令碼之前設定斷點、編輯檔案或其他任何東西。

Debugging a project

PS:接下來的示例我們都採用第三種啟動方法來示範

放置斷點

在除錯的時候放置斷點非常簡單

Placing a breakpoint on the HTTP response

我們可以在模組被實際載入之前就放置斷點

處理檔案

使用 Chrome DevTools,我們可以在專案中建立和編輯檔案,並將它們儲存

Changing the source code of a script file

執行 npm 指令碼

如果專案中包含一些 npm 指令碼,可以通過 ndb 的皮膚中執行

![Running an npm script]qpic.url.cn/feeds_pic/a…)

內建終端

通過 ndb 也可以直接訪問終端

Opening the built-in terminal panel

Blackboxing

在預設情況下,ndb 會遮蔽一些外部檔案,如 node 內建庫,我們除錯的時候對這些外部檔案並不需要關心

Blackboxing the module loader of Node.js

程式皮膚

這個皮膚會列出當前由 ndb 啟動的所有 node 程式。此外,子程式會收攏到它的父程式中,方便管理和終止

Terminating a child and parent process by single click

程式碼片段

ndb 支援建立一些程式碼片段來執行和除錯

Creating and executing a snippet

變數訪問

當前程式變數和 node 的全域性變數,ndb 都可以訪問到

Logging `process` object to Console


《IVWEB 技術週刊》 震撼上線了,關注公眾號:IVWEB社群,每週定時推送優質文章。

相關文章