vscode点“运行”或f5报err_require_esm等错,根本原因是执行上下文与文件模块类型不匹配:code runner默认用commonjs方式执行.js文件,不识别esm;调试器则依赖launch.json配置、node≥14及正确type字段,且禁止手动加--loader等冲突参数。

VSCode 里点“运行”或按 F5 就报 ERR_REQUIRE_ESM 或 SyntaxError: Cannot use import statement outside a module,根本不是代码写错了,而是 Node.js 加载器在解析阶段直接拦截——CommonJS 的 require() 不允许加载 ESM 文件,ESM 环境下又压根没有 require 函数。解决方向不是“统一改模块系统”,而是让执行上下文和文件类型对得上。
VSCode 点运行就炸:确认是 Code Runner 还是调试器问题
Code Runner 插件默认命令是 node $fileName,它不管 package.json 里的 "type": "module",也不识别 .mjs 后缀,纯靠后缀硬匹配(.js → CommonJS)。调试器(F5)则依赖 launch.json 配置和 Node 版本支持程度。
- 右键菜单里选 “Run Code” → 大概率是 Code Runner 在执行,报错时看终端第一行命令是不是
node xxx.js - 按 F5 或点击左上角 ▶️ → 是调试器行为,错误堆栈通常含
Debugger attached或Debug adapter process has terminated - 两者混用极易误判:比如你改了
package.json加"type": "module",Code Runner 仍用node index.js执行,必然报Cannot use import statement
CommonJS 主入口里安全加载 .mjs 模块
require('./utils.mjs') 必炸,但 Node.js v12.17+ 原生支持在 CommonJS 文件中用动态 import() 加载 ESM 模块——这是唯一被官方认可的跨规范调用方式,且无需额外 flag。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
-
import()返回 Promise,必须await或.then(),不能放在顶层同步逻辑里(比如 CLI 参数解析需立即执行时) - 导入结果是命名空间对象:
const { foo } = await import('./utils.mjs');如果目标用了export default,得写成const { default: foo } = await import('./utils.mjs')或const mod = await import('./utils.mjs'); const foo = mod.default - 路径必须存在且可访问,不支持 glob 或条件路径(
await import(`./${env}.mjs`)会报错)
ESM 文件里想 require() 一个 .cjs 配置文件
createRequire 不是用来加载 .mjs 的,它的唯一合法用途是在 ESM(如 main.mjs)里加载传统 CJS 模块(.cjs 或未设 "type": "module" 的 .js)。
- 写法固定:
import { createRequire } from 'module'; const require = createRequire(import.meta.url); const config = require('./config.cjs'); - 目标文件不能含
export/import语句,否则仍是 ESM,require()会失败 - 路径必须带后缀(
.cjs或.js),require('./config')会 fallback 到config.js,但如果该文件用了export就炸
launch.json 调试 ESM 项目时断点变灰或无法启动
VSCode 调试器对 ESM 支持很脆:它依赖文件扩展名(.mjs)或 package.json 的 "type": "module",且要求 Node ≥ 14(推荐 ≥ 18),同时不能手动加 --loader 或 --input-type=module —— 这些参数会和调试器注入的 --inspect 冲突。
-
"program"字段必须指向真实存在的.mjs文件(如"${workspaceFolder}/cli/index.mjs"),不能是.js且依赖"type": "module"—— 后者在调试器里容易失效 -
"type"字段必须为"node",设成"pwa-node"或"chrome"会导致 ESM 解析失败 - 断点变灰?先检查
process.versions.napi是否匹配:VS Code 内置 Electron 绑定的 Node 版本(常为 v22.x)可能和你系统 Node(v20.x)ABI 不兼容,原生模块(如sqlite3)会静默失败
最易被忽略的点:VSCode 启动方式决定它能否读到你当前 shell 的 PATH 和 nvm 切换的 Node 版本。从 Dock 或开始菜单启动,几乎一定继承不到;必须从终端执行 code .(macOS/Linux)或确保 Windows 的 nvm-windows 已触发 Terminal: Reload Shell Environment。否则你改了十遍 launch.json,实际跑的还是旧版 Node。










