awesome-everything EN
↑ Обратно к восхождению

Архитектура фронтенда

Monorepo: чтение конфигов и пайплайна

Суть Читай реальные конфиги Turborepo и Nx, предсказывай task graph и поведение кэша и выбирай фикс с наибольшим рычагом.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Конфиг пайплайна и ключ кэша — это места, где monorepo-проблемы реально диагностируются. Прочитай конфиг, предскажи task graph и то, что хэшируется в кэш, затем выбери фикс, который senior-инженер сделает первым.

Цель

Отработай цикл, который ты запускаешь на каждом медленном или небезопасном monorepo-пайплайне: прочти конфиг задач, выведи порядок и ключ кэша, замечай false hit или false miss и тянись к структурному фиксу раньше, чем добавлять железо.

Сниппет 1 — task graph

// turbo.json
{
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "outputs": ["dist/**"]
    },
    "test": {
      "dependsOn": ["build"],
      "outputs": []
    }
  }
}
Викторина

Какой порядок даёт этот конфиг и в чём разница между двумя записями dependsOn?

Сниппет 2 — ключ кэша

// turbo.json — входы задачи build
{
  "tasks": {
    "build": {
      "dependsOn": ["^build"],
      "inputs": ["src/**/*.ts", "src/**/*.tsx"],
      "outputs": ["dist/**"]
    }
  }
}
Викторина

Изменение в общем корневом tsconfig.json меняет вывод компилятора, но каждый build всё равно попадает в кэш и отдаёт устаревший dist. Читая эти inputs, в чём баг и фикс?

Сниппет 3 — affected-детекция

# CI: собрать/протестировать только то, что этот PR мог сломать
npx nx affected -t build test --base=origin/main --head=HEAD
Викторина

На долгоживущей release-ветке эта команда вдруг сообщает, что для крошечного diff затронут весь репозиторий. Самая вероятная причина?

Сниппет 4 — границы модулей

// .eslintrc — @nx/enforce-module-boundaries
{
  "depConstraints": [
    { "sourceTag": "type:feature", "onlyDependOnLibsWithTags": ["type:ui", "type:util"] },
    { "sourceTag": "type:ui",      "onlyDependOnLibsWithTags": ["type:util"] },
    { "sourceTag": "type:util",    "onlyDependOnLibsWithTags": ["type:util"] }
  ]
}
Викторина

Какой импорт этот конфиг отклоняет на линте и какую проблему графа предотвращает отклонение?

Итог

Каждая проблема monorepo-пайплайна читается в конфиге и в git-диапазоне: каретка в dependsOn решает, собираются ли вышестоящие пакеты первыми; glob inputs — это ключ кэша, где отсутствующий tsconfig — false hit, а волатильный путь — false miss; scope affected — это обход графа поверх diff, поэтому неверный —base раздувает его до всего репозитория; а depConstraints не дают низкоуровневым библиотекам набрать fan-in, делающий каждое изменение глобальным. Прочти конфиг, почини ключ или границу, затем перезапусти и подтверди, что affected-набор и hit rate ведут себя верно.

Продолжить восхождение ↑Monorepo: срезать CI с мира до среза
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.