【问题标题】:esbuild not bundling internal file imports when the "bundle" is turned off当“捆绑”关闭时,esbuild 不捆绑内部文件导入
【发布时间】:2021-04-02 18:48:03
【问题描述】:

考虑一下这个非常做作的 npm 包:

import clone from "lodash.clonedeep";
import calculate from "./utils/calculate"; // ".ts" omitted

function x(obj:any):number {
  return calculate(clone(obj).a, clone(obj).b);
}
export { x }

假设我们想要一个 esm 构建这个。

  • 如果我们将esbuild 设置为“捆绑”,外部clone 和内部calculate 导入都将在生成的文件中结束。 (这很酷,我想要 iife 构建)。
  • 如果我们将esbuild 设置为不“捆绑”,则外部clone 和内部calculate 都不会出现在生成的文件中。 (这不酷,我还想捆绑calculate)。

在 Rollup 中,这种意义上的“捆绑”仅适用于外部导入;默认情况下,internal-ones 都放在一个文件中。

您知道如何将esbuild 设置为仅包含内部文件导入吗?获取:

import clone from "lodash.clonedeep";

function calculate(a, b) {
  return a * b;
}
function x(obj){
  return calculate(clone(obj).a, clone(obj).b);
}
export { x }

我只是想制作一些 esm/cjs npm 包构建。

SO 中的其他问题有所不同:this one 将多个文件合并为一个。在这里,我们只是试图复制 Rollup 的行为,包括本地导入但不包括外部导入,就像在普通的 npm 包中一样。谢谢。

【问题讨论】:

    标签: javascript esbuild


    【解决方案1】:

    答案是,就像在 Rollup 中一样——启用“捆绑”,但通过设置 external 跳过捆绑外部依赖项。这样,本地导入将不会被捆绑,因为它们不在 package.json 中。

    const path = require("path");
    const pkg = require(path.resolve("./package.json"));
    
    const external = [
      ...Object.keys(pkg.dependencies || {}),
      ...Object.keys(pkg.peerDependencies || {}),
    ];
    
    // ESM
    require('esbuild').buildSync({
      entryPoints: ['src/main.ts'],
      format: 'esm',
      bundle: true,
      minify: false,
      sourcemap: false,
      target: ['esnext'],
      outfile: 'dist/yourProgram.esm.js',
      external,
    });
    

    【讨论】:

      猜你喜欢
      • 2020-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-01
      • 2013-12-29
      • 2012-06-29
      • 2017-04-22
      相关资源
      最近更新 更多