启动Payload时payload.config.ts导入模块错误求助
解决PayloadCMS v2.25.0集成Next.js 13时的
SyntaxError: Cannot use import statement outside a module错误 错误原因
- 虽然package.json已配置
"type": "module",但ts-node默认对ESM格式的TS文件解析配置不全,导致payload.config.ts被当作CommonJS文件处理,无法识别import语句。 - tsconfig.json的编译选项未适配ESM模块规范,生成的代码与项目的模块模式不匹配。
解决办法
方法1:修复ts-node的ESM解析配置
方式A:修改启动命令
在启动命令中添加参数强制Node.js使用Node风格的模块解析:
node --loader ts-node/esm --experimental-specifier-resolution=node server.ts
方式B:在package.json中配置ts-node
在package.json中添加ts-node的ESM专属配置,避免每次启动重复加参数:
{ "type": "module", "ts-node": { "esm": true, "experimentalSpecifierResolution": "node" } }
之后直接用原命令启动即可:node --loader ts-node/esm server.ts
方法2:调整tsconfig.json适配ESM
确保tsconfig.json的关键编译选项符合ESM规范:
{ "compilerOptions": { "module": "ESNext", // 生成ESM格式代码 "moduleResolution": "Bundler", // 适配Next.js的解析逻辑,也可设为NodeNext "target": "ES2020", // 兼容Node.js 20的语法 "esModuleInterop": true, "skipLibCheck": true, "strict": true, "outDir": "./dist" }, "include": ["server.ts", "payload.config.ts"] }
方法3:改用tsx替代ts-node(更简便)
tsx对ESM的支持更原生,无需复杂配置:
- 安装tsx:
npm install -D tsx
- 用tsx启动服务:
tsx server.ts
关键注意事项
- 绝对不要修改node_modules中的文件:Payload内部的require语法属于CommonJS规范,Node.js 20原生支持CommonJS与ESM混合加载,修改依赖文件会导致版本更新时配置丢失,还可能引发其他兼容性问题。
- 确保
payload.config.ts使用ESM导出:必须用export default导出Payload配置对象,不要使用module.exports。
内容的提问来源于stack exchange,提问作者Cemil
相关产品推荐
相关产品推荐

