Вендорные префиксы в CSS — это механизм, который исторически
использовался браузерами для внедрения экспериментальных или
нестандартизированных возможностей. Такие свойства имели префиксы вида
-webkit-, -moz-, -ms-,
-o-, например:
.box {
-webkit-transform: translateX(10px);
-moz-transform: translateX(10px);
transform: translateX(10px);
}
Со временем большая часть этих префиксов утратила необходимость, поскольку спецификации стабилизировались, а браузеры унифицировали реализацию стандартных свойств. Однако вопрос автоматической расстановки префиксов остался важной частью фронтенд-сборки.
Современные инструменты сборки по-разному решают эту задачу, и esbuild занимает в этом процессе строго ограниченную позицию: он сознательно не является системой постобработки CSS уровня Autoprefixer и не пытается угадывать совместимость браузеров.
Основная цель esbuild — скорость и минимализм архитектуры. Поэтому работа с CSS реализована как базовый слой обработки, без расширенной семантической трансформации.
При обработке CSS esbuild:
url() в
стилях).Но принципиально важно: esbuild не модифицирует CSS на уровне совместимости браузеров.
Одно из ключевых ограничений заключается в том, что esbuild не добавляет вендорные префиксы автоматически.
Это означает:
-webkit-, -moz- и
других префиксов;Can I Use-совместимости;Например, следующий CSS:
.button {
user-select: none;
}
после обработки esbuild останется без изменений (кроме минификации), а не превратится в:
.button {
-webkit-user-select: none;
-ms-user-select: none;
user-select: none;
}
Решение не включать автопрефиксацию связано с несколькими принципами проектирования:
esbuild концентрируется на:
CSS-постобработка уровня совместимости считается отдельной задачей, выходящей за рамки бандлера.
В экосистеме уже существует специализированный инструмент:
Он решает задачу на уровне AST CSS и поддерживает:
Добавление аналогичной логики в esbuild привело бы к дублированию функциональности и усложнению ядра.
esbuild проектировался как один из самых быстрых сборщиков. Любая глубокая CSS-обработка:
Отказ от этого слоя позволяет сохранять предсказуемую производительность.
В современных сборках роль esbuild обычно ограничена «транспортировкой» CSS, а не его семантической модификацией.
Типичная архитектура выглядит так:
CSS/SCSS → PostCSS (Autoprefixer) → esbuild → финальный бандл
или:
SCSS → PostCSS → CSS → esbuild (bundle/minify)
Хотя esbuild не поддерживает автопрефиксацию нативно, он предоставляет плагинную систему, через которую можно подключить PostCSS.
Пример типичной конфигурации:
import esbuild from "esbuild";
import postcss from "postcss";
import autoprefixer from "autoprefixer";
import fs from "fs";
const postcssPlugin = {
name: "postcss",
setup(build) {
build.onLoad({ filter: /\.css$/ }, async (args) => {
const css = await fs.promises.readFile(args.path, "utf8");
const result = await postcss([autoprefixer]).process(css, {
from: args.path
});
return {
contents: result.css,
loader: "css"
};
});
}
};
esbuild.build({
entryPoints: ["src/index.js"],
bundle: true,
outdir: "dist",
plugins: [postcssPlugin]
});
Здесь видно, что esbuild выступает как оркестратор, а не как CSS-движок.
Поведение можно разделить на два уровня:
Отсутствие автопрефиксации напрямую влияет на архитектуру проекта:
Проект, использующий только esbuild без PostCSS, получает:
Во многих проектах необходимость в префиксах уменьшается:
flex, grid, transform,
transition уже стандартизированы;Некоторые свойства всё ещё могут требовать префиксов или fallback-логики:
user-select;backdrop-filter (в отдельных случаях);Минификация CSS в esbuild также не затрагивает семантику свойств.
Он:
Но он не:
Распространённое заблуждение заключается в том, что любой современный бандлер должен автоматически:
Однако esbuild придерживается иной философии: он не занимается «пониманием дизайна», он занимается «пересборкой кода».
В такой архитектуре ответственность разделяется:
Это приводит к более модульной системе, где каждый инструмент делает одну вещь, но делает её быстро и предсказуемо.
Если обобщить поведение esbuild относительно вендорных префиксов:
Такое разделение делает систему более предсказуемой и масштабируемой, но требует явной настройки CSS-цепочки в проектах, где важна кроссбраузерная совместимость.