首页 > 解决方案 > 当“捆绑”关闭时,esbuild 不捆绑内部文件导入

问题描述

考虑这个非常做作的 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构建。

在 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/ cjsnpm 包构建。

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

标签: javascriptesbuild

解决方案


答案是,就像在 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,
});

推荐阅读