Модель сборки с одной точкой входа представляет базовый сценарий работы бандлера: система получает один исходный модуль, от которого строится полный граф зависимостей. Все импортируемые модули рекурсивно подтягиваются, объединяются и трансформируются в один или несколько выходных файлов. В контексте esbuild этот режим является наиболее прямолинейным и используется как отправная точка для большинства проектов.
При указании одной точки входа esbuild выполняет следующие этапы:
import и require
выражения.Ключевой момент заключается в том, что исходный файл не рассматривается изолированно — он становится корнем структуры, от которого зависит вся сборка.
Если входной файл выглядит так:
import { formatDate } from "./utils/date.js";
import { createApp } from "./app.js";
createApp();
console.log(formatDate(new Date()));
то esbuild добавляет в граф зависимости ./utils/date.js
и ./app.js, а затем их зависимости, если они
существуют.
В CLI режим одной точки входа задаётся простейшим способом:
esbuild src/index.js --bundle --outfile=dist/bundle.js
Здесь:
src/index.js — единственная точка входа;--bundle включает объединение модулей;--outfile задаёт итоговый файл.В этом режиме esbuild формирует единый файл, содержащий весь код приложения.
Если параметр --bundle не указан, esbuild не строит граф
зависимостей. В этом случае входной файл просто копируется с
минимальными преобразованиями. Это принципиально важно: одна точка входа
не означает автоматическую сборку — требуется явное включение
бандлинга.
В API сценарий с одной точкой входа выглядит следующим образом:
import * as esbuild from "esbuild";
await esbuild.build({
entryPoints: ["src/index.js"],
bundle: true,
outfile: "dist/bundle.js",
});
Здесь entryPoints содержит массив, но фактически
используется один элемент. Архитектурно esbuild всегда работает с
массивом точек входа, даже если он состоит из одного файла.
Хотя рассматривается один входной файл, важно понимать внутреннюю универсальность модели:
При этом esbuild не ограничивает один входной файл одним выходным файлом. Возможны альтернативные режимы:
await esbuild.build({
entryPoints: ["src/index.js"],
bundle: true,
outdir: "dist",
});
В этом случае даже при одной точке входа используется режим директории вывода, что становится актуально при дополнительных настройках, таких как splitting или asset loading.
Одна точка входа усиливает эффективность удаления неиспользуемого кода. При наличии единого графа зависимостей esbuild может точно определить:
Пример:
// utils.js
export function used() {
return "used";
}
export function unused() {
return "unused";
}
// index.js
import { used } from "./utils.js";
console.log(used());
Функция unused будет удалена на этапе tree shaking, так
как не попадает в достижимый граф.
Сценарий с одной точкой входа часто соответствует следующим архитектурным моделям:
Один файл инициализации:
import { initRouter } from "./router.js";
import { initStore } from "./store.js";
initStore();
initRouter();
Вся система стартует из единой точки, что делает модель естественной для esbuild.
При сборке библиотеки часто используется один entry point, который агрегирует публичный API:
export { createClient } from "./client.js";
export { parseConfig } from "./config.js";
При одной точке входа ключевым становится параметр вывода:
esbuild src/index.js --bundle --outfile=dist/app.js
Или через API:
outfile: "dist/app.js"
Особенности:
Отладка упрощается, так как весь код агрегируется в одном месте:
await esbuild.build({
entryPoints: ["src/index.js"],
bundle: true,
outfile: "dist/app.js",
sourcemap: true,
});
В этом режиме sourcemap отображает связь между итоговым бандлом и исходным деревом модулей, включая:
Одна точка входа позволяет более агрессивную оптимизацию:
await esbuild.build({
entryPoints: ["src/index.js"],
bundle: true,
outfile: "dist/app.js",
minify: true,
});
Причина эффективности заключается в том, что весь код доступен как единое пространство оптимизации:
Несмотря на универсальность, существуют ограничения:
Все зависимости попадают в один граф и часто в один файл. Это упрощает доставку, но снижает гибкость распределения чанков.
Модель предполагает, что приложение стартует из одного места. При сложных системах с несколькими независимыми приложениями это становится менее удобно.
Хотя esbuild внутренне параллелизует работу, итоговая структура всё равно централизована.
При одной точке входа esbuild обрабатывает внешние зависимости следующим образом:
await esbuild.build({
entryPoints: ["src/index.js"],
bundle: true,
outfile: "dist/app.js",
external: ["react", "react-dom"],
});
В этом случае:
react и react-dom не включаются в
бандл;Одна точка входа не означает монолитную структуру кода. Напротив, она представляет собой:
Модули остаются независимыми, но объединяются на этапе сборки.
esbuild поддерживает смешанные типы модулей:
import/export);require/module.exports).При одной точке входа происходит унификация:
// esm
import { a } from "./a.js";
// cjs
const b = require("./b.js");
Оба типа приводятся к единой внутренней модели исполнения.
Одна точка входа часто используется для стабильного кеширования:
Это позволяет эффективно использовать хеширование файлов в production-сборках:
await esbuild.build({
entryPoints: ["src/index.js"],
bundle: true,
entryNames: "[dir]/[name]-[hash]",
outdir: "dist",
});
При одной точке входа esbuild формирует следующую логическую цепочку:
Эта модель делает сборку предсказуемой, линейной и оптимизируемой на всех этапах обработки.