Одна из наиболее частых проблем при сборке связана с разрешением
модулей. Сообщение вида Could not resolve "react" или
Could not resolve "./utils" возникает, когда механизм
резолва esbuild не может найти указанный путь.
Причины обычно сводятся к следующим:
node_modulesВ случае монорепозиториев проблема усиливается из-за hoisting
зависимостей и особенностей менеджеров пакетов (pnpm,
yarn workspaces).
Пример проблемного импорта:
import { helper } fr om "utils/helper";
Если utils не зарегистрирован как alias, резолв
завершится ошибкой.
Решения:
import { helper } from "../utils/helper.js";
import { resolve } from "path";
export const aliasPlugin = {
name: "alias",
setup(build) {
build.onResolve({ filter: /^utils\// }, args => {
return {
path: resolve(args.resolveDir, "src/" + args.path.replace("utils/", ""))
};
});
}
};
Типичная проблема проявляется в окружениях Node.js при смешивании
require и import.
Симптомы:
require is not definedCannot use import statement outside a moduleEsbuild по умолчанию способен конвертировать модули, но ошибки
возникают при неверно заданном format.
Конфигурационные причины:
format: "esm" // или "cjs"
Пример конфликта:
// CommonJS модуль
module.exports = {
value: 1
};
// ESM импорт
import mod from "./mod.js";
При неправильной сборке экспорт может оказаться в
mod.default или быть недоступным вовсе.
Решение сводится к унификации формата сборки:
defaultTop-level await is not availableДанная ошибка возникает при использовании top-level await в средах или конфигурациях, где он не поддерживается.
Esbuild поддерживает top-level await в ESM, но только при корректном указании формата:
format: "esm"
target: "es2022"
Проблемные случаи:
iife или cjstargetEsbuild требует явного указания loader для нестандартных типов файлов.
Симптомы:
No loader is configured for ".png"No loader is configured for ".css"Пример некорректной сборки:
build({
entryPoints: ["src/index.js"],
bundle: true,
outfile: "dist/out.js"
});
При импорте изображения:
import logo from "./logo.png";
Решение — настройка loader:
loader: {
".png": "file",
".css": "css",
".svg": "dataurl"
}
Особое внимание требуется при работе с CSS-модулями и ассетами, так как поведение отличается от Webpack.
Esbuild использует нативные бинарные сборки. При установке возможны ошибки:
The package was not installed correctly for your platformFailed to install esbuildПричины:
В Docker часто возникает ситуация:
esbuild: unsupported platform linux-arm64
Решение сводится к явной переустановке с нужной платформой:
npm install esbuild --platform=linux --arch=x64
Could not load "fs" / "path" в браузерной сборкеNode.js встроенные модули недоступны в браузерном окружении. Esbuild не полифилит их автоматически.
Симптомы:
Module "fs" has been externalizedpath is not available in the browserПричина — попытка бандлинга серверного кода в клиентский.
Решения:
external: ["fs", "path", "os"]
Could not resolve entry pointВозникает при неверно указанном входном файле.
Пример:
entryPoints: ["src/app.ts"]
Проблемы:
Особенно часто проявляется в CI, где cwd отличается от
локальной среды.
При использовании встроенной поддержки CSS могут возникать проблемы:
Типичная конфигурация:
loader: {
".css": "css"
}
При этом важно различать режимы:
css — встроенная обработкаfile — вынесение в отдельный файлtext — импорт как строкаОшибка часто возникает при смешивании подходов.
Esbuild компилирует TypeScript без полной проверки типов, но ошибки конфигурации могут привести к неожиданным результатам.
Проблемные ситуации:
tsconfig.jsontargetПример:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
}
}
Без соответствующего резолв-плагина:
build({
plugins: [tsconfigPaths()]
});
alias не будет работать.
define
и потеря process.envПри переносе Node.js кода в бандл часто возникает ситуация, когда
process.env становится undefined.
Esbuild не подставляет переменные окружения автоматически.
Пример:
console.log(process.env.NODE_ENV);
Решение через define:
define: {
"process.env.NODE_ENV": '"production"'
}
Типичная ошибка — отсутствие строкового JSON-формата, что приводит к синтаксическим сбоям.
При увеличении количества зависимостей возможны:
Причины:
Оптимизационные меры:
splitting: truetree shaking через ESMwatch режим не обновляет файлыWatch может переставать реагировать на изменения при:
Признаки:
Решение часто связано с увеличением лимитов системы или переходом на polling:
watch: {
usePolling: true
}
Esbuild plugin API чувствителен к порядку и типам обработчиков.
Симптомы:
onResolve и onLoadТипичная проблема — перекрытие фильтров:
onResolve({ filter: /.*/ })
что блокирует более специфичные правила.
Корректная стратегия — приоритизация фильтров от узких к широким.
Dynamic import поддерживается, но при неверной конфигурации может приводить к:
outdirПример:
import("./module.js");
Требуется включение:
splitting: true,
format: "esm"
Без этого esbuild объединяет код в один файл, игнорируя разделение.
При установке слишком старого target современные
конструкции ломаются:
Симптомы:
Пример корректной настройки:
target: "es2020"
Incremental режим может возвращать устаревшие результаты при:
Особенность заключается в том, что rebuild() использует
предыдущий граф зависимостей.
Sourcemaps могут:
Причины:
sourcemap: inline и
outfilesourceRootПри использовании внешних трансформеров (например, Babel до esbuild) возможны:
Решение заключается в разделении ролей: