自己調試一直在chrome里面,今天看了一下vscode的調試功能,原文鏈接https://jerryzou.com/posts/vscode-debug-guide/
Visual Studio Code (以下簡稱 vscode) 如今已經代替 Sublime,成為前端工程師們最喜愛的代碼編輯器。它作為一個大型的開源項目,不斷推陳出新;社區中涌現出大量優質的插件,以支持我們更加舒服地進行開發工作。在近期的工作中,我嘗試通過 vscode 來提升調試代碼的幸福度,積累了一點點小心得在此與大家分享一下。
接下來的內容將從以下幾方面進行展開:
- launch / attach
- 調試前端代碼
- 調試通過 Nodemon 啟動的 Node 服務器
1. launch / attach
要使用 vscode 的調試功能,首先就得配置 .vscode/launch.json
文件。以最簡單的 Node 調試配置為例:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "launch",
"name": "Launch",
"program": "${workspaceRoot}/index.js"
},
{
"type": "node",
"request": "attach",
"name": "Attach",
"port": 5858
}
]
}
其中最重要的參數是 request
,它的取值有兩種 launch
和 attach
。
- launch模式:由 vscode 來啟動一個獨立的具有 debug 模式的程序
- attach模式:附加於(也可以說“監聽”)一個已經啟動的程序(必須已經開啟 Debug 模式)
這兩種截然不同的模式到底有什么具體的應用場景呢?且看后文。
2. 調試前端代碼
通過 vscode 調試前端代碼主要依賴於一個插件:Debugger for Chrome,該插件主要利用 Chrome 所開放出來的接口 來實現對其渲染的頁面進行調試。可以通過 Shift + Cmd + X
打開插件中心,搜索對應插件后直接安裝。安裝完成並重新加載 vscode 后,可以直接點擊調試按鈕並創建新的啟動配置。如果你之前已經創建過啟動配置了,就可以直接打開 .vscode/launch.json
進行修改。
其中調試 Chrome 頁面的配置如下所示:
{
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "launch",
"name": "啟動一個獨立的 Chrome 以調試 frontend",
"url": "http://localhost:8091/frontend",
"webRoot": "${workspaceRoot}/frontend"
}
]
}
如之前所述,通過第一個 launch 配置就能啟動一個通過 vscode 調試的 Chrome。大家可以直接使用我組織好的項目 zry656565/vscode-debug-sample 進行測試,測試方法在該項目的 README 里面寫得很清楚了。簡要步驟概括為:
npm run frontend
- 啟動調試配置:“啟動一個獨立的 Chrome 以調試 frontend”
- 在
frontend/index.js
中加斷點 - 訪問
http://localhost:8091/frontend/
延伸問題
使用 launch
模式調試前端代碼存在一個問題,就是 vscode 會以新訪客的身份打開一個新的 Chrome 進程,也就是說你之前在 Chrome 上裝的插件都沒法在這個頁面上生效(如下圖所示)。
在這種情況下 attach
模式就有它存在的意義了:對一個已經啟動的 Chrome 進行監聽調試。
{
"version": "0.2.0",
"configurations": [
{
"type": "chrome",
"request": "attach",
"name": "監聽一個已經啟動調試模式的 Chrome",
"port": 9222,
"url": "http://localhost:8091/frontend",
"webRoot": "${workspaceRoot}/frontend"
}
]
}
其中 9222 是 Chrome 的調試模式推薦的端口,可以根據需要進行修改。不過目前我並沒有成功實施這個設想,對此有興趣的同學可以從下面這兩個鏈接入手去研究一下:
有一部分遇到的問題可以直接在 Debugger for Chrome 的 FAQ 中得到解答。
3. 調試通過 Nodemon 啟動的 Node 服務器
如今,使用 Node 服務器開發一些中間層的服務也慢慢納入了所謂“大前端”的范疇。而在開發 Node 服務時,我們通常要借助類似於 nodemon 這樣的工具來避免頻繁手動重啟服務器。在這種情況下,我們又如何利用 vscode 來進行斷點調試呢?先來看看示例配置文件:
{
"version": "0.2.0",
"configurations": [
{
"type": "node",
"request": "attach",
"name": "附加於已啟動的 Node 服務器(debug模式)",
"port": 5858,
"restart": true
},
{
"type": "node",
"request": "attach",
"name": "附加於已啟動的 Node 服務器(inspect模式)",
"port": 9229,
"restart": true
}
]
}
首先,為了配合 nodemon 在監聽到文件修改時重啟服務器,此處需要添加一個 restart
參數。同時大家可能注意到了,這里給出了兩種模式,大家可能根據以下區別來選擇合適自己的協議:
Runtime | ‘Legacy Protocol’ | ‘Inspector Protocol’ |
---|---|---|
io.js | all | no |
node.js | < 8.x | >= 6.3 (Windows: >= 6.9) |
Electron | all | not yet |
Chakra | all | not yet |
通俗來說,舊版 Node (< 6.3) 推薦使用 Legacy Protocol (--debug
模式,默認 5858 端口),而新版的 Node (>= 6.3) 推薦使用 Inspector Protocol (--inspect
模式,默認 9229 端口)。
需要注意的是,在啟動 nodemon 程序時,也要添加對應的參數,比如:
nodemon --debug server/app.js
nodemon --inspect server/app.js
詳細的例子同樣可以在 zry656565/vscode-debug-sample 中找到。
參考資料
- VS Code - Debugger for Chrome - README
- Debugging in VS Code
- Chrome DevTools Protocol Viewer
- bdspen/nodemon_vscode
- Node.js Debugging in VS Code
在我看完了這篇文章以后,試着去用了下vscode debugger for chrome,在debugger的時候瀏覽器彈出了一個新的mini版的chrome窗口,然而用下來感覺還是沒有chrome瀏覽器里面的控制台好用,說句實在的,以后還是用Chrome控制台好了...