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 }

Представьте, что мы хотим построить это.

  • Если мы установим "bundle", как внешний, так и внутренний импорт завершатся в сгенерированном файле. (Это круто, я хочу это для iife строить).
  • Если мы не устанавливаем "связать", ни внешние cloneни внутренние, ни внутренние не попадут в сгенерированный файл. (Это не круто, я хочу calculate в комплекте еще).

В Rollup «объединение» в этом смысле относится только к внешнему импорту; внутренние-единицы по умолчанию помещаются в один файл.

Вы знаете, как установить 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 разные: это объединение нескольких файлов в один. Здесь мы просто пытаемся воспроизвести поведение Rollup, чтобы включить локальный импорт, но не внешний, как в обычном пакете npm. Спасибо.

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,
});
Другие вопросы по тегам