vscode调试.mjs文件报错是因调试器未启用esm模式,必须用"type": "pwa-node"、node≥18.16且program指向真实.mjs路径;.mjs后缀本身已强制esm,但vscode不自动识别,需launch.json显式配置。

VSCode调试时.mjs文件报Cannot use import statement outside a module
这不是Node版本问题,而是VSCode调试器没按ESM模式启动。即使文件后缀是.mjs,launch.json里没正确声明,VSCode仍可能用CommonJS loader加载——因为它的调试协议默认不看扩展名,只看type和runtimeVersion。
必须同时满足三个条件:
-
"type": "pwa-node"(不是"node",旧版type: "node"在Node ≥18下已弃用且不支持ESM) -
"program"指向真实存在的.mjs路径,如"${workspaceFolder}/index.mjs" - Node.js ≥18.16(低于此版本
pwa-node无法识别.mjs为ESM)
别手动加--input-type=module或--loader——VSCode会自动注入调试参数,硬加反而冲突。
没package.json或没设"type": "module",但想跑.mjs文件
只要文件后缀是.mjs,Node.js本身就会强制按ESM解析,package.json里的"type": "module"对.mjs完全无效。这是Node的硬性优先级:后缀 > package.json字段。
但VSCode调试器不完全遵循这个规则——它依赖launch.json配置来决定模块加载策略。所以:
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 终端执行
node index.mjs成功,不代表F5能跑通 - 如果项目里混用
.js和.mjs,.js文件仍走CommonJS(除非package.json有"type": "module"),require('./utils.js')在index.mjs里会报错 - 动态
import()在.mjs里可用,但require()在任何.mjs里都直接ReferenceError
为什么断点变灰、提示“Debugger attached”但不中断
常见于launch.json中"type"写成"node"或"pwa-chrome"。前者不支持ESM调试,后者根本不是Node运行时。
检查点:
- 确认
launch.json里是"type": "pwa-node" - 删掉所有
"runtimeExecutable"硬编码路径——它会绕过VSCode的ESM适配逻辑 - 确保
package.json里没有"type": "commonjs"(Node不允许显式设这个值,但某些脚手架会误写) - Windows用户注意:
${workspaceFolder}路径里的反斜杠\要换成/,否则路径拼接失败
code-runner插件执行.mjs文件失败
它本质是调用node xxx.mjs,但不走package.json或VSCode调试协议,所以即使Node版本够新,也可能因环境变量缺失(比如NODE_OPTIONS)、工作目录不对或缺少--experimental-specifier-resolution=node而失败。
临时解法(仅限快速验证):
- 在
settings.json里改code-runner.executorMap的javascript项为:node --experimental-specifier-resolution=node $fullFileName - 但生产环境请用
launch.json+pwa-node,code-runner不适合ESM调试
最易被忽略的一点:VSCode内置终端里node -v输出正常,不代表code-runner用了同一个Node——它可能调用的是系统PATH里另一个旧版本。










