Механизм loaders в esbuild определяет способ интерпретации
импортируемых файлов в процессе сборки. Loader text
предназначен для преобразования содержимого файлов в строковые значения,
которые становятся частью итогового JavaScript-бандла без дополнительной
обработки синтаксиса или компиляции.
Loader text рассматривает любой подключаемый файл как
обычный текстовый ресурс. При сборке содержимое файла:
Фактически каждый импорт превращается в константу-строку внутри модуля.
Пример поведения:
import template from './template.html'
console.log(template)
При использовании text loader файл
template.html не интерпретируется как HTML-структура. Его
содержимое вставляется в JavaScript как строка.
Конфигурация в API esbuild:
import * as esbuild from 'esbuild'
esbuild.build({
entryPoints: ['src/index.js'],
bundle: true,
loader: {
'.txt': 'text',
'.html': 'text',
'.md': 'text'
},
outfile: 'dist/bundle.js'
})
CLI-аналог:
esbuild src/index.js --bundle --loader:.txt=text --loader:.html=text --outfile=dist/bundle.js
Каждое расширение явно привязывается к loader text, что
позволяет контролировать типы ресурсов на уровне конфигурации
сборки.
При использовании text-loader содержимое файла инлайнится прямо в код. Например:
Файл greeting.txt:
Hello world
This is a sample text
Код:
import greeting from './greeting.txt'
export function show() {
return greeting.toUpperCase()
}
Результат после сборки:
var greeting = "Hello world\nThis is a sample text\n";
export function show() {
return greeting.toUpperCase();
}
Строка становится обычной переменной, доступной для дальнейших операций.
Loader file:
Loader text:
Разница принципиальна для архитектуры приложения: file
сохраняет внешний ресурс, text делает его частью кода.
Loader dataurl:
Loader text:
JSON loader:
text loader:
Пример различия:
import data from './config.json' // объект
import raw from './config.json' // строка (при text loader)
HTML-фрагменты часто используются как шаблоны UI:
import modalTemplate from './modal.html'
export function createModal() {
const container = document.createElement('div')
container.innerHTML = modalTemplate
return container
}
Такой подход позволяет хранить разметку отдельно, не вводя HTML-парсинг на этапе выполнения.
Markdown-файлы удобно загружать как текстовые ресурсы:
import readme from './README.md'
document.body.innerText = readme
Использование text-loader исключает необходимость дополнительного парсера и упрощает пайплайн сборки.
GLSL и другие shader-языки часто подключаются как строки:
import vertexShader from './shader.vert'
import fragmentShader from './shader.frag'
gl.shaderSource(program, vertexShader)
Text loader позволяет хранить графические программы без преобразования структуры.
Loader text сохраняет:
Однако важно учитывать экранирование при встраивании:
" преобразуется в \"\ дублируютсяEsbuild автоматически оптимизирует текстовые ресурсы:
Пример минификации:
var t = "line1\nline2\nline3";
Loader text не предназначен для:
Особенно важно учитывать влияние на bundle size: каждый текстовый ресурс увеличивает размер итогового JS.
В ESM:
import text from './file.txt'
В CommonJS:
const text = require('./file.txt')
В обоих случаях результат идентичен: строка, представляющая содержимое файла.
Loader text часто комбинируется с:
bundle: true для инлайнинга зависимостейminify: true для сокращения строкcharset: utf8 для корректной обработки символовplatform: node|browser в зависимости от окруженияТекстовые ресурсы становятся частью модуля:
module
├── code.js
├── template.html → text loader
└── styles.css → text loader
Все ресурсы собираются в единый граф зависимостей.
import sql from './query.sql'
export function run(db) {
return db.exec(sql)
}
SQL-запросы хранятся как текст, исключая необходимость runtime-загрузки файлов.
В режиме watch изменение текстового файла:
Это делает loader удобным для разработки шаблонов и статических ресурсов.
Text loader сам по себе не участвует в tree-shaking содержимого файла, поскольку файл уже становится атомарной строкой. Однако:
Plugins esbuild могут перехватывать обработку файлов до применения loader. В случае text-loader: