VsCode 各場景高級調試技巧,有用!

VsCode 自從誕生以來,以其各自優異的特性迅速走紅。尤其是對於前端開發小夥伴來說,幾乎成爲必不可少的開發工具。所以,熟練掌握 VsCode 的各自使用技巧與調試技巧會讓你的日常開發工作效率倍增。本文將會以大量圖文的方式,從下面幾個方面詳細介紹 VsCode 的各種技巧:

基本技巧

快速啓動

VsCode 安裝後,會自動寫入環境變量,終端輸入code即可喚起 VsCode 應用程序。

常用快捷鍵

垂直標尺

在配置文件中添加如下配置,可以增加字符數標尺輔助線

"editor.rulers"[40, 80, 100]
複製代碼

進階技巧

斷點的基本使用

下面以在 VsCode 中快速調試一個 Node 項目爲例,演示斷點的基本使用。後文會繼續結束各種高級斷點。

program字段用於指定你的程序入口文件,${workspaceFolder}表示當前項目根路徑

浮窗的操作按鈕功能依次爲:

日誌斷點

日誌斷點是普通斷點的一種變體,區別在於不會中斷調試,而是可以把信息記錄到控制檯。日誌斷點對於調試無法暫停或停止的服務時特別有用。步驟如下:

可以使用{}使用變量,比如在此處添加日誌斷點,b的值爲${b}

表達式條件斷點

條件斷點是表達式結果爲true時纔會進行斷點,步驟如下:

命中計數斷點

只有該行代碼命中了指定次數,纔會進行斷點。步驟如下:

內聯斷點

僅當執行到達與內聯斷點關聯的列時,纔會命中內聯斷點。這在調試在一行中包含多個語句的縮小代碼時特別有用。比如 for 循環,短路運算符等一行代碼包含多個表達式時會特別有用。步驟如下:

補充知識點:數據面板介紹

補充知識點:監聽面板介紹

可以將變量添加到監聽面板,實時觀察變量的變化。

補充知識點:調試服務器時打開一個 URI

開發 Web 程序通常需要在 Web 瀏覽器中打開特定 URL,以便在調試器中訪問服務器代碼。VS Code 有一個內置功能 “serverReadyAction” 來自動化這個任務。

var express = require('express');
var app = express();

app.get('/'function(req, res) {
  res.send('Hello World!');
});

app.listen(3000, function() {
  console.log('Example app listening on port 3000!');
});
複製代碼
{
  "type""node",
  "request""launch",
  "name""Launch Program",
  "program""${workspaceFolder}/app.js",

  "serverReadyAction"{
    "pattern""listening on port ([0-9]+)",
    "uriFormat""http://localhost:%s",
    "action""openExternally"
  }
}
複製代碼

pattern是設置匹配的程度端口號,端口號放在小括號內,即作爲一個正則的捕獲組使用。uriFormat映射爲 URI,其中%s使用pattern中的第一個捕獲組替換。最後使用該 URI 作爲外部程序打開的 URI。

終局:各場景調試實戰

調試 NodeJS 項目

關於 NodeJs 項目的調試方法,已經在上述的斷點的基本使用 [1] 部分做了介紹,可以網上滾動翻閱。

調試 Typescript 項目

補充知識點:tasks 配置文件的創建方式

補充知識點:每次調試時重新編譯

{
 "version""2.0.0",
 "tasks"[
    {
      "type""typescript",
      "tsconfig""tsconfig.json",
      "problemMatcher"[
        "$tsc"
      ],
      "group""build",
      "label""tsc: 構建 - tsconfig.json"
    }
  ]
}
複製代碼

注意,如果編譯後的 js 文件不在相應的位置,通過圖中的outFiles字段可以指定ts編譯後的js路徑。

補充知識點:VsCode 的 TS 版本說明

修改工作區 ts 版本的方法:

調試 html 項目

學會了上述 ts 的調試後,我們嘗試調試 html 文件,並且 html 文件中引入 ts 文件:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta >
  <title>Document</title>
</head>
<body>
  <h3>Hello</h3>
  <script src="./out/index.js"></script>
</body>
</html>
複製代碼
const num: number =  1221;
console.log(num);

function fn(arg: string): void {
  console.log('fn', arg);
}

document.body.append('World')

fn("he");
複製代碼

{
  // 使用 IntelliSense 瞭解相關屬性。 
  // 懸停以查看現有屬性的描述。
  // 欲瞭解更多信息,請訪問: https://go.microsoft.com/fwlink/?linkid=830387
  "version""0.2.0",
  "configurations"[
    {
      "type""pwa-chrome",
      "request""launch",
      "name""Launch Chrome",
      "url""file:///E:/demo/vscode/debug/ts/index.html",
      "preLaunchTask""tsc: 構建 - tsconfig.json",
      "webRoot""${workspaceFolder}"
    }
  ]
}
複製代碼

調試 Vue 項目的兩種方式

下面介紹兩種調試 vue2 項目的 3 種方法,其他框架的調試也類似:

不使用 vscode 插件 Debugger for chrome 的方法

module.exports = {
  configureWebpack: {
    // 生成sourceMaps
    devtool: "source-map"
  }
};
複製代碼

{
  "version""0.2.0",
  "configurations"[
    {
      "type""chrome",
      "request""launch",
      "name""vuejs: chrome",
      "url""http://localhost:8080",
      "webRoot""${workspaceFolder}",
      "breakOnLoad": true,
      "pathMapping"{
        "/_karma_webpack_""${workspaceFolder}"
      },
      "sourceMapPathOverrides"{
        "webpack:/*""${webRoot}/*",
        "/./*""${webRoot}/*",
        "/src/*""${webRoot}/*",
        "/*""*",
        "/./~/*""${webRoot}/node_modules/*"
      },
      "preLaunchTask""serve"
    }
  ]
}

複製代碼
{
  "version""2.0.0",
  "tasks"[
    {
      "label""serve",
      "type""npm",
      "script""serve",
      "isBackground": true,
      "problemMatcher"[
        {
          "base""$tsc-watch",
          "background"{
            "activeOnStart": true,
            "beginsPattern""Starting development server",
            "endsPattern""Compiled successfully"
          }
        }
      ],
      "group"{
        "kind""build",
        "isDefault"true
      }
    }
  ]
}
複製代碼

該腳本的作用是運行npm run serve編譯命令。

注意:此方式的主要點在於launch.json配置文件中,通過preLaunchTask字段指定調試前先運行一個任務腳本,preLaunchTask的值對應tasks.json文件中的label值。

更多詳細內容,大家可以點擊這裏的參考文檔 [2] 查閱。

藉助 vscode 插件 Debugger for Chrome 在 Chrome 中調試

module.exports = {
  configureWebpack: {
    // 生成sourceMaps
    devtool: "source-map"
  }
};
複製代碼

# 終端執行命令,啓動項目
npm run serve
複製代碼

更多詳細內容,請點擊這裏的參考文檔 [3] 查閱。

藉助 vscode 插件Debugger for Firfox在 Firefox 中調試

{
  "version""0.2.0",
  "configurations"[
    // 省略Chrome的配置...
    // 下面添加的Firefox的配置
    {
      "type""firefox",
      "request""launch",
      "reAttach": true,
      "name""vuejs: firefox",
      "url""http://localhost:8080",
      "webRoot""${workspaceFolder}/src",
      "pathMappings"[{ "url""webpack:///src/""path""${webRoot}/" }]
    }
  ]
}
複製代碼

Firefox 初始啓動時不會觸發調試,需要刷新一次

調試 Electron 項目

Electron 很多人都使用過,主要用於開發跨平臺的系統桌面應用。那麼來看下vue-cli-electron-builder創建的Electron項目怎麼調試。步驟如下:

module.exports = {
  configureWebpack: {
    devtool: 'source-map'
  }
}
複製代碼
{
  "version""0.2.0",
  "configurations"[
    {
      "name""Electron: Main",
      "type""node",
      "request""launch",
      "protocol""inspector",
      "preLaunchTask""bootstarp-service",
      "runtimeExecutable""${workspaceRoot}/node_modules/.bin/electron",
      "windows"{
        "runtimeExecutable""${workspaceRoot}/node_modules/.bin/electron.cmd"
      },
      "args"["--remote-debugging-port=9223""./dist_electron"],
      "outFiles"["${workspaceFolder}/dist_electron/**/*.js"]
    },
    {
      "name""Electron: Renderer",
      "type""chrome",
      "request""attach",
      "port": 9223,
      "urlFilter""http://localhost:*",
      "timeout": 0,
      "webRoot""${workspaceFolder}/src",
      "sourceMapPathOverrides"{
        "webpack:///./src/*""${webRoot}/*"
      }
    },
  ],
  "compounds"[
    {
      "name""Electron: All",
      "configurations"["Electron: Main""Electron: Renderer"]
    }
  ]
}
複製代碼

此處配置了兩個調試命令: Electron: Main用於調試主進程,Electron: Renderer用於調試渲染進程;compounds[].選項用於定義複合調試選項; configurations定義的複合命令是並行的; preLaunchTask用於配置命令執行前先執行的任務腳本,其值對應tasks.json中的label字段; preLaunchTask用在compounds時,用於定義configurations複合任務執行前先執行的腳本。

{
  // See https://go.microsoft.com/fwlink/?LinkId=733558
  // for the documentation about the tasks.json format
  "version""2.0.0",
  "tasks"[
    {
      "label""bootstarp-service",
      "type""process",
      "command""./node_modules/.bin/vue-cli-service",
      "windows"{
        "command""./node_modules/.bin/vue-cli-service.cmd",
        "options"{
          "env"{
            "VUE_APP_ENV""dev",
            "VUE_APP_TYPE""local"
          }
        }
      },
      "isBackground": true,
      "args"[
        "electron:serve""--debug"
      ],
      "problemMatcher"{
        "owner""custom",
        "pattern"{
          "regexp"""
        },
        "background"{
          "beginsPattern""Starting development server\\.\\.\\.",
          "endsPattern""Not launching electron as debug argument was passed\\."
        }
      }
    }
  ]
}
複製代碼

在主進程相關代碼上打上斷點,然後啓動調試主進程命令就可以調試主進程了

注意,這裏的options參數是根據實際的情況,自定義添加我們運行項目時所需要的參數,比如我這裏因爲啓動項目的 npm 命令是:

"serve-local:dev""cross-env VUE_APP_TYPE=local VUE_APP_ENV=dev vue-cli-service electron:serve"
複製代碼

切換到渲染進程的調試選項,在渲染進程的代碼處打上斷點,點擊調試。注意,此時並不會有斷點終端,需要ctrl+r手動刷新軟件進程纔會看到渲染進程的斷點。

同時開啓渲染進程和主進程的調試,只需要切換到調試全部的選項即可。注意,此種方式因爲compounds[].configurations配置是並行執行的,並不一定能保證渲染進程調試一定能附加到主進程調試成功(估計是時機問題),有些時候會調試渲染進程不成功。所以,可以採取上面的方式進行調試。

更多調試 Electron 的內容,可以點擊參考文檔 [4] 查閱。

補充:更進一步

其他技巧

技巧一:代碼片段(snippets)

從擴展商店中安裝 snippets

@category:"snippets"
複製代碼

創建全局代碼片段

{
  "自動補全console.log"{
    "scope""javascript,typescript",
      "prefix""log",
      "body"[
        "console.log('$1');",
        "$2"
      ],
    "description""輸出console.log('')"
  }
}

"body"[
  "console.log('${1:abc}');"
],
複製代碼

用兩個豎線包含多個選擇值,|多個選擇值直接用逗號隔開|

"body"[
  "console.log('${1:abc}');",
  "${2|aaa,bbb,ccc|}"
],
複製代碼

新建當前工作區的代碼片段

只需要選擇文件 \-> 首選項 \-> 用戶片段 \-> 新建xxx文件夾的代碼片段, 新建後會在當前工作區生成.vscode/xxx.code-snippets文件

技巧二:Emmet

vscode 內置了對 Emmet 的支持,無需額外擴展。例如 html 的 Emmet 演示如下:

技巧三:對光標處代碼變量快速重命名

選中或者光標所處的位置,按F2可以對所有的變量重命名

技巧四:代碼重構建議

補充:VsCode 擴展插件開發

VsCode 擴展插件可以做什麼事情?

基於Yeoman快速開發 VsCode 插件,步驟如下:

# 終端運行,主要node版本需要12及以上,node10會安裝報錯
npm i -g yo generator-code
複製代碼

關於本文

來源:愣錘

https://juejin.cn/post/7071146744339234846

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/lrDcU82p4rMZ34IXsgfNwA