导入混合模块的默认值时,Esbuild cjs 不工作

问题描述 投票:0回答:1

我正在使用 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'
,但这没有意义。

node.js typescript es6-modules commonjs esbuild
1个回答
0
投票

您似乎遇到了 ESM/CJS 互操作问题,这在 TS 文档中的这篇长文esbuild 的 Evan 的评论以及

default
导出的 esbuild 文档中进行了描述。

  • 首先,我建议根据 TS 文档文章仔细检查您的

    tsconfig.json
    。毕竟,esbuild 也使用它。

  • 您可能需要检查是否遇到了 esbuild 特定的行为。根据上面的第三个链接,您可以看到即使

    { "type": "module" }
    中的
    package.json
    也可能会影响默认导出的处理方式。

© www.soinside.com 2019 - 2024. All rights reserved.