从自定义NPM包导入多类时出现模块语法错误的求助
解决自研NPM包导入报错:
SyntaxError: Cannot use import statement outside a module 问题根源
你的sqorz-client包入口文件index.js混用了ES模块的import语法与CommonJS的module.exports,同时包的package.json未声明模块类型,导致Node.js将其当作CommonJS模块处理时,无法识别import语句。
解决方案
方案1:统一使用CommonJS规范(推荐,适配大多数Node.js项目)
因为你的TypeScript编译后的类文件(如organization.js)是CommonJS格式,所以入口文件也改用CommonJS的require导入:
修改包根目录的index.js:
const { Organization } = require("./src/types/organization"); const { Club } = require("./src/types/club"); const { SqorzClient } = require("./src/SqorzClient"); const { Event } = require("./src/types/event"); const { Pilot } = require("./src/types/pilot"); const { Race } = require("./src/types/race"); const { SqorzRequest } = require("./src/services/sqorzRequest"); module.exports = { Organization, Club, SqorzClient, Event, Pilot, Race, SqorzRequest };
修改后,项目中导入方式:
- CommonJS环境:
const { Organization, Club } = require("sqorz-client"); - ES模块环境(项目
package.json含"type": "module"):
Node.js会自动兼容CommonJS包的ES模块导入。import { Organization, Club } from "sqorz-client";
方案2:将包声明为ES模块
若要让包原生支持ES模块,修改包的package.json:
{ "name": "sqorz-client", // 新增字段,声明包为ES模块 "type": "module", "files": [ "src", // 补充入口文件,否则发布后用户无法找到index.js "index.js" ], "main": "index.js", [...] }
此时包的index.js可保留import语法,项目需为ES模块环境才能直接用import导入;CommonJS环境需使用import()动态导入。
额外修复点
包的files字段仅包含src,但入口文件index.js不在其中,发布到NPM后用户安装的包会缺失入口文件,必须将index.js加入files数组。
内容的提问来源于stack exchange,提问作者Thibault
相关产品推荐
相关产品推荐

