SyntaxError: Unexpected token import 表明 Node.js 默认以 CommonJS 模式运行,不支持原生 import 语法;需通过配置 "type": "module"、改用 .mjs 扩展名、或使用 Babel 转译来解决。

SyntaxError: Unexpected token import 这类报错意味着你直接用 node 执行含 import 的 ES6 文件——Node.js 原生不支持 ESM(模块系统)或部分新语法,除非明确启用。纯靠 node 命令跑 ES6 代码,在大多数 Node 版本下是行不通的,必须加一层转译或运行时适配。
node 直接执行 ES6 文件失败的常见原因
Node.js 默认以 CommonJS 模式运行,遇到
import/export就抛SyntaxError即使加了
"type": "module"到package.json,也只支持部分 ES6 特性(如顶层await、动态import()),且对.mjs后缀或文件路径敏感node --experimental-modules已废弃(Node 14+ 不再推荐),现代方案应避免依赖实验性标志确保
package.json中有"type": "module"(仅适用于纯 ESM 场景)若混用
require()或依赖 CJS 包,会触发冲突,建议统一模式import路径必须带扩展名(如import { foo } from './utils.js'),Node 对 ESM 的路径解析比浏览器更严格
babel-node 调试时断点不生效怎么办
VSCode 默认调试器无法识别 babel-node 输出的源码映射,导致断点打在转译后代码上,而非原始 .js 文件。
- 在
launch.json中必须使用runtimeExecutable指向本地安装的babel-node:"runtimeExecutable": "${workspaceFolder}/node_modules/.bin/babel-node"(macOS/Linux 是./node_modules/.bin/babel-node) - 确保
.babelrc或babel.config.json启用了 source map:"sourceMaps": "inline"或"sourceMaps": true,并配合"retainLines": true - 不要全局安装
@babel/node;本地安装才能被 VSCode 正确定位和注入调试上下文
package.json + launch.json 配合构建可调试流程
真正稳定的调试链路不是“边转边跑”,而是先构建、再调试生成物,并通过 sourcemap 关联回源码。
-
package.json中定义构建脚本:"build": "babel src -d dist --source-maps --extensions '.js'" -
launch.json配置指向生成后的入口:"program": "${workspaceFolder}/dist/index.js"
并确保"outFiles"包含["${workspaceFolder}/dist/*<em>/</em>.js"] - VSCode 必须能读到
dist/index.js.map,该文件需与.js同目录且内容有效(Babel 默认生成 inline source map 时,无需额外文件)
ES6 支持不是开关式配置,而是由执行方式、模块系统、转译目标三者共同决定。最容易被忽略的是:Node 的 "type": "module" 和 Babel 的 presets 不能混用在同一入口文件中——要么全走 ESM 原生(受限多),要么全走 Babel 转译(兼容强)。选哪条路,得从第一行 import 开始就定死。


















