Node.js开发npm包时出现Unexpected token 'export'报错
错误原因
SyntaxError: Unexpected token 'export' 由模块规范不匹配导致:
- Node.js 默认将
.js后缀文件按 CommonJS 规范解析,无法直接识别 ESM 规范的export关键字 - 组件文件使用 CommonJS 规范的
module.exports导出,但入口文件用了 ESM 规范的导出语法,两种写法混用 - 业务项目中使用 CommonJS 规范的
require()引入包,和入口的 ESM 导出语法不兼容。
解决方案
两种方案二选一即可,第一种改造成本最低,和你现有代码逻辑完全适配。
方案1:统一使用CommonJS规范(推荐)
直接把入口index.js的ESM导出语法替换为CommonJS写法,和组件文件的导出规范、业务项目的引入方式保持一致,不需要修改任何package.json配置:
const { MailProcess } = require("./mail/MailProcess"); // 后续其他组件按相同方式引入即可 // const { OtherComponent } = require("./other/OtherComponent"); module.exports = { MailProcess, // OtherComponent };
修改完成后重新发布包,业务项目中原有let {MailProcess} = require('@myusername/mypackagename');的引入代码可以直接正常运行。
方案2:统一使用ES Module规范
如果需要全程使用ESM的import/export语法,需要做三处调整:
- 在
package.json中添加"type": "module"字段,声明包内所有.js文件按ESM规范解析:
{ "name": "packagename", "version": "1.0.3", "description": "Private package", "main": "index.js", "type": "module", "publishConfig": { "registry": "https://npm.pkg.github.com/...." }, // 其余配置保持不变 }
- 将所有组件文件的CommonJS导出改为ESM写法,比如
MailProcess.js中原有的导出代码替换为:
export class MailProcess { constructor(name, code) { this.name = name; this.code = code; } }
- ESM规范不支持
require()语法,业务项目的引入代码需要同步修改为:
import { MailProcess } from '@myusername/mypackagename';
注意事项
- 同一个npm包内尽量统一使用一种模块规范,没有特殊兼容需求不要混写CommonJS和ESM语法,否则极易出现解析错误
- 若使用的Node.js版本低于14.x,ESM语法存在较多兼容问题,优先选择CommonJS方案
- 修改包代码后需要重新发布版本,业务项目更新到最新版本的包后再测试运行。
内容的提问来源于stack exchange,提问作者user19517065
相关产品推荐
相关产品推荐

