淺談Node 調(diào)試工具入門教程
JavaScript 程序越來越復(fù)雜,調(diào)試工具的重要性日益凸顯。客戶端腳本有瀏覽器,Node 腳本怎么調(diào)試呢?
2016年,Node 決定將 Chrome 瀏覽器的"開發(fā)者工具"作為官方的調(diào)試工具,使得 Node 腳本也可以使用圖形界面調(diào)試,這大大方便了開發(fā)者。
本文介紹如何使用 Node 腳本的調(diào)試工具。
一、示例程序
為了方便講解,下面是一個(gè)示例腳本。首先,新建一個(gè)工作目錄,并進(jìn)入該目錄。
$ mkdir debug-demo $ cd debug-demo
然后,生成 package.json
文件,并安裝Koa 框架和 koa-route 模塊。
$ npm init -y $ npm install --save koa koa-route
接著,新建一個(gè)腳本 app.js
,并寫入下面的內(nèi)容。
// app.js const Koa = require('koa'); const router = require('koa-route'); const app = new Koa(); const main = ctx => { ctx.response.body = 'Hello World'; }; const welcome = (ctx, name) => { ctx.response.body = 'Hello ' + name; }; app.use(router.get('/', main)); app.use(router.get('/:name', welcome)); app.listen(3000); console.log('listening on port 3000');
上面代碼是一個(gè)簡(jiǎn)單的 Web 應(yīng)用,指定了兩個(gè)路由,訪問后會(huì)顯示一行歡迎信息。如果想詳細(xì)了解代碼的詳細(xì)含義,可以參考Koa 教程。
二、啟動(dòng)開發(fā)者工具
現(xiàn)在,運(yùn)行上面的腳本。
$ node --inspect app.js
上面代碼中, --inspect
參數(shù)是啟動(dòng)調(diào)試模式必需的。這時(shí),打開瀏覽器訪問 http://127.0.0.1//3000,就可以看到 Hello World 了。
接下來,就要開始調(diào)試了。一共有兩種打開調(diào)試工具的方法,第一種是在 Chrome 瀏覽器的地址欄,鍵入 chrome://inspect
或者 about:inspect
,回車后就可以看到下面的界面。
在 Target 部分,點(diǎn)擊 inspect 鏈接,就能進(jìn)入調(diào)試工具了。
第二種進(jìn)入調(diào)試工具的方法,是在 http://127.0.0.1//3000 的窗口打開"開發(fā)者工具",頂部左上角有一個(gè) Node 的綠色標(biāo)志,點(diǎn)擊就可以進(jìn)入。
三、調(diào)試工具窗口
調(diào)試工具其實(shí)就是"開發(fā)者工具"的定制版,省去了那些對(duì)服務(wù)器腳本沒用的部分。
它主要有四個(gè)面板。
- Console:控制臺(tái)
- Memory:內(nèi)存
- Profiler:性能
- Sources:源碼
這些面板的用法,基本上跟瀏覽器環(huán)境差不多,這里只介紹 Sources (源碼)面板。
四、設(shè)置斷點(diǎn)
進(jìn)入 Sources 面板,找到正在運(yùn)行的腳本 app.js
。
在第11行(也就是下面這一行)的行號(hào)上點(diǎn)一下,就設(shè)置了一個(gè)斷點(diǎn)。
ctx.response.body = 'Hello ' + name;
這時(shí),瀏覽器訪問 http://127.0.0.1:3000/alice ,頁面會(huì)顯示正在等待服務(wù)器返回。切換到調(diào)試工具,可以看到 Node 主線程處于暫停(paused)階段。
進(jìn)入 Console 面板,輸入 name,會(huì)返回 alice。這表明我們正處在斷點(diǎn)處的上下文(context)。
再切回 Sources 面板,右側(cè)可以看到 Watch、Call Stack、Scope、Breakpoints 等折疊項(xiàng)。打開 Scope 折疊項(xiàng),可以看到 Local 作用域和 Global 作用域里面的所有變量。
Local 作用域里面,變量 name
的值是 alice
,雙擊進(jìn)入編輯狀態(tài),把它改成 bob
。
然后,點(diǎn)擊頂部工具欄的繼續(xù)運(yùn)行按鈕。
頁面上就可以看到 Hello bob 了。
命令行下,按下 ctrl + c,終止運(yùn)行 app.js
。
五、調(diào)試非服務(wù)腳本
Web 服務(wù)腳本會(huì)一直在后臺(tái)運(yùn)行,但是大部分腳本只是處理某個(gè)任務(wù),運(yùn)行完就會(huì)終止。這時(shí),你可能根本沒有時(shí)間打開調(diào)試工具。等你打開了,腳本早就結(jié)束運(yùn)行了。這時(shí)怎么調(diào)試呢?
$ node --inspect=9229 -e "setTimeout(function() { console.log('yes'); }, 30000)"
上面代碼中, --inspect=9229
指定調(diào)試端口為 9229,這是調(diào)試工具默認(rèn)的通信端口。 -e
參數(shù)指定一個(gè)字符串,作為代碼運(yùn)行。
訪問 chrome://inspect
,就可以進(jìn)入調(diào)試工具,調(diào)試這段代碼了。
代碼放在 setTimeout
里面,總是不太方便。那些運(yùn)行時(shí)間較短的腳本,可能根本來不及打開調(diào)試工具。這時(shí)就要使用下面的方法。
$ node --inspect-brk=9229 app.js
上面代碼中, --inspect-brk
指定在第一行就設(shè)置斷點(diǎn)。也就是說,一開始運(yùn)行,就是暫停的狀態(tài)。
六、忘了寫 --inspect 怎么辦?
打開調(diào)試工具的前提是,啟動(dòng) Node 腳本時(shí)就加上 --inspect
參數(shù)。如果忘了這個(gè)參數(shù),還能不能調(diào)試呢?
回答是可以的。首先,正常啟動(dòng)腳本。
$ node app.js
然后,在另一個(gè)命令行窗口,查找上面腳本的進(jìn)程號(hào)。
$ ps ax | grep app.js 30464 pts/11 Sl+ 0:00 node app.js 30541 pts/12 S+ 0:00 grep app.js
上面命令中, app.js
的進(jìn)程號(hào)是 30464
。
接著,運(yùn)行下面的命令。
$ node -e 'process._debugProcess(30464)'
上面命令會(huì)建立進(jìn)程 30464 與調(diào)試工具的連接,然后就可以打開調(diào)試工具了。
還有一種方法,就是向腳本進(jìn)程發(fā)送 SIGUSR1 信號(hào),也可以建立調(diào)試連接。
$ kill -SIGUSR1 30464
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Node.js連接Sql Server 2008及數(shù)據(jù)層封裝詳解
這篇文章主要介紹了Node.js連接Sql Server 2008及數(shù)據(jù)層封裝,結(jié)合實(shí)例形式較為詳細(xì)的分析了nodejs連接SQL Server2008數(shù)據(jù)庫以及針對(duì)數(shù)據(jù)庫操作方法的封裝與使用相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-08-08nodejs dgram模塊廣播+組播的實(shí)現(xiàn)示例
這篇文章主要介紹了nodejs dgram模塊廣播+組播的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11nodejs調(diào)用cmd命令實(shí)現(xiàn)復(fù)制目錄
本文給大家介紹的是如何在nodejs中調(diào)用CMD命令,從而實(shí)現(xiàn)目錄的復(fù)制,非常的實(shí)用,有需要的小伙伴可以參考下。2015-05-05node實(shí)現(xiàn)基于token的身份驗(yàn)證
這篇文章主要介紹了node實(shí)現(xiàn)基于token的身份驗(yàn)證,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04nodejs實(shí)現(xiàn)超簡(jiǎn)單生成二維碼的方法
這篇文章主要介紹了nodejs實(shí)現(xiàn)超簡(jiǎn)單生成二維碼的方法,結(jié)合實(shí)例形式分析了nodejs基于qr-image插件生成二維碼的相關(guān)操作技巧,需要的朋友可以參考下2018-03-03Webpack 實(shí)現(xiàn) Node.js 代碼熱替換
Webpack有一個(gè)很實(shí)用的功能叫做熱替換(Hot-replace),尤其是結(jié)合React Hot Loader插件,開發(fā)過程中都不需要刷新瀏覽器,任何前端代碼的更改都會(huì)實(shí)時(shí)的在瀏覽器中表現(xiàn)出來。2015-10-10使用基于Node.js的構(gòu)建工具Grunt來發(fā)布ASP.NET MVC項(xiàng)目
這篇文章主要介紹了使用基于Node.js的構(gòu)建工具Grunt來發(fā)布ASP.NET MVC項(xiàng)目的教程,自動(dòng)化構(gòu)建工具Grunt具有編譯壓縮單元測(cè)試等功能,十分強(qiáng)大,需要的朋友可以參考下2016-02-02vscode執(zhí)行npm時(shí)的一些錯(cuò)誤以及處理辦法
在前端開發(fā)過程中,npm的使用是少不了的,所以需要知道基本的操作使用,并且了解常見的異常情況處理,下面這篇文章主要給大家介紹了關(guān)于vscode執(zhí)行npm時(shí)的一些錯(cuò)誤以及處理辦法的相關(guān)資料,需要的朋友可以參考下2022-07-07