VSCode本身不提供Node.js运行时和内置沙箱,需系统安装node并确保PATH被正确继承;code-runner需手动配置参数支持ESM和UTF-8;调试依赖launch.json中runtimeExecutable与cwd精准指向真实JS文件及工作区根目录。

VSCode 本身不提供 Node.js 运行时,也不内置沙箱机制——你看到的“环境配置”本质是让 VSCode 正确调用系统 node,而“安全沙箱”必须靠外部约束(如权限限制、工作区信任、进程隔离)来实现,不是点开设置就能开的开关。
node 命令找不到?先确认 PATH 是否被 VSCode 继承
终端里能跑 node -v,但 VSCode 集成终端或 Code Runner 报 command not found: node,说明 VSCode 启动时没加载 shell 的 PATH。这不是插件问题,也不是 VSCode 设置漏配。
- macOS/Linux:检查
~/.zshrc或~/.bash_profile是否导出 PATH,比如export PATH="/opt/homebrew/bin:$PATH"(Homebrew 安装路径) - Windows:安装 Node.js 时务必勾选 Add to PATH;若已安装未勾选,重装或手动把
C:\Program Files\nodejs\加进系统环境变量 - VSCode 必须重启(关掉所有窗口再启动),否则会继承旧 shell 环境;Mac 上可尝试
code --no-sandbox从命令行启动
用 code-runner 跑 JS 却乱码/卡死?参数和编码得手动补
code-runner 默认执行 node $fileName,不带任何参数,遇到 ES Module、中文路径或异步输入就容易崩。
- 在 VSCode 设置里搜
code-runner.executorMap,把javascript对应值改成:node --experimental-specifier-resolution=node -r utf-8 $fileName -
-r utf-8仅 Windows 有效;Linux/macOS 一般不需要,乱码多因终端 locale 未设为 UTF-8 - 别用它跑含
process.stdin的脚本——code-runner 不支持交互式输入,直接切到集成终端手动运行
调试断点不生效?launch.json 的 runtimeExecutable 和 cwd 得对齐
VSCode 调试器(vscode-js-debug)依赖源映射和文件路径一致性。写错入口路径或工作目录,就会报 Cannot launch program because corresponding JavaScript cannot be found。
-
runtimeExecutable必须指向实际可执行的 JS 文件,比如"${workspaceFolder}/src/index.js",不能写成"index.js" -
cwd字段强烈建议显式指定:"cwd": "${workspaceFolder}",否则import相对路径、import_map.json或node_modules查找都会失败 - 如果项目用了 TypeScript 或打包工具(如 esbuild),需额外配
sourceMaps: true和outFiles,否则断点打在 .ts 上无效
想搞“Node 沙箱”?别信插件自动加权,靠三件事硬控
VSCode 没有类似 Deno 的运行时权限模型,所谓“沙箱”只能靠组合策略实现:限制扩展行为 + 控制进程能力 + 隔离工作区上下文。任何声称“一键开启 Node 沙箱”的插件都不可信。
- 启用受信任工作区:
"security.workspace.trust.enabled": true,打开陌生文件夹时自动禁用自动执行类扩展 - 手动限制敏感 API:在
settings.json中关掉高风险功能,例如"extensions.autoUpdate": false、"telemetry.enableCrashReporter": false - 真正需要隔离时,用 Dev Container + Docker + seccomp/eBPF——比如 MCP 场景下,
Dockerfile里挂载 cgroup v2、启用bpftool、用seccomp白名单过滤openat和connect系统调用
权限不是开了就完事,比如 --allow-read 默认只放行当前目录及子目录;想读 /etc/hosts,必须明确写成 --allow-read=/etc/hosts。同样,Node 进程若以 root 启动,再怎么配 VSCode 设置也拦不住它删根目录——沙箱的边界永远在操作系统层,不在编辑器里。











