Опция platform определяет, под какую среду выполнения
выполняется сборка: браузер, Node.js или универсальная среда. Она влияет
не только на поведение резолвинга модулей, но и на набор встроенных
полифиллов, обработку стандартной библиотеки, а также на то, какие
экспорты и условные поля пакетов будут считаться при бандлинге.
Ключевое влияние platform проявляется в трёх
аспектах:
node_modules;Значение platform: "browser" задаёт режим сборки для
клиентской среды выполнения в браузере.
При этом режиме:
fs,
path, crypto и др.);browser в
package.json;В браузерном режиме esbuild учитывает:
"browser" field в package.json как
основной источник замены модулей;node-специфичных экспортах, если есть
браузерная альтернатива.Пример поведения package.json:
{
"main": "index.node.js",
"browser": "index.browser.js"
}
В режиме browser будет выбран
index.browser.js.
Любая попытка импортировать Node.js core API:
import fs from "fs";
в браузерной сборке приведёт к ошибке или пустому shim-результату в
зависимости от конфигурации (inject, define,
внешние пакеты).
Значение platform: "node" предназначено для сборки под
Node.js runtime.
main,
module, exports, но с учётом
Node-условий;require,
import, node, default;exports и conditional exportsNode-платформа активирует строгую модель
package.json exports:
{
"exports": {
".": {
"node": "./dist/node.js",
"import": "./dist/esm.js",
"require": "./dist/cjs.js"
}
}
}
В режиме node приоритет будет:
nodeimport или require в зависимости от
формата сборкиdefaultNode platform:
import path from "path";
import fs from "fs/promises";
оставляет импорты без изменений, без полифиллов и транспиляции.
Значение platform: "neutral" задаёт абстрактную
платформу без привязки к Node.js или браузеру.
Neutral-режим используется, когда:
browser field;В отличие от node, встроенные модули:
external или
inject.Neutral часто используется для:
browser → приоритет browser fieldnode → приоритет Node conditional exportsneutral → минимальный набор правил без платформенных
предпочтенийbrowser → запрещены или заменяютсяnode → доступны напрямуюneutral → считаются внешними по умолчаниюbrowser → игнорирует node-условияnode → учитывает node/import/requireneutral → обрабатывает без приоритета платформыplatform не изменяет напрямую формат вывода
(iife, cjs, esm), но влияет на
содержимое результата:
Комбинация external и platform даёт
контроль над границами среды:
browser часто помечают Node core как external;node редко требуется external для core-модулей;neutral external используется для явного указания
среды.esbuild.build({
entryPoints: ["src/index.js"],
bundle: true,
platform: "browser",
target: "es2018"
});
esbuild.build({
entryPoints: ["src/server.js"],
bundle: true,
platform: "node",
target: "node18"
});
esbuild.build({
entryPoints: ["src/lib.js"],
bundle: true,
platform: "neutral",
format: "esm"
});
platform и target работают совместно, но
отвечают за разные уровни:
platform → окружение (API, резолвинг, core
modules)target → уровень JavaScript синтаксиса и
трансформацийПример:
platform: "browser", target: "es2015" → удаление Node
API + транспиляция под старые браузерыplatform: "node", target: "node20" → сохранение Node
API + минимальные трансформацииplatform: "neutral" → только синтаксис, без
предположений о runtimeВ browser режиме без browser поля:
main или module;При разных platform:
node корректно выбирает exports
conditionals;browser может обходить CJS ветки;neutral не гарантирует корректный выбор.Некоторые библиотеки содержат:
{
"browser": {
"fs": false
}
}
Это приводит к замене импортов на пустые модули в browser режиме.
platform формирует базовую модель окружения, вокруг
которой строится:
В сложных проектах (монорепозитории, универсальные SDK,
SSR-приложения) различие между browser, node и
neutral становится определяющим фактором корректности
результата сборки.