成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

讓你 Nodejs 水平暴增的 Debugger 技巧

開發 前端
我覺得學習 nodejs 除了要掌握基礎的 api、常用的一些包外,最重要的能力是學會使用 debugger。因為當流程復雜的時候,斷點調試能夠幫你更好的理清邏輯,有 bug 的時候也能更快的定位問題。

 [[409644]]

本文轉載自微信公眾號「神光的編程秘籍」,作者神說要有光zxg。轉載本文請聯系神光的編程秘籍公眾號。

學習 nodejs 最重要的是什么?可能每個人都有自己的答案。

我覺得學習 nodejs 除了要掌握基礎的 api、常用的一些包外,最重要的能力是學會使用 debugger。因為當流程復雜的時候,斷點調試能夠幫你更好的理清邏輯,有 bug 的時候也能更快的定位問題。

狼叔說過,是否會使用 debugger 是區分一個程序員 nodejs 水平的重要標志。

本文分享一下 debugger 的原理和 vscode debugger 的使用技巧。

debugger 原理

運行 nodejs 代碼的時候,如果帶上了 --inspect(可以打斷點) 或者 --inspect-brk(可以打斷點,并在首行斷住) 的參數,那么就會以 debugger 的模式啟動:

可以看到,node 啟動了一個 web socket 的 server,地址是:ws://127.0.0.1:9229/78637688-e8e0-4582-80cc-47655f4bff66

為什么 debugger 要啟動一個 websocket server 呢?

debugger 的含義就是要在某個地方斷住,可以單步運行、查看環境中的變量。那么怎么設置斷點、怎么把當前上下文的變量暴露出去呢,就是通過啟動一個 websocket server,這時候只要啟動一個 websocket client 連接上這個 server 就可以調試 nodejs 代碼了。

v8 debug protocol

連上之后呢,debugger server 和 debugger client 怎么交流?這就涉及到了 v8 debug protocol。

通過兩邊都能識別的格式來交流,比如:

在 test.js 的 100 行 設置斷點:

  1.     "seq":118, 
  2.     "type":"request"
  3.     "command":"setbreakpoint"
  4.     "arguments":{ 
  5.         "type":"script"
  6.         "target":"test.js"
  7.         "line":100 
  8.     } 

然后查看當前作用域的變量:

  1.     "seq":117, 
  2.     "type":"request"
  3.     "command":"scope" 

執行一個表達式:

  1.     "seq":118, 
  2.     "type":"request"
  3.     "command":"evaluate"
  4.     "arguments":{ 
  5.         "expression":"a()" 
  6.     } 

之后繼續運行:

  1.     "seq":117, 
  2.     "type":"request"
  3.     "command":"continue" 

通過這種方式,client 就可以告訴 debugger server 如何執行代碼。

debugger client

debugger client 一般都是有 ui 的(當然,在命令行里面通過命令來調試也可以,但一般不這么做)。常見的 js 的 debugger client 有 chrome devtools 和 vscode debugger 等。

我們寫一個簡單的 js 腳本,通過 node --inspect-brk 跑起來:

可以看到它啟動在了 9229 端口,

然后,我們分別通過兩種 client 連上它。

chrome devtools

在 chrome 地址欄輸入 chrome://inspect,然后點擊 configure 來配置目標端口:

把剛才的端口 9229 填上去:

然后就可以看到 chrome 掃描到了這個 target,點擊 inspect 就可以連上這個 debugger server。

之后就可以設置斷點、單步執行、執行表達式、查看作用域變量等,這些功能都是通過 v8 debug protocol 來實現的。

vscode debugger

在 vscode 里面寫代碼,在 chrome devtools 里調試比較麻煩,vscode 也實現了 debugger 的支持,可以直接用 vscode 來調試。

使用vscode 調試能力的方式是修改項目根目錄下的 .vscode/launch.json 配置。

attach

點擊右下角的按鈕來添加一個配置項。這里選擇 nodejs 的 attach:

因為已經通過 node --inspect-brk 啟動了 websocket 的 debugger server,那么只需要啟動 websocket client,然后 attach 上 9229 端口就行。

點擊左側的按鈕,就可以連上 debugger server 開始調試:

launch

這樣先通過 node --inspect-brk 啟動 debugger server,然后再添加 vscode debug 配置來連接上太麻煩了,能不能把這兩步合并呢?

當然可以,只要添加一個 launch 的配置:

這里的 type 是 launch,就是啟動 debgger server 并且啟動一個 debugger client 連接上該 server。運行的程序是根目錄下的 index2.js,還可以設置 stopOnEntry 來在首行斷住。

點擊調試,就可以看到能夠成功的調試該 js 文件。

vscode 會啟動 debugger server,然后啟動 debugger client 自動連接上該 server,這些都不需要我們去關心。

這樣我們就可以成功的使用 vscode debugger 來調試 nodejs 代碼。

vscode debugger 進階

debugger client 中我們最常用的還是 vscode,這里著重講一下 vscode debugger 的各種場景下的配置。

sourcemap

如果調試 ts 代碼,肯定不能調試編譯后的代碼,要能夠映射回源碼,這個是 sourcemap 做的事情。調試工具都支持 sourcemap,比如 chrome devtools 和 vscode debugger,都支持文件末尾的 sourcemap url 的解析:

//# sourceMappingURL=index.js.map

這樣當調試 index.js的時候,如果它是 ts 編譯的出來的,就會自動找到對應的 ts。

當然,如果調試配置里面直接指定了 ts,那么要能夠調試需要再配置 outFiles,告訴 vscode 去哪里找 sourcemap。

這樣,在 ts 源碼中打的斷點和在編譯出的 js 打的斷點都能生效。

多進程調試

當代碼中有子進程的時候,就有了第二條控制流,需要再啟動一個 debugger。

比如 vscode,它是基于 electron,需要啟動一個主進程,一些渲染進程。主進程是通過 launch 啟動的,而渲染進程則是后來 attach 的。

主進程啟動的時候,通過 --remote-debugging-port 來指定子進程自動的時候的 debugger server 的端口。

outFiles 來指定 sourcemap 的位置,這樣才可以直接調試 ts 源碼。runtimeExecutable 是用 vscode 的運行時替代掉了 nodejs(一般不需要設置)。

然后渲染進程是后面啟動的,我們通過參數配置了會啟動在 9222 端口,那么只要 attach 到那個端口就可以調試該進程了。

vscode 支持多 target 調試,也就是可以在 vscode 里面同時啟動 多個 debugger??梢郧袚Q不同的 debugger 來調試不同的進程。

總結

debugger 的使用是一項很重要的能力,對于 nodejs 水平的提升很有幫助。

nodejs debugger 的原理是 js 引擎會啟動 debugger server(websocket),等待客戶端連接,我們可以通過各種 debugger client 連上來進行調試,比如 chrome devtools、vscode debugger。

調試 nodejs 代碼更多還是使用 vscode debugger(當然有的時候也會使用 chrome devtools 調試,基于 chrome devtools 的 memory 來進行內存分析,定位內存泄漏問題的時候很有幫助)。

vscode debugger 的使用主要是在 .vscode/launch.json 里面添加調試配置。

調試配置分為 launch 和 attach 兩種:

  • launch 會啟動 debugger server 并用 debugger client 連接上
  • attach 只是啟動 debugger client 連接上已有的 debugger server,所以要指定端口

具體的配置項常用的有:

  • outFiles 指定 sourcemap 的位置,用來調試 ts 源碼等需要編譯的代碼
  • stopOnEntry 在首行停住
  • args 來指定一些命令行參數
  • runtimeExecutable 當運行時不是 nodejs 的時候需要指定,比如 vscode 或者其他的一些運行時

基于這些配置我們就可以調試各種場景下的 nodejs 代碼,需要編譯的,或者多個進程的。

不夸張地說,如果你熟悉了 debugger 的使用,理解各種 nodejs 代碼都會簡單很多。希望這篇文章能夠幫助大家了解 debugger 的原理,并且能夠使用 chrome devtools 或者 vscode debugger 來調試 nodejs 代碼。知道有 sourcemap 以及多進程的情況下都怎么調試。

 

責任編輯:武曉燕 來源: 神光的編程秘籍
相關推薦

2021-12-25 22:29:31

類型編程Javascript類型體操

2024-07-22 00:00:00

2023-03-27 14:33:50

ChatGPT

2020-05-07 17:03:49

Python編碼開發

2025-03-27 03:40:00

分布式系統Kafka

2020-12-04 10:45:18

辦公軟件插件工具

2021-07-19 22:51:28

Python開發編程

2023-11-28 10:17:37

2015-10-30 10:33:02

溝通程序員事業發展

2025-02-28 14:00:00

結構體C#.NET 9

2017-05-18 09:16:54

前端CSS技巧

2011-03-02 14:15:06

Pureftpd

2021-08-17 10:08:44

HTML網站網絡

2020-11-29 17:32:01

EmacsLinux

2025-02-24 08:24:25

2021-03-04 09:25:08

Go語言惡意軟件黑客

2025-01-13 02:00:00

模型訓練數據

2019-11-25 10:20:54

CSS代碼javascript

2023-01-04 08:17:21

Typescript技巧欺騙性

2011-04-28 16:55:07

電子商務網站設計網站
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 无码一区二区三区视频 | 亚洲福利一区二区 | 久久亚洲一区二区 | www.国产.com | 日韩欧美一区二区三区免费看 | 精品欧美一区二区三区久久久小说 | 国产色| 国产亚洲一区二区三区在线观看 | 91精品国产91久久久久久密臀 | 成人高清在线 | 日韩av免费在线观看 | 一级黄色毛片a | www.亚洲精品 | 人人99| 毛片网在线观看 | 黄色欧美视频 | 色av一区 | 在线免费观看毛片 | 国产91精品久久久久久久网曝门 | 国产不卡在线观看 | 天天天天天天操 | 亚洲啊v在线 | 国产三级在线观看播放 | 国产有码 | 久草在线青青草 | 国产精品精品视频一区二区三区 | 男女羞羞视频在线看 | 亚洲欧美日韩精品 | 亚洲黄色一级 | 国产美女在线观看 | 国产男女猛烈无遮掩视频免费网站 | 欧美成人一区二免费视频软件 | 欧美精品91| 日韩精品一区在线 | 国产成人精品一区二区三区网站观看 | 人人射人人草 | 成人在线视频网站 | 久久综合伊人 | 男人天堂网址 | 国产精品久久久久久久久久久久久久 | 国产成人精品免高潮在线观看 |