我正在使用 esbuild 构建一个模块。它使用
euberlog
作为依赖项,这是一个提供 esm 和 cjs 支持的混合模块。
因此在我的代码中我使用:
import logger from 'euberlog';
然后我用 esbuild 编译它:
const shared = {
platform: 'node',
entryPoints: ['source/index.ts'],
bundle: true,
minify: true,
treeShaking: true,
sourcemap: true
};
build({
...shared,
outfile: 'bundled/lib/commonjs/index.js',
format: 'cjs',
external: getExternalDependencies()
});
它实际上是为 esm 和 cjs 构建的。 问题是,如果我在某处导入 cjs 模块,则会出现错误:
TypeError: i.default.info is not a function
然后如果我修补代码并打印
i
,我看到结果是:
{ default: { Logger: [Getter], default: [Getter] }, Logger: [Getter] }
esbuild 似乎将第一个导入 (
import logger from 'euberlog'
) 翻译为 import * as logger from 'euberlog'
,但这没有意义。
您似乎遇到了 ESM/CJS 互操作问题,这在 TS 文档中的这篇长文、esbuild 的 Evan 的评论以及
default
导出的 esbuild 文档中进行了描述。
首先,我建议根据 TS 文档文章仔细检查您的
tsconfig.json
。毕竟,esbuild 也使用它。
您可能需要检查是否遇到了 esbuild 特定的行为。根据上面的第三个链接,您可以看到即使
{ "type": "module" }
中的 package.json
也可能会影响默认导出的处理方式。