2026: сборка фронтенда на удалённом Mac —
esbuild и SWC в monorepo: параллельные воркеры, cacheDir, NODE_OPTIONS и инкремент
Для кого: команды на pnpm/npm workspaces, где Vite, Next.js или скрипты одновременно дергают esbuild и SWC. На арендованном удалённом Mac легко получить конкуренцию за CPU, разъехавшиеся кэши и OOM в Node, если не согласовать воркеры и каталоги. Ниже — матрица по GOMAXPROCS, числу воркеров, cacheDir, NODE_OPTIONS и инкрементальным режимам, плюс исполняемая приёмка. Связка с фронтенд-материалами: Intersection Observer и скелетоны, раздел блога о фронтенде; без обязательного входа — главная и покупка. Дополнительно: Rspack, esbuild и кэш на remote Mac.
01 Почему monorepo «ломается» на удалённом Mac
Apple Silicon быстр, но два нативных компилятора плюс Node всё равно могут перегрузить ядра, продублировать работу и сбросить тёплый кэш, если каждый пакет поднимает свой пул потоков.
- Двойной параллелизм: esbuild на Go, SWC на Rust — оба по умолчанию широкие и не знают о лимитах друг друга.
- Дрейф путей кэша: CI копирует
node_modules, но забывает.turbo,.swcили метаданные Vite без единого правилаcacheDir. - Давление на кучу Node: типо-осознанные плагины и source map остаются в Node; неверный
NODE_OPTIONSмаскирует OOM до пиков нагрузки.
Сначала выровняйте окружение — иначе вы меряете шум, а не регрессии. Подбор ядер удобно согласовать с тарифами, если меняете класс машины под билдеры.
02 Таблица: esbuild, SWC и оркестратор monorepo
Используйте таблицу как черновик, когда два конвейера собираются на одном хосте; точные флаги задаёт обёртка бандлера.
| Слой | GOMAXPROCS / воркеры | cacheDir | NODE_OPTIONS (куча) | Инкремент |
|---|---|---|---|---|
| esbuild (Go) | GOMAXPROCS близко к числу физических ядер минус один на общем Mac; ограничьте параллелизм бандлера, чтобы потоки Node не наслаивались. |
Бинарник stateless; сохраняйте обёрточные кэши вроде node_modules/.cache/esbuild или .cache/build. |
Не для Go-бинарника; размер кучи — для плагинов Node рядом. | Инкремент через API или кэш бандлера, не одним глобальным флагом CLI. |
| SWC (Rust) | RAYON_NUM_THREADS по зарезервированным vCPU; лимитируйте задачи Next/Turbo ниже потоков хоста. |
Держите .swc и .next/cache на локальном SSD; при необходимости — симлинк в воркспейс. |
Добавьте кучу, если рядом TS-программа или плагины: например NODE_OPTIONS=--max-old-space-size=8192 после замеров RSS. |
Кэш AST на диске; включайте инкремент фреймворка и не сотрите кэш между тёплыми прогонами, если не тестируете холодный старт. |
| Оркестратор (Turbo, Nx, Rush) | Сведите --parallel с GOMAXPROCS и потоками SWC; оставьте одно ядро под sshd и I/O. |
Направьте TURBO_CACHE_DIR или NX_CACHE_DIRECTORY в один путь; отключите агрессивные очистители. |
Задайте NODE_OPTIONS один раз в CI, чтобы вложенные скрипты делили один потолок кучи. |
Удалённый кэш — после того как локальный инкремент стабилен; хиты не должны скрывать битую конфигурацию. |
03 Пять шагов настройки перед бенчмарком
- Перечислите бинарники, которые трогают TypeScript/JSX, и отметьте esbuild, SWC или оба.
- Выберите один корень кэша на раннер, экспортируйте в профиль и архивируйте в CI.
- Согласуйте
GOMAXPROCS,RAYON_NUM_THREADSи сумму задач оркестратора с зарезервированными ядрами. - На удалённом Mac снимите холодный прогон с чистыми кэшами, затем тёплый повтор в пределах десяти минут.
- Зафиксируйте wall time, пик RSS и дисковые записи; приложите графики к pull request.
Дополнительно один раз выполните sysctl hw.ncpu и vm_stat — в тикетах будет контекст железа.
04 Цифры, которые можно вставить в тикет
- Кучу Node начинайте около 8 ГБ для крупных дизайн-систем; ужимайте после профилирования.
- Одно ядро оставьте под рабочий стол, синхронизацию и антивирус — вычитайте до лимитов потоков.
- Тёплый инкрементальный прогон на NVMe часто сокращает wall time на 30–60% относительно холодного.
05 Приёмка на удалённом Mac (чек-лист)
- Паритет SSH: два шелла,
env | sort, одинаковыеGOMAXPROCS,RAYON_NUM_THREADS,NODE_OPTIONSдо сравнения веток. - Доказательство кэша: тёплый прогон показывает рост байт в
cacheDirи попадания оркестратора; провал, если всегда холодный старт. - Конкуренция: запустите тесты параллельно со сборкой; wall time остаётся в опубликованном бюджете.
- Диск:
df -h; если кэши съедают свободное место >20%, подрежьте ветки, а не рабочие кэши без причины. - Заметка к релизу: вставьте строку матрицы и холодные/тёплые тайминги для следующего инженера.
Если пики не сходятся, арендуйте выделенный удалённый Mac с изолированным CPU и быстрым NVMe — очереди к ядрам исчезнут, кэши дольше остаются тёплыми.
06 FAQ
Увеличение GOMAXPROCS всегда ускоряет esbuild?
Нет: за пределами физических ядер растёт только стоимость переключения контекста.
Должны ли SWC и esbuild делить один cacheDir?
Внутренности кэша раздельны, но родительский том для бэкапов и CI лучше один.
Безопасен ли инкремент на общих remote Mac?
Да при изолированных путях; полная очистка — при смене toolchain, а не при каждом прогоне.
Арендуйте Mac, чтобы ускорить esbuild и SWC
Выделенный Apple Silicon снимает очереди к ядрам и держит кэши горячими. Оформите аренду удалённого Mac для CI или тяжёлых сборок: тарифы и покупка доступны без обязательного входа. Помощь по SSH и VNC, главная — с планами и регионами.