Загрузчики в Esbuild определяют способ интерпретации и трансформации импортируемых модулей, не являющихся «чистым» JavaScript. Любой импорт в проекте проходит через механизм разрешения и обработки, где загрузчик задаёт стратегию преобразования исходного файла в модуль, пригодный для включения в граф зависимостей.
Ключевая роль загрузчиков заключается в том, чтобы унифицировать работу с разнородными типами ресурсов: кодом на TypeScript, JSX-разметкой, стилями, JSON-данными, текстовыми файлами, бинарными ресурсами и ассетами. Вместо ручной обработки каждого типа файлов Esbuild применяет декларативную модель: для расширения файла назначается конкретный loader, который определяет результат импорта.
Каждый файл, попадающий в процесс сборки, сопоставляется с загрузчиком по двум основным механизмам:
loader)После определения загрузчика Esbuild применяет соответствующую стратегию трансформации:
Результатом работы загрузчика всегда является валидный модуль, который может быть включён в итоговый бандл.
Загрузчик js является базовым вариантом обработки
JavaScript-файлов. Он предполагает, что входной файл уже является
корректным JavaScript-кодом без дополнительной трансформации
синтаксиса.
.js файлам по умолчаниюimport util from "./util.js";
Файл передаётся в граф зависимостей без изменения структуры.
Загрузчик jsx предназначен для обработки файлов с
JSX-синтаксисом.
const element = <div>Hello</div>;
После обработки:
const element = React.createElement("div", null, "Hello");
Трансформация зависит от настроек JSX runtime, но базовая задача loader — убрать JSX-синтаксис.
Загрузчик ts используется для файлов TypeScript без
JSX.
function sum(a: number, b: number): number {
return a + b;
}
После обработки:
function sum(a, b) {
return a + b;
}
Важно, что Esbuild не выполняет полную типовую проверку — он только удаляет аннотации типов.
tsx объединяет поведение ts и
jsx.
const App = () => <span>Text</span>;
Результат включает:
Загрузчик json позволяет импортировать JSON-файлы как
JavaScript-объекты.
{
"name": "app",
"version": "1.0"
}
Импорт:
import data from "./config.json";
Результат:
const data = {
name: "app",
version: "1.0"
};
JSON становится статическим объектом, доступным во время выполнения.
Загрузчик text интерпретирует содержимое файла как
строку.
Hello world
Импорт:
import message from "./message.txt";
Результат:
const message = "Hello world\n";
Содержимое не парсится, а передаётся как строковый литерал.
Загрузчик base64 преобразует содержимое файла в строку
base64.
import icon from "./icon.png";
Результат:
const icon = "data:image/png;base64,iVBORw0KGgo...";
Файл кодируется и встраивается прямо в бандл.
Загрузчик binary предоставляет доступ к файлу в виде
бинарного массива.
Uint8Arrayimport data from "./file.bin";
Результат:
const data = new Uint8Array([137, 80, 78, 71, ...]);
Загрузчик file не инлайнит содержимое, а переносит файл
в выходной каталог.
import image from "./photo.jpg";
Результат:
const image = "/assets/photo-8f3a2c.jpg";
Такой подход снижает размер бандла и позволяет работать с внешними ресурсами.
Загрузчики работают на ранней стадии пайплайна, до этапа оптимизации и минификации. Их результат влияет на:
Каждый файл проходит ровно один загрузчик, выбранный по конфигурации. Ошибочный выбор loader приводит к некорректной интерпретации содержимого.
В Esbuild загрузчики задаются через объект:
loader: {
".js": "js",
".jsx": "jsx",
".ts": "ts",
".tsx": "tsx",
".json": "json",
".txt": "text",
".png": "file"
}
Сопоставление расширений позволяет гибко управлять поведением сборки без изменения исходного кода.
Выбор загрузчиков определяет модель работы с ресурсами:
Грамотная конфигурация загрузчиков снижает необходимость в дополнительных плагинах и упрощает структуру сборки, сохраняя предсказуемость результата.