В esbuild поддержка бинарных файлов реализуется через механизм
loader’ов, которые определяют, как именно обрабатывать
импортируемые ресурсы. Лоадер binary предназначен для
загрузки файлов как сырых бинарных данных, без
преобразования в текст, JSON или JavaScript-код.
Основная идея заключается в том, что файл рассматривается как
последовательность байтов, которые можно передать дальше по цепочке
сборки или использовать в runtime через Uint8Array.
При использовании loader: 'binary' esbuild:
Uint8ArrayФактически модуль превращается в структуру, пригодную для работы с низкоуровневыми данными.
Пример:
import imageData from './image.png';
console.log(imageData);
После сборки imageData будет представлять собой
Uint8Array, содержащий содержимое PNG-файла.
Когда esbuild встречает импорт файла с бинарным лоадером, происходит следующий процесс:
BufferВнутренне бинарный файл преобразуется примерно в такую структуру:
export default new Uint8Array([137, 80, 78, 71, ...]);
Это делает возможным:
Бинарный лоадер часто применяется для загрузки изображений на уровне байтов, когда требуется:
createImageBitmapПример:
import png from './icon.png';
createImageBitmap(new Blob([png]));
Один из ключевых сценариев использования — загрузка
.wasm модулей:
import wasmBinary from './module.wasm';
WebAssembly.instantiate(wasmBinary);
Хотя в реальных проектах часто применяется
loader: 'file' или специализированная обработка, бинарный
лоадер позволяет полностью контролировать процесс инициализации.
В низкоуровневых задачах бинарный лоадер используется для:
import keyData from './key.bin';
crypto.subtle.importKey(
'raw',
keyData,
'AES-GCM',
true,
['encrypt', 'decrypt']
);
При включённой опции инлайнинга esbuild может:
При настройках вроде external или
assetNames:
Несмотря на универсальность, loader binary имеет ряд
ограничений:
При использовании TypeScript необходимо явно описывать тип результата:
declare module '*.bin' {
const value: Uint8Array;
export default value;
}
Без этого компилятор будет трактовать импорт как
any.
В плагинах можно вручную эмулировать поведение binary
loader:
onLoad({ filter: /\.bin$/ }, async (args) => {
const fs = await import('fs/promises');
const data = await fs.readFile(args.path);
return {
contents: data,
loader: 'binary'
};
});
Это позволяет:
Бинарный лоадер оптимизирован для:
Однако важно учитывать:
esbuild может применять:
Пример динамического импорта:
const data = await import('./large.bin');
В этом случае загрузка может быть отложена до момента вызова.
import font from './font.bin';
document.fonts.add(new FontFace('Custom', font));
import payload from './payload.bin';
worker.postMessage(payload);
import packet from './packet.bin';
function parsePacket(data) {
const view = new DataView(data.buffer);
return view.getUint32(0);
}
Loader binary занимает промежуточное положение
между:
Он позволяет esbuild работать не только как JS-бандлер, но и как инструмент для транспортировки произвольных данных через систему модулей ECMAScript.