2026 SSR на удалённом Mac:
Next.js и Nuxt — память Node и параллелизм сборки
Для кого материал: для фронтенд- и fullstack-инженеров, которые собирают SSR на Next.js или Nuxt на удалённом Mac — по SSH на арендованный Apple Silicon, как self-hosted runner или как префлайт-узел перед продакшеном. Ключевые слова для runbook и SEO: удалённый Mac, Next.js, Nuxt, память Node, параллелизм сборки. Задача — не «теория тюнинга», а исполняемые переменные окружения и верхние границы, которые можно закоммитить рядом с YAML пайплайна, чтобы продакшен-подобные next build и nuxt build не падали с непрозрачным OOM, когда узел слабее ноутбука разработчика. Monorepo и изоляция версий Node описаны в гайдах: pnpm, Turborepo и удалённый кэш и изоляция Node/npm на удалённом Mac; проверка деплоя и путей — в чек-листе деплоя фронтенда и Safari.
01 Лимит памяти и пороги срабатывания OOM
Компиляция SSR долго держит в RAM большие графы зависимостей: модули маршрутов, серверные бандлы, карты кода, иногда дублирующийся разбор AST при параллельных плагинах. На срезе CI с удалённым Mac редко приходит вежливый stack trace — чаще JavaScript heap out of memory, код выхода 134 или 137 после вмешательства OOM-killer.
Практическое правило порога: если типичный resident set size одной сборки стабильно превышает ~70% памяти, зарезервированной под эту задачу до пиков пререндера, вы уже в зоне риска: пики приходят на минификации, статической генерации или упаковке Nitro, а не на первом проходе TypeScript.
Исполняемое исправление: задайте жёсткий потолок кучи V8, чтобы процесс упал с понятной ошибкой, а не «утонул» в swap на macOS. Перед шагом сборки в той же оболочке:
- Куча на задачу:
export NODE_OPTIONS="--max-old-space-size=8192"(на хостах с 16 ГБ ОЗУ чаще стартуют с 6144; 12288–16384 — только если на машине реально есть запас и одновременно идёт одна сборка). - Паритет CI: ту же строку
NODE_OPTIONSпродублируйте в GitHub Actions, GitLab, Jenkins и SSH-сессии — иначе цифры «на MacBook работает» не совпадут с раннером удалённого Mac. - Шум телеметрии: для Next.js в CI полезно
export NEXT_TELEMETRY_DISABLED=1; вместе с установкой по frozen lockfile это снижает фоновую нагрузку на узел.
02 Параллельные воркеры и связь с CPU — таблица
Apple Silicon показывает много ядер, но SSR — смесь CPU-транспиляции и память-ёмких графов. Увеличение воркеров сверх пропускной способности RAM не ускоряет wall time — оно повышает вероятность параллельных OOM. «Максимум воркеров» считайте произведением числа ядер и бюджета кучи на процесс.
Если оркеструете несколько пакетов, ограничьте и конкурентность оркестратора (например --concurrency у Turborepo), чтобы две тяжёлые SSR-сборки не пиковали одновременно — см. выше ссылку на чек-лист monorepo и удалённый кэш.
| Производительные ядра (типичный уровень M4) | Безопасное число параллельных SSR-сборок на одном хосте | Стартовый --max-old-space-size на сборку (МБ) |
Заметки |
|---|---|---|---|
| 4 | 1 | 6144–8192 | Резервируйте RAM под sshd, файловые вотчеры и кэш ОС; не смешивайте с тяжёлым Playwright в том же окне. |
| 8 | 1 (крупные приложения) / 2 (меньше по графу) | 4096–6144 каждая | При >300 маршрутах или тяжёлом i18n держите 1 задачу; вторую ставьте в очередь. |
| 10+ | 2 | 4096–8192 каждая | Следите за swap; если в Activity Monitor давление памяти «жёлтое», сначала уменьшайте число задач, а не наращивайте heap. |
- Пул libuv: опционально
UV_THREADPOOL_SIZE=8для нативно-нагруженных графов зависимостей; не превышайте число производительных ядер. - Тесты и сборки: лимитируйте Jest/Vitest отдельно (
--maxWorkers=50%или явное число); не переносите настройки «машины сборки» на шарды E2E.
03 Каталоги кэша и стратегия очистки
Устаревший кэш на общих хостах удалённого Mac даёт дрейф «локально зелёно, на CI красно» и быстрее забивает небольшие SSD, чем повторные npm install. Разделите пути «удалить, чтобы сбросить поведение» и «удалить, чтобы освободить диск», чтобы дежурный инженер случайно не снёс тёплый кэш посреди инцидента.
- Next.js: артефакты в
.next/; персистентный webpack-кэш часто в.next/cache/. Жёсткий сброс — удалить весь.nextпередnext build. - Nuxt 3: dev-артефакты в
.nuxt/; прод-вывод в.output/; метаданные Vite нередко вnode_modules/.cache/. Скрипт очистки при смене пресета Nitro или серверных маршрутов должен убирать.nuxtи.output. - pnpm store: не удаляйте store как «быстрый фикс» одного приложения — используйте
pnpm store pruneпосле переноса проектов. - Расписание: еженедельный
cronили maintenance-job в CI, который подрезает выходы сборок старше N дней, плюс проверкаdf -hперед ночными пайплайнами.
04 FAQ о стабильности удалённого узла
Почему тот же коммит собирается на ноутбуке, а на арендованном Mac падает по OOM? Разные значения NODE_OPTIONS, меньший единый пул памяти или матрица CI, где две SSR-сборки идут параллельно со Storybook. Закрепите одну тяжёлую сборку на этап и синхронизируйте флаги кучи.
Всегда ли ставить воркеры на «максимум» ради скорости? Нет: больше воркеров — выше пик RSS; оптимум обычно между 50% и 100% производительных ядер только если в этот шаг машина отдана одной сборке.
Диск заполнился посреди сборки — что ломается первым? У Next может не записаться .next/cache; у Nuxt/Vite инкрементальный кэш может повредиться. Падайте шагом, освободите место, удалите кэши фреймворка, переустановите с frozen lockfile и пересоберите.
Нужен ли Rosetta в 2026? На Apple Silicon предпочитайте arm64-бинарники Node; x64 под эмуляцией тратит больше памяти и замедляет CI настолько, что маскируются гонки.
05 Матрица Next.js vs Nuxt и чек-лист
Таблица для внутренних доков и user-data self-hosted runner: какие ручки команды ждут в Slack при инциденте. Дополняет таблицу конкурентности выше и связывается с практикой CI/CD и профилированием производительности узла.
| Тема | Next.js (SSR / эра App Router) | Nuxt 3 (Vite + Nitro) |
|---|---|---|
| Главный рычаг RAM | NODE_OPTIONS=--max-old-space-size=… вокруг next build |
Тот же NODE_OPTIONS вокруг nuxt build; пики при упаковке Nitro |
| Типичные каталоги кэша | .next/, особенно .next/cache |
.nuxt/, .output/, node_modules/.cache |
| Логика параллелизма | Ограничить job-матрицу; одно крупное next build на окно хоста |
Кап параллельных Nuxt-сборок; апгрейды Vite/Nitro — с инвалидацией кэша |
| Сигнал CI/CD | Ошибки кучи на этапах сбора данных страниц / пререндер | OOM на серверном бандле или фазах rollup Nitro |
- Экспортируйте
NODE_OPTIONSиNEXT_TELEMETRY_DISABLED(Next) в той же оболочке, что запускает сборку. - Одна тяжёлая SSR-сборка на этап, пока профилирование RSS не докажет обратное.
- Скрипт удаления кэша (
.next/.nuxt/.output) повесьте на флаг в runbook. - В начале CI логируйте
uname -m,node -p process.archи свободную память для триажа регрессий.
Память Node и параллелизм сборки — согласованные входы CI/CD: поднимайте heap только когда одна задача владеет машиной, и не компенсируйте лишними параллельными SSR одним лишь --max-old-space-size. Зафиксируйте каталоги Next.js и Nuxt, автоматизируйте очистку и держите раннеры удалённого Mac на arm64-цепочке для предсказуемых пайплайнов в 2026 году.
Арендуйте удалённый Mac под SSR-сборки — настройка памяти и воркеров без сюрпризов
Mac Mini M4 с предсказуемым объёмом RAM, arm64 Node и запасом диска под .next и .output. Откройте страницу покупки без обязательного входа в аккаунт: посмотрите тарифы, выберите регион и план, оформите заказ и подключите пайплайн или SSH к стабильному хосту — как в разделе помощи по доступу.