我正在开发一个依赖于仅 ESM 库的包:unified,并且我将我的 npm 包公开为 CommonJS 库。
当我在应用程序中调用我的包时,节点给出了以下错误消息:
不支持 ES 模块 node_modules\unified\index.js 的 require()
错误消息很明显,因为我们不允许使用requireESM 模块,但我不是已经告诉 Typescript 将源代码编译为 CommonJS 格式吗?
参考:
我按照本教程创建了一个双包。包文件结构如下所示:
my-awesome-lib
package.json
dist
|-- mjs
|-- package.json
|-- index.js
|-- cjs
|-- package.json
|-- index.js
Run Code Online (Sandbox Code Playgroud)
在package.json:
"main": "dist/cjs/index.js",
"module": "dist/mjs/index.js",
"exports": {
".": {
"require": "./dist/cjs/index.js",
"import": "./dist/mjs/index.js"
}
},
Run Code Online (Sandbox Code Playgroud)
文件夹package.json中的mjs:
{
"type": "module"
}
Run Code Online (Sandbox Code Playgroud)
文件夹package.json中的cjs:
{
"type": "commonjs"
}
Run Code Online (Sandbox Code Playgroud)
在我的 Typescript 应用程序中,我安装了自己的包,并尝试导入它。然而,我观察到一件奇怪的事情:
// src/index.ts
import { Class } from 'my-awesome-lib'
import { Class } from '../node_modules/my-awesome-lib/dist/mjs/index.js';
Run Code Online (Sandbox Code Playgroud)
第一个导入语句指向而../node_modules/my-awesome-lib/dist/cjs/index.js不是mjs文件夹。第二个导入语句是我真正想要的。
谁能告诉我出了什么问题吗?是因为我以错误的方式发布了我的库吗?
附注
这是我的 tsconfig.json
{ …Run Code Online (Sandbox Code Playgroud) 假设我正在编写一个名为my-awesome-libusing Typescript 的 npm 库。因为my-awesome-lib依赖于纯ESM库,所以我必须使用ESM语法,即import使用该第三方库。现在一切正常了,包括开玩笑,我按照本教程导出my-awesome-lib为 ESM 和 CommonJS 模块。
同时,我还在使用 CommonJS 语法编写一个依赖于我的自定义库的应用程序,即require('my-awesome-lib'),但 jest 测试套件无法运行,因为:
必须使用 import 加载 ES 模块:path/to/application/node_modules/3rd_party/index.js
这对我来说有点意义,因为第 3 方库是纯 ESM 的,你不能需要ESM 包 - 但这也让我感到困惑:我不是已经告诉 Typescript 将源代码编译成 CommonJS (以及 ESM)吗? )?
我还关注了 Dan Fabulich 关于ESM 与 CommonJS的精彩帖子,但我仍然没有答案。
有人可以帮忙吗?太感谢了。