VS Code中launch.json文件用法详解

每一个懂事淡定的现在,都有一个很傻很天真的过去,每一个温暖而淡然的如今,都有一个悲伤而不安的曾经

Posted by yishuifengxiao on 2025-10-08

launch.json文件

什么是 launch.json

launch.json 文件位于项目根目录的 .vscode 文件夹下。它的主要作用是告诉 VS Code 的调试器:

  • 如何启动你的程序(例如,使用哪个解释器/运行时,传递什么参数)。
  • 如何附加到已经运行的程序上进行调试。
  • 为不同的编程语言和运行时环境(Node.js, Python, C++, Go, .NET等)提供定制化的调试配置。

简而言之,它让你可以按 F5 键就能一键启动一个复杂的调试会话,而无需在终端中输入一长串命令。


如何创建 launch.json

  1. 在 VS Code 中打开你的项目文件夹。
  2. 切换到 “运行和调试” 视图(快捷键 Ctrl+Shift+D 或 Cmd+Shift+D on Mac)。
  3. 点击 “创建一个 launch.json 文件”。
  4. VS Code 会尝试检测你的项目类型(如 Python, Node.js)并提供相应的模板。选择一个,它会自动生成一个初始的 launch.json 文件。

launch.json 的整体结构

一个典型的 launch.json 文件包含一个 配置数组,名为 configurations,里面可以包含多个调试配置。你还可以有一个顶级的 version 属性和一个可选的 compounds 属性(用于同时启动多个配置)。

{
"version": "0.2.0",
"configurations": [
{
// 配置项 1 (例如:启动 Python 脚本)
"name": "Python: 当前文件",
"type": "python",
"request": "launch",
// ... 其他具体配置
},
{
// 配置项 2 (例如:附加到 Node.js 进程)
"name": "附加到 Node 进程",
"type": "node",
"request": "attach",
// ... 其他具体配置
}
],
"compounds": [
{
// 复合配置,用于同时启动多个配置
"name": "启动客户端和服务端",
"configurations“: ["启动服务端", "启动客户端"]
}
]
}

核心配置属性(所有环境通用)

这些是绝大多数调试配置都会用到的基本属性。

属性名 是否必需 描述
name 是 在调试下拉菜单中显示的可读名称,例如 “启动服务器”。
type 是 指定调试器类型。这决定了使用哪个 VS Code 调试扩展。
- node (JavaScript/Node.js)
- python
- cppvsdbg (Windows C/C++)
- cppdbg (其他平台的 C/C++, 需要 GDB/LLDB)
- go
request 是 调试请求类型。
- launch: 启动一个新的程序并进行调试。
- attach: 附加到一个已经运行的进程或远程主机上进行调试。
program launch 时常用 指定要调试的程序入口文件。
- Python: /path/to/app.py
- Node.js: /path/to/app.js
- C++: /path/to/executable
args 否 传递给程序的命令行参数数组。
例:["--port", "3000", "--verbose"]
env 否 设置程序运行时的环境变量。是一个键值对对象。
例:{ "NODE_ENV": "development", "API_KEY": "12345" }
cwd 否 设置程序运行时的当前工作目录。默认为 ${workspaceFolder}。
console 否 指定输出显示在哪个控制台。
- internalConsole: VS Code 内置调试控制台(默认)
- integratedTerminal: VS Code 集成终端
- externalTerminal: 外部系统终端
preLaunchTask 否 在启动调试之前运行一个在 tasks.json 中定义的 任务。例如,编译代码、运行 npm 脚本等。
postDebugTask 否 在调试结束之后运行一个任务。
internalConsoleOptions 否 控制调试控制台的行为,例如 neverOpen。

重要的预定义变量(占位符)

这些是 VS Code 提供的变量替换功能,让你可以动态地引用路径和值,使配置更通用。

变量 描述
${workspaceFolder} 最常用。表示在 VS Code 中打开的项目根目录的绝对路径。
${workspaceFolderBasename} workspace 文件夹的名称,不含任何路径。
${file} 当前打开的活动文件的绝对路径。
${relativeFile} 当前打开的文件相对于 workspaceFolder 的相对路径。
${fileBasename} 当前文件的基本名称(含扩展名),例如 app.py。
${fileBasenameNoExtension} 当前文件的基本名称(不含扩展名),例如 app。
${fileDirname} 当前文件所在目录的绝对路径。
${fileExtname} 当前文件的扩展名,例如 .py。
${lineNumber} 当前光标所在的行号。
${selectedText} 当前在编辑器中选中的文本。
${env:VARIABLE} 引用环境变量,例如 ${env:HOME} 或 ${env:PATH}。
${config:SETTING} 引用 VS Code 的用户设置,例如 ${config:python.pythonPath}。
${command:COMMAND} 执行一个 VS Code 命令并返回值。

使用示例:

{
"name": "调试当前 Python 文件",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"args": [
"--input",
"${fileDirname}/input.txt"
],
"env": {
"MY_PROJECT_HOME": "${workspaceFolder}"
}
}

这个配置会:调试当前活动的文件,在工作目录的集成终端中运行,并传递一个参数指向当前文件同目录下的 input.txt,同时设置一个环境变量指向工作区根目录。


VS Code launch.json 核心配置属性详细说明

基础必需属性

name - 配置名称

作用:在调试下拉菜单中显示的可读标识符

{
"name": "启动 Node.js 服务器",
"type": "node",
"request": "launch"
}

详细说明:

  • 必需属性,用于区分不同的调试配置
  • 应该具有描述性,清晰说明配置的用途
  • 支持使用表情符号增强可读性
  • 在多配置环境中,命名应体现配置的差异

type - 调试器类型

作用:指定使用的调试器扩展

{
"name": "Python 调试",
"type": "python", // 使用 Python 调试扩展
"request": "launch"
}

常用值:

  • "node" - Node.js JavaScript 调试
  • "python" - Python 调试
  • "cppvsdbg" - Windows C/C++ 调试
  • "cppdbg" - GDB/LLDB C/C++ 调试
  • "go" - Go 语言调试
  • "java" - Java 调试
  • "php" - PHP 调试

注意事项:

  • 必须安装对应的 VS Code 扩展
  • 类型名称区分大小写
  • 某些语言可能有多个调试器类型可选

request - 调试请求类型

作用:定义调试会话的启动方式

{
"name": "启动新进程",
"type": "node",
"request": "launch", // 启动新进程
"program": "${workspaceFolder}/app.js"
}

两种模式:

"launch" - 启动模式

{
"request": "launch",
"program": "${workspaceFolder}/app.js",
"args": ["--port", "3000"]
}

特点:

  • 启动全新的进程进行调试
  • 完全控制进程的生命周期
  • 可以设置启动参数和环境变量
  • 适用于开发阶段的调试

"attach" - 附加模式

{
"request": "attach",
"port": 9229,
"address": "localhost"
}

特点:

  • 附加到已运行的进程进行调试
  • 进程必须已启用调试支持
  • 适用于生产环境问题诊断
  • 适用于容器化应用调试

程序执行控制属性

program - 程序入口

作用:指定要调试的可执行文件或脚本

{
"name": "启动应用",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/src/main.js"
}

语言特定用法:

  • Node.js: .js 文件路径
  • Python: .py 文件路径
  • Go: 包路径或可执行文件
  • Java: 主类名
  • C++: 编译后的可执行文件路径

args - 命令行参数

作用:传递给程序的命令行参数数组

{
"name": "带参数启动",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"args": [
"--port", "3000",
"--env", "development",
"--verbose",
"--config", "${workspaceFolder}/config.json"
]
}

特性:

  • 数组中的每个元素代表一个参数
  • 支持使用变量占位符
  • 参数顺序与命令行一致
  • 可以包含标志和值对

env - 环境变量

作用:设置程序运行时的环境变量

{
"name": "设置环境变量",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"env": {
"NODE_ENV": "development",
"DEBUG": "app:*",
"DATABASE_URL": "postgresql://localhost:5432/dev",
"API_KEY": "${env:MY_API_KEY}",
"LOG_LEVEL": "debug",
"PORT": "3000"
}
}

重要特性:

  • 键值对形式的环境变量设置
  • 支持变量替换 ${env:EXISTING_VAR}
  • 可以覆盖系统环境变量
  • 敏感信息应通过系统环境变量传递

cwd - 工作目录

作用:设置程序运行的当前工作目录

{
"name": "设置工作目录",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"cwd": "${workspaceFolder}/src",
"args": [
"--config", "../config/dev.json"
]
}

使用场景:

  • 相对路径解析的基准目录
  • 模块解析的起点
  • 文件读写的默认位置
  • 如果不设置,默认为 ${workspaceFolder}

调试器行为控制属性

stopOnEntry - 入口断点

作用:程序启动后是否立即在入口点暂停

{
"name": "入口调试",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"stopOnEntry": true, // 在程序开始处暂停
"console": "integratedTerminal"
}

适用场景:

  • 希望从程序第一行开始单步调试
  • 调试初始化过程
  • 检查启动参数和环境设置

console - 控制台类型

作用:指定程序输出的显示位置

{
"name": "不同控制台示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"console": "integratedTerminal" // 使用集成终端
}

可选值:

"internalConsole" - 内置调试控制台

{
"console": "internalConsole"
}

特点:

  • VS Code 内置的调试控制台
  • 不支持交互式输入(如 readline)
  • 输出格式良好,支持 ANSI 颜色
  • 默认选项

"integratedTerminal" - 集成终端

{
"console": "integratedTerminal"
}

特点:

  • 使用 VS Code 的集成终端
  • 支持交互式输入
  • 更接近真实终端体验
  • 推荐用于需要用户输入的程序

"externalTerminal" - 外部终端

{
"console": "externalTerminal"
}

特点:

  • 在系统默认终端中运行
  • 完全独立的终端体验
  • 适用于需要特定终端功能的场景

internalConsoleOptions - 控制台行为

作用:控制内置调试控制台的行为

{
"name": "控制台选项",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"console": "internalConsole",
"internalConsoleOptions": "openOnSessionStart"
}

可选值:

  • "neverOpen" - 从不自动打开调试控制台
  • "openOnSessionStart" - 调试开始时自动打开
  • "openOnFirstSessionStart" - 首次调试会话时打开

生命周期和任务集成属性

preLaunchTask - 启动前任务

作用:在调试开始前执行的任务名称

{
"name": "构建后调试",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/dist/app.js",
"preLaunchTask": "build", // 执行 tasks.json 中的 build 任务
"args": ["--production"]
}

配合 tasks.json:
// tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"type": "npm",
"script": "build",
"group": "build"
}
]
}

常见用途:

  • 编译源代码
  • 运行测试套件
  • 安装依赖
  • 准备测试数据
  • 启动依赖服务

postDebugTask - 调试后任务

作用:调试会话结束后执行的任务

{
"name": "调试后清理",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"postDebugTask": "cleanup", // 调试结束后执行清理
"env": {
"CREATE_TEMP_FILES": "true"
}
}

常见用途:

  • 清理临时文件
  • 停止测试服务
  • 生成调试报告
  • 重置测试数据库

高级调试控制属性

skipFiles - 跳过文件

作用:指定在调试过程中跳过的文件模式

{
"name": "跳过第三方代码",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"skipFiles": [
"<node_internals>/**", // 跳过 Node.js 内部文件
"${workspaceFolder}/node_modules/**", // 跳过 node_modules
"**/test/**", // 跳过测试文件
"**/vendor/**" // 跳过供应商代码
]
}

模式语法:

  • ** - 匹配任意多级目录
  • * - 匹配单级目录或文件
  • <pattern> - 特殊模式(如 <node_internals>)

sourceMaps - 源映射支持

作用:启用或禁用 JavaScript 源映射

{
"name": "TypeScript 调试",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/dist/app.js",
"sourceMaps": true, // 启用源映射
"outFiles": ["${workspaceFolder}/dist/**/*.js"]
}

配合 TypeScript/转译代码:

  • 允许在源代码(如 .ts)中调试,而不是编译后的代码
  • 需要正确的源映射文件

restart - 自动重启

作用:进程退出后是否自动重启调试会话

{
"name": "自动重启",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"restart": true, // 进程退出后自动重启
"console": "integratedTerminal"
}

适用场景:

  • 开发服务器自动重启
  • 长时间运行的监控进程
  • 需要保持服务可用的场景

属性组合和最佳实践

完整配置示例

{
"version": "0.2.0",
"configurations": [
{
// 基础识别属性
"name": "Node.js 开发服务器",
"type": "node",
"request": "launch",

// 程序执行控制
"program": "${workspaceFolder}/src/server.js",
"args": [
"--port", "3000",
"--env", "development"
],
"env": {
"NODE_ENV": "development",
"DEBUG": "app:*",
"DATABASE_URL": "postgresql://localhost:5432/dev"
},
"cwd": "${workspaceFolder}",

// 调试器行为
"stopOnEntry": false,
"console": "integratedTerminal",
"internalConsoleOptions": "openOnSessionStart",

// 生命周期集成
"preLaunchTask": "install-deps",
"postDebugTask": "clean-logs",

// 高级调试控制
"skipFiles": [
"<node_internals>/**",
"${workspaceFolder}/node_modules/**"
],
"sourceMaps": true,
"restart": true,

// 输出控制
"outputCapture": "std"
}
]
}

属性分类总结

类别 属性 重要性 默认值
基础识别 name, type, request 必需 无
程序执行 program, args, env, cwd 高度推荐 各不同
调试行为 stopOnEntry, console 推荐 false, internalConsole
任务集成 preLaunchTask, postDebugTask 可选 无
高级控制 skipFiles, sourceMaps, restart 可选 各不同

语言/环境特定属性示例

不同语言的调试器扩展会引入自己特有的属性。

Node.js / JavaScript

  • runtimeExecutable: 指定 Node.js 可执行文件的路径(默认是 node)。
  • runtimeArgs: 传递给 Node.js 运行时本身的参数,例如 ["--inspect-brk"]。
  • runtimeVersion: 如果使用 nvm,可以指定一个版本,如 "14"。
{
"name": "启动 Node.js 服务器",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"args": ["--port", "3000"],
"runtimeArgs": ["--nolazy"] // 传递给 node 本身的参数
}

Python

  • python: 指定 Python 解释器的路径。通常由 Python 扩展自动管理。
  • module: 指定要运行的模块(如 flask),而不是一个文件。与 program 二选一。
  • jinja: 是否启用对 Jinja2 模板的调试。
{
"name": "Python: Flask",
"type": "python",
"request": "launch",
"module": "flask",
"args": ["run", "--host=0.0.0.0", "--port=5000"],
"env": {
"FLASK_APP": "${workspaceFolder}/app.py",
"FLASK_ENV": "development"
}
}

C/C++

  • miDebuggerPath: 指定 GDB 或 LLDB 调试器的路径。
  • miDebuggerServerAddress: 连接到远程 gdbserver 的地址。
  • stopAtEntry: 是否在程序入口(main函数)处自动中断。
  • externalConsole: (已废弃,用 console) 是否使用外部控制台。
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/build/myapp",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}

复合启动配置

compounds 允许你同时启动多个调试配置。例如,同时调试一个前端和一个后端服务。

"compounds": [
{
"name": "启动全栈应用",
"configurations": ["启动后端 API", "启动前端客户端"],
"stopAll": true // 当其中一个配置停止时,停止所有配置
}
]

Golang 语言特定属性

基础 Go 调试配置

{
"version": "0.2.0",
"configurations": [
{
"name": "Go: 调试当前文件",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${fileDirname}",
"env": {
"GOPATH": "${env:GOPATH}",
"GOROOT": "${env:GOROOT}"
},
"args": ["--port", "8080"],
"showLog": true
}
]
}

高级 Go 调试配置

{
"version": "0.2.0",
"configurations": [
{
"name": "Go: 高级调试",
"type": "go",
"request": "launch",

// 运行模式配置
"mode": "debug", // auto, debug, test, remote
"program": "${workspaceFolder}/cmd/api",
"cwd": "${workspaceFolder}",

// 构建和输出配置
"output": "${workspaceFolder}/bin/debug",
"buildFlags": "-tags=json1,debug -ldflags='-X main.version=dev'",
"env": {
"GOOS": "linux",
"GOARCH": "amd64",
"CGO_ENABLED": "0",
"DEBUG": "true",
"DB_HOST": "localhost"
},

// 调试器行为
"stopOnEntry": false,
"logOutput": "rpc,dap,debugger",
"showGlobalVariables": false,

// 远程调试
"remotePath": "",
"port": 2345,
"host": "127.0.0.1",

// 进程参数
"args": [
"--config",
"${workspaceFolder}/config/dev.yaml",
"--verbose"
],

// 测试特定配置
"testFlags": ["-v", "-race"],
"packagePathToGoModPathMap": {
"/app": "${workspaceFolder}"
},

// 调试控制台
"console": "integratedTerminal",
"internalConsoleOptions": "openOnSessionStart"
}
]
}

Go 测试调试配置

{
"configurations": [
{
"name": "Go: 调试测试",
"type": "go",
"request": "launch",
"mode": "test",
"program": "${workspaceFolder}/pkg/users",
"args": [
"-test.v",
"-test.run",
"TestUserService"
],
"buildFlags": "-race",
"env": {
"TEST_DATABASE_URL": "postgres://test@localhost/test"
}
},
{
"name": "Go: 调试单个测试函数",
"type": "go",
"request": "launch",
"mode": "test",
"program": "${fileDirname}",
"args": [
"-test.v",
"-test.run",
"^${fileBasenameNoExtension}$"
]
}
]
}

Go 模块和依赖调试

{
"configurations": [
{
"name": "Go: 多模块项目",
"type": "go",
"request": "launch",
"mode": "debug",
"program": "${workspaceFolder}/cmd/main",
"env": {
"GO111MODULE": "on",
"GOPRIVATE": "*.company.com"
},
"buildFlags": "-mod=readonly",
"dlvFlags": ["--check-go-version=false"],
"substitutePath": [
{
"from": "${workspaceFolder}",
"to": "/go/src/project"
}
]
}
]
}

Java 语言特定属性

基础 Java 调试配置

{
"version": "0.2.0",
"configurations": [
{
"name": "Java: 启动当前文件",
"type": "java",
"request": "launch",
"mainClass": "${file}",
"args": [],
"vmArgs": ["-Xmx512m"]
}
]
}

高级 Java 调试配置

{
"version": "0.2.0",
"configurations": [
{
"name": "Java: Spring Boot 应用",
"type": "java",
"request": "launch",

// 主类和项目配置
"mainClass": "com.example.Application",
"projectName": "my-spring-boot-app",
"classPaths": [
"${workspaceFolder}/target/classes",
"${workspaceFolder}/target/dependency/*"
],

// JVM 参数
"vmArgs": [
"-Xmx1024m",
"-Xms512m",
"-Dspring.profiles.active=dev",
"-Dlogging.level.com.example=DEBUG",
"-javaagent:${workspaceFolder}/lib/spring-instrument.jar"
],

// 程序参数
"args": [
"--server.port=8080",
"--spring.config.location=classpath:/application-dev.yml"
],

// 环境变量
"env": {
"DATABASE_URL": "jdbc:postgresql://localhost:5432/dev",
"REDIS_HOST": "localhost"
},

// 调试器配置
"stopOnEntry": false,
"console": "internalConsole",
"internalConsoleOptions": "openOnSessionStart",

// 源路径
"sourcePaths": ["${workspaceFolder}/src/main/java"],

// 高级调试选项
"stepFilters": {
"skipClasses": ["java.lang.*", "sun.*", "com.sun.*"],
"skipSynthetics": true,
"skipStaticInitializers": false,
"skipConstructors": false
},

// 启动前任务
"preLaunchTask": "build",

// 热部署配置
"hotCodeReplace": "auto",
"enableHotCodeReplace": true
}
]
}

Maven/Gradle 项目调试

{
"configurations": [
{
"name": "Java: Maven Spring Boot",
"type": "java",
"request": "launch",
"mainClass": "com.example.DemoApplication",
"projectName": "demo-project",
"vmArgs": [
"-Dspring-boot.run.profiles=dev",
"-Dspring.devtools.restart.enabled=true"
],
"args": [],
"classPaths": [
"${workspaceFolder}/target/classes",
"${workspaceFolder}/target/test-classes"
],
"preLaunchTask": "maven: package"
},
{
"name": "Java: Gradle 应用",
"type": "java",
"request": "launch",
"mainClass": "Application",
"projectName": "gradle-project",
"vmArgs": [
"-Dspring.profiles.active=development"
],
"args": [],
"preLaunchTask": "gradle: build"
}
]
}

Java 测试调试配置

{
"configurations": [
{
"name": "Java: JUnit 测试",
"type": "java",
"request": "launch",
"mainClass": "org.junit.platform.console.ConsoleLauncher",
"args": [
"--scan-classpath",
"${workspaceFolder}/target/test-classes",
"--include-classname",
".*Test",
"--details", "verbose"
],
"vmArgs": [
"-Djunit.jupiter.execution.parallel.enabled=true"
],
"classPaths": [
"${workspaceFolder}/target/test-classes",
"${workspaceFolder}/target/classes"
]
},
{
"name": "Java: 调试当前测试类",
"type": "java",
"request": "launch",
"mainClass": "org.junit.platform.console.ConsoleLauncher",
"args": [
"--select-class",
"${fileBasenameNoExtension}",
"--details",
"tree"
],
"projectName": "${workspaceFolderBasename}",
"preLaunchTask": "maven: test-compile"
}
]
}

企业级 Java 配置

{
"configurations": [
{
"name": "Java: 企业应用服务器",
"type": "java",
"request": "launch",

// 应用服务器配置
"mainClass": "org.apache.catalina.startup.Bootstrap",
"vmArgs": [
"-Dcatalina.base=${workspaceFolder}/tomcat",
"-Dcatalina.home=${workspaceFolder}/tomcat",
"-Djava.io.tmpdir=${workspaceFolder}/tomcat/temp",
"-Djava.endorsed.dirs=${workspaceFolder}/tomcat/endorsed",
"-Dlog4j.configurationFile=file:${workspaceFolder}/config/log4j2.xml",
"-Dcom.sun.management.jmxremote",
"-Dcom.sun.management.jmxremote.port=9010",
"-Dcom.sun.management.jmxremote.ssl=false",
"-Dcom.sun.management.jmxremote.authenticate=false"
],

// 类路径和模块
"classPaths": [
"${workspaceFolder}/tomcat/bin/bootstrap.jar",
"${workspaceFolder}/tomcat/bin/tomcat-juli.jar",
"${workspaceFolder}/webapp/WEB-INF/classes",
"${workspaceFolder}/webapp/WEB-INF/lib/*"
],

// 调试配置
"env": {
"JAVA_OPTS": "-Xmx2048m -XX:+UseG1GC",
"SPRING_CONFIG_LOCATION": "file:${workspaceFolder}/config/"
},

// 远程调试支持
"hostName": "localhost",
"port": 8000,

// 启动前准备
"preLaunchTask": "deploy-to-tomcat",
"postDebugTask": "undeploy-from-tomcat"
}
]
}

Node.js 语言特定属性

基础 Node.js 调试配置

{
"version": "0.2.0",
"configurations": [
{
"name": "Node.js: 启动当前文件",
"type": "node",
"request": "launch",
"program": "${file}",
"cwd": "${workspaceFolder}",
"console": "integratedTerminal",
"args": ["--port", "3000"]
}
]
}

高级 Node.js 调试配置

{
"version": "0.2.0",
"configurations": [
{
"name": "Node.js: Express 服务器",
"type": "node",
"request": "launch",

// 程序入口和参数
"program": "${workspaceFolder}/src/app.js",
"args": ["--env", "development", "--cluster", "false"],
"cwd": "${workspaceFolder}",

// 运行时配置
"runtimeExecutable": "/usr/local/bin/node",
"runtimeVersion": "18", // 使用 nvm 版本
"runtimeArgs": [
"--preserve-symlinks",
"--max-old-space-size=4096",
"--trace-warnings"
],

// 环境变量
"env": {
"NODE_ENV": "development",
"DEBUG": "app:*",
"PORT": "3000",
"DATABASE_URL": "postgresql://localhost:5432/dev",
"REDIS_URL": "redis://localhost:6379"
},

// 进程控制
"autoAttachChildProcesses": true,
"stopOnEntry": false,
"restart": true,

// 源映射和转译
"sourceMaps": true,
"outFiles": [
"${workspaceFolder}/dist/**/*.js",
"${workspaceFolder}/build/**/*.js"
],
"sourceMapPathOverrides": {
"webpack:///./*": "${workspaceFolder}/*",
"webpack:///src/*": "${workspaceFolder}/src/*"
},

// 跳过文件
"skipFiles": [
"<node_internals>/**",
"${workspaceFolder}/node_modules/**",
"**/test/**"
],

// 控制台和输出
"console": "integratedTerminal",
"outputCapture": "std",

// 调试器行为
"showAsyncStacks": true,
"pauseForSourceMap": false
}
]
}

Node.js 框架特定配置

{
"configurations": [
{
"name": "Node.js: NestJS 应用",
"type": "node",
"request": "launch",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "start:debug"],
"console": "integratedTerminal",
"restart": true,
"env": {
"NODE_ENV": "development",
"TS_NODE_PROJECT": "${workspaceFolder}/tsconfig.json"
},
"sourceMaps": true,
"skipFiles": ["<node_internals>/**", "**/node_modules/**"]
},
{
"name": "Node.js: Next.js 开发服务器",
"type": "node",
"request": "launch",
"runtimeExecutable": "npm",
"runtimeArgs": ["run", "dev"],
"console": "integratedTerminal",
"env": {
"NODE_OPTIONS": "--inspect"
},
"port": 9229,
"sourceMaps": true
},
{
"name": "Node.js: React 开发服务器",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/node_modules/.bin/react-scripts",
"args": ["start"],
"env": {
"BROWSER": "none",
"PORT": "3000"
},
"console": "integratedTerminal"
}
]
}

Node.js 测试调试配置

{
"configurations": [
{
"name": "Node.js: Jest 测试",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/node_modules/.bin/jest",
"args": [
"--runInBand",
"--no-cache",
"--watchAll=false",
"${fileBasenameNoExtension}"
],
"console": "integratedTerminal",
"internalConsoleOptions": "neverOpen",
"env": {
"NODE_ENV": "test",
"CI": "true"
}
},
{
"name": "Node.js: Mocha 测试",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/node_modules/.bin/mocha",
"args": [
"--require",
"ts-node/register",
"--timeout",
"999999",
"--colors",
"${file}"
],
"console": "integratedTerminal",
"env": {
"NODE_ENV": "test"
}
},
{
"name": "Node.js: 调试当前测试文件",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/node_modules/.bin/jest",
"args": [
"${file}",
"--config",
"${workspaceFolder}/jest.config.js",
"--no-cache",
"--runInBand"
],
"console": "integratedTerminal"
}
]
}

Node.js 微服务和容器调试

{
"configurations": [
{
"name": "Node.js: Docker 容器调试",
"type": "node",
"request": "attach",
"port": 9229,
"address": "localhost",
"localRoot": "${workspaceFolder}",
"remoteRoot": "/app",
"restart": true,
"sourceMaps": true,
"sourceMapPathOverrides": {
"/app/*": "${workspaceFolder}/*"
},
"skipFiles": [
"<node_internals>/**",
"/app/node_modules/**"
]
},
{
"name": "Node.js: Kubernetes Pod 调试",
"type": "node",
"request": "attach",
"port": 9229,
"address": "localhost",
"localRoot": "${workspaceFolder}",
"remoteRoot": "/usr/src/app",
"restart": false,
"sourceMaps": true
},
{
"name": "Node.js: 远程服务器调试",
"type": "node",
"request": "attach",
"port": 9229,
"address": "192.168.1.100",
"localRoot": "${workspaceFolder}",
"remoteRoot": "/var/www/app",
"timeout": 30000
}
]
}

Node.js TypeScript 调试

{
"configurations": [
{
"name": "Node.js: TypeScript 开发",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/src/index.ts",
"runtimeArgs": [
"--loader",
"ts-node/esm",
"--preserve-symlinks"
],
"env": {
"TS_NODE_PROJECT": "${workspaceFolder}/tsconfig.json",
"NODE_ENV": "development"
},
"console": "integratedTerminal",
"sourceMaps": true,
"skipFiles": ["<node_internals>/**"],
"resolveSourceMapLocations": [
"${workspaceFolder}/**",
"!**/node_modules/**"
]
}
]
}

VS Code launch.json 占位符详细说明

基础路径占位符

工作区相关占位符

{
"configurations": [
{
"name": "工作区示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/src/app.js",
"cwd": "${workspaceFolder}",
"env": {
"PROJECT_ROOT": "${workspaceFolder}",
"PROJECT_NAME": "${workspaceFolderBasename}"
},
"args": [
"--config",
"${workspaceFolder}/config/dev.json"
]
}
]
}

详细说明:

  • ${workspaceFolder}

    • 含义:当前在 VS Code 中打开的文件夹的绝对路径
    • 示例值:/Users/username/projects/my-app
    • 使用场景:引用项目根目录下的文件
    • 注意事项:在多工作区环境中,可以使用 ${workspaceFolder:FolderName} 指定特定工作区
  • ${workspaceFolderBasename}

    • 含义:工作区文件夹的名称(不包含路径)
    • 示例值:my-app
    • 使用场景:在环境变量或参数中使用项目名称

当前文件相关占位符

{
"configurations": [
{
"name": "文件相关示例",
"type": "python",
"request": "launch",
"program": "${file}", // 当前打开的文件
"cwd": "${fileDirname}", // 当前文件所在目录
"args": [
"--input", "${fileDirname}/input.txt",
"--output", "${fileDirname}/output/${fileBasenameNoExtension}.out"
],
"env": {
"CURRENT_FILE": "${fileBasename}",
"CURRENT_MODULE": "${fileBasenameNoExtension}"
}
}
]
}

详细说明:

  • ${file}

    • 含义:当前在编辑器中激活的文件的完整路径
    • 示例值:/Users/username/projects/my-app/src/main.py
    • 使用场景:调试当前正在编辑的文件
  • ${fileDirname}

    • 含义:当前文件所在的目录路径
    • 示例值:/Users/username/projects/my-app/src
    • 使用场景:设置工作目录或引用同级文件
  • ${fileBasename}

    • 含义:当前文件的完整文件名(包含扩展名)
    • 示例值:main.py
    • 使用场景:在参数或环境变量中使用文件名
  • ${fileBasenameNoExtension}

    • 含义:当前文件的文件名(不包含扩展名)
    • 示例值:main
    • 使用场景:生成输出文件名或模块名
  • ${fileExtname}

    • 含义:当前文件的扩展名
    • 示例值:.py
    • 使用场景:根据文件类型执行不同逻辑
  • ${relativeFile}

    • 含义:当前文件相对于工作区文件夹的相对路径
    • 示例值:src/main.py
    • 使用场景:显示更友好的路径信息

位置和选择相关占位符

{
"configurations": [
{
"name": "位置相关示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"args": [
"--start-line", "${lineNumber}",
"--selected-text", "${selectedText}"
],
"env": {
"DEBUG_LINE": "${lineNumber}",
"DEBUG_COLUMN": "${selectedText}"
}
}
]
}

详细说明:

  • ${lineNumber}

    • 含义:编辑器中光标当前所在的行号
    • 示例值:42
    • 使用场景:从特定行开始调试或设置断点
  • ${selectedText}

    • 含义:当前在编辑器中选中的文本内容
    • 示例值:functionName
    • 使用场景:将选中的标识符作为参数传递
    • 注意事项:如果未选中文本,该变量可能为空

环境变量占位符

系统环境变量

{
"configurations": [
{
"name": "环境变量示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"env": {
"PATH": "${env:PATH}",
"HOME": "${env:HOME}",
"USER": "${env:USER}",
"NODE_PATH": "${env:NODE_PATH}:/custom/path",
"COMPOSITE_VAR": "${env:HOME}/projects/${workspaceFolderBasename}"
},
"args": [
"--user-home", "${env:HOME}",
"--temp-dir", "${env:TMPDIR}"
]
}
]
}

详细说明:

  • ${env:VARIABLE_NAME}
    • 含义:引用操作系统的环境变量
    • 示例:${env:PATH}, ${env:HOME}, ${env:USER}
    • 使用场景:
      • 继承系统路径配置
      • 访问用户目录
      • 使用系统特定的配置
    • 注意事项:
      • 如果环境变量不存在,会被替换为空字符串
      • 在 Windows 和 Unix 系统上环境变量名称可能不同

VS Code 配置变量

{
"configurations": [
{
"name": "配置变量示例",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/app.py",
"pythonPath": "${config:python.pythonPath}",
"env": {
"EDITOR_FONT_SIZE": "${config:editor.fontSize}",
"THEME": "${config:workbench.colorTheme}",
"TAB_SIZE": "${config:editor.tabSize}"
},
"args": [
"--theme", "${config:workbench.colorTheme}",
"--font-size", "${config:editor.fontSize}"
]
}
]
}

详细说明:

  • ${config:setting.name}
    • 含义:引用 VS Code 用户设置或工作区设置
    • 示例:
      • ${config:python.pythonPath} - Python 解释器路径
      • ${config:editor.fontSize} - 编辑器字体大小
      • ${config:workbench.colorTheme} - 当前主题
    • 使用场景:
      • 使用用户在 VS Code 中配置的路径
      • 根据编辑器设置调整程序行为
    • 查找方法:在 VS Code 设置中搜索想要的设置项,点开设置文件可以看到具体的设置名称

输入变量 (Input Variables)

基本输入类型

{
"version": "0.2.0",
"configurations": [
{
"name": "输入变量示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"args": [
"--environment", "${input:environment}",
"--log-level", "${input:logLevel}",
"--user", "${input:username}",
"--config-file", "${input:configFile}"
],
"env": {
"DEPLOY_ENV": "${input:environment}",
"USER_NAME": "${input:username}"
}
}
],
"inputs": [
{
"id": "environment",
"type": "pickString",
"description": "选择部署环境",
"options": [
"development",
"staging",
"production"
],
"default": "development"
},
{
"id": "logLevel",
"type": "pickString",
"description": "选择日志级别",
"options": [
{"label": "🔴 ERROR", "value": "error"},
{"label": "🟡 WARN", "value": "warn"},
{"label": "🔵 INFO", "value": "info"},
{"label": "🟢 DEBUG", "value": "debug"}
],
"default": "info"
},
{
"id": "username",
"type": "promptString",
"description": "输入用户名",
"default": "anonymous"
},
{
"id": "configFile",
"type": "pickString",
"description": "选择配置文件",
"options": [
"${workspaceFolder}/config/dev.json",
"${workspaceFolder}/config/test.json",
"${workspaceFolder}/config/prod.json"
]
}
]
}

高级输入类型

{
"inputs": [
{
"id": "commandInput",
"type": "command",
"command": "workbench.action.quickOpen",
"args": ">Select file: "
},
{
"id": "multiStepInput",
"type": "promptString",
"description": "多步骤输入示例 - 第一步",
"default": "step1"
},
{
"id": "fileBrowser",
"type": "pickString",
"description": "选择文件",
"options": [
"${workspaceFolder}/src/main.js",
"${workspaceFolder}/src/utils.js",
"${workspaceFolder}/tests/test.js"
]
}
]
}

输入类型详解:

  • promptString

    • 用途:显示文本输入框让用户输入字符串
    • 属性:description, default, password(设为 true 可隐藏输入)
    • 示例:输入用户名、密码、API密钥等
  • pickString

    • 用途:显示下拉列表让用户选择预定义选项
    • 属性:description, options(数组或对象数组), default
    • 示例:选择环境、日志级别、配置文件
  • command

    • 用途:执行 VS Code 命令并获取结果
    • 属性:command, args
    • 示例:打开文件选择器、获取当前分支等

命令变量 (Command Variables)

{
"configurations": [
{
"name": "命令变量示例",
"type": "node",
"request": "launch",
"program": "${command:extension.node-debug.pickWorkspaceFolder}/app.js",
"cwd": "${command:extension.node-debug.pickWorkspaceFolder}",
"args": [
"--git-branch", "${command:git.getCurrentBranch}",
"--active-file", "${command:extension.filepath}"
],
"env": {
"CURRENT_BRANCH": "${command:git.getCurrentBranch}",
"PROJECT_SELECTED": "${command:extension.node-debug.pickWorkspaceFolder}"
}
}
]
}

常用命令变量:

  • ${command:extension.node-debug.pickWorkspaceFolder}

    • 让用户选择工作区文件夹
  • ${command:git.getCurrentBranch}

    • 获取当前 Git 分支名称(需要 Git 扩展)
  • ${command:extension.filepath}

    • 获取当前文件路径

复合和条件占位符

条件表达式

{
"configurations": [
{
"name": "条件占位符示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/app.js",
"args": [
// 条件参数:如果文件存在则使用,否则使用默认值
"${command:fileExists,'${workspaceFolder}/config/local.json'}? '--config local.json' : '--config default.json'",

// 基于平台的参数
"${command:isWindows}? '--platform windows' : '--platform unix'"
],
"env": {
// 条件环境变量
"SPECIAL_FEATURE": "${command:fileExists,'${workspaceFolder}/features/advanced.js'}? 'enabled' : 'disabled'",

// 平台特定路径
"TEMP_DIR": "${command:isWindows}? 'C:\\\\Temp' : '/tmp'"
}
}
]
}

复合路径构建

{
"configurations": [
{
"name": "复合路径示例",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/src/${fileBasenameNoExtension}.py",
"cwd": "${workspaceFolder}/build/${input:buildType}",
"args": [
"--output",
// 构建复杂输出路径
"${workspaceFolder}/dist/${input:buildType}/${fileDirname}/${fileBasenameNoExtension}.out",

"--logs",
"${workspaceFolder}/logs/${env:USER}/${fileBasenameNoExtension}.log"
],
"env": {
"CACHE_DIR": "${env:HOME}/.cache/${workspaceFolderBasename}",
"DATA_PATH": "${workspaceFolder}/data/${input:dataset}"
}
}
],
"inputs": [
{
"id": "buildType",
"type": "pickString",
"options": ["debug", "release"],
"default": "debug"
},
{
"id": "dataset",
"type": "promptString",
"description": "输入数据集名称",
"default": "training"
}
]
}

多工作区占位符

{
"configurations": [
{
"name": "多工作区示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder:backend}/server.js",
"cwd": "${workspaceFolder:backend}",
"args": [
"--frontend-path", "${workspaceFolder:frontend}/dist",
"--shared-lib", "${workspaceFolder:shared-lib}/dist"
],
"env": {
"BACKEND_ROOT": "${workspaceFolder:backend}",
"FRONTEND_ROOT": "${workspaceFolder:frontend}",
"SHARED_ROOT": "${workspaceFolder:shared-lib}",
"COMPOSITE_PATH": "${workspaceFolder:backend}:${workspaceFolder:frontend}"
}
}
]
}

实用技巧和最佳实践

错误处理和回退

{
"configurations": [
{
"name": "容错配置示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/src/app.js",
"args": [
// 使用环境变量,如果不存在则使用默认值
"--api-key", "${env:API_KEY:default-key}",

// 检查文件存在性
"${command:fileExists,'${workspaceFolder}/config/custom.json'}? '--config custom.json' : '--config default.json'"
],
"env": {
// 环境变量回退机制
"DATABASE_URL": "${env:DATABASE_URL:sqlite://./default.db}",
"LOG_LEVEL": "${env:LOG_LEVEL:info}"
}
}
]
}

调试配置验证

{
"configurations": [
{
"name": "验证示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/src/app.js",

// 添加验证注释(不会被执行,仅供文档)
"_comment": "此配置需要以下文件存在: ${workspaceFolder}/package.json, ${workspaceFolder}/src/app.js",

"args": [
"--config",
// 验证配置文件存在
"${command:fileExists,'${workspaceFolder}/config/prod.json'}? 'config/prod.json' : 'config/dev.json'"
],

"env": {
// 验证必要环境变量
"REQUIRED_VAR": "${env:REQUIRED_API_KEY}",
"OPTIONAL_VAR": "${env:OPTIONAL_SETTING:default_value}"
}
}
]
}

性能优化技巧

{
"configurations": [
{
"name": "性能优化示例",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/src/app.js",

// 避免在热路径中使用复杂命令变量
"args": [
"--simple-arg", "value", // 直接值
"--file-arg", "${file}" // 简单变量
],

// 预计算复杂路径
"env": {
"COMPLEX_PATH": "${workspaceFolder}/build/${input:buildType}/output"
},

// 使用输入变量减少交互
"preLaunchTask": "precompute-variables"
}
],
"inputs": [
{
"id": "buildType",
"type": "pickString",
"options": ["debug", "release"],
"default": "debug"
}
]
}

实际应用场景

多环境部署配置

{
"version": "0.2.0",
"configurations": [
{
"name": "多环境应用",
"type": "node",
"request": "launch",
"program": "${workspaceFolder}/src/app.js",
"args": [
"--env", "${input:deployEnvironment}",
"--config", "${workspaceFolder}/config/${input:deployEnvironment}.json"
],
"env": {
"NODE_ENV": "${input:deployEnvironment}",
"API_BASE_URL": "${input:apiBaseUrl}",
"DATABASE_URL": "${input:databaseUrl}"
}
}
],
"inputs": [
{
"id": "deployEnvironment",
"type": "pickString",
"description": "选择部署环境",
"options": [
{
"label": "🟢 开发环境",
"value": "development"
},
{
"label": "🟡 测试环境",
"value": "testing"
},
{
"label": "🔴 生产环境",
"value": "production"
}
]
},
{
"id": "apiBaseUrl",
"type": "promptString",
"description": "输入 API 基础 URL",
"default": "http://localhost:3000"
},
{
"id": "databaseUrl",
"type": "promptString",
"description": "输入数据库连接 URL",
"default": "postgresql://localhost:5432/dev"
}
]
}