You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从自定义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"):
    import { Organization, Club } from "sqorz-client";
    
    Node.js会自动兼容CommonJS包的ES模块导入。

方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 05:11:13