dataurlЗагрузчик dataurl в Esbuild преобразует импортируемые
ресурсы в строки формата Data URL, кодируя содержимое файла в Base64 и
встраивая его прямо в результирующий JavaScript или CSS-бандл. Вместо
генерации отдельного файла на выходе, модуль становится строковым
представлением ресурса.
Результат имеет вид:
data:[<mime-type>][;base64],<данные>
Например:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...
Ключевой смысл подхода — устранение сетевых запросов к отдельным ассетам за счёт их инлайнинга в бандл.
dataurl в EsbuildПодключение осуществляется через поле loader в
конфигурации сборки:
import esbuild from 'esbuild';
esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
outfile: 'dist/bundle.js',
loader: {
'.png': 'dataurl',
'.jpg': 'dataurl',
'.svg': 'dataurl',
'.woff2': 'dataurl'
}
});
Каждое расширение явно связывается с типом обработки
dataurl, что определяет поведение импорта.
dataurlПри импорте ресурса:
import logo from './logo.png';
console.log(logo);
Esbuild трансформирует файл в строку:
const logo = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...";
Таким образом, переменная logo содержит полноценный Data
URL, готовый к использованию в браузере.
import icon from './icon.png';
const img = document.createElement('img');
img.src = icon;
document.body.appendChild(img);
import background from './bg.jpg';
const style = document.createElement('style');
style.textContent = `
.hero {
background-image: url("${background}");
}
`;
document.head.appendChild(style);
Esbuild определяет MIME-type на основе расширения файла. Например:
.png → image/png.jpg → image/jpeg.svg → image/svg+xml.woff2 → font/woff2Это значение автоматически вставляется в Data URL перед Base64-данными.
file loaderdataurl и file решают схожую задачу, но
различаются принципиально:
filedataurlПример file:
loader: {
'.png': 'file'
}
Результат:
"/assets/logo.8d3f2a.png"
dataurlОсновные сценарии применения:
Иконки, пиктограммы, UI-элементы:
loader: {
'.woff2': 'dataurl'
}
Позволяет избежать FOUT/FOIT при загрузке шрифтов.
SVG особенно хорошо подходит для инлайна:
При использовании file:
При использовании dataurl:
На практике часто используется гибридный подход:
loader: {
'.png': 'file',
'.svg': 'dataurl',
'.woff2': 'dataurl'
}
Логика выбора:
filedataurldataurl или file в зависимости от
стратегии кешированияEsbuild обрабатывает CSS так же, как Jav * aScript:
import './styles.css';
CSS:
.icon {
background-image: url("./icon.svg");
}
При dataurl загрузчике SVG будет инлайнен:
background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0...");
Любые бинарные форматы (PNG, JPG, WOFF2, PDF) проходят одинаковую схему:
Использование dataurl обычно сигнализирует о:
Если файл < 4–8 KB → dataurl
Если файл > 10 KB → file
Если критичен первый рендер → dataurl
Если важен кеш ассета → file
При bundle: true все Data URL становятся частью
финального графа модулей. Esbuild не создаёт дополнительных файлов, а
инлайнит результат в зависимости от точек импорта.
dataurl не влияет напрямую на tree-shaking
JavaScript-кода, но косвенно увеличивает размер финального результата,
так как строка ресурса становится частью используемого модуля и не может
быть оптимизирована дальше.