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

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

Собираем вместе: чтение кода

Суть Читаем четыре реальных сниппета фронтенда — размещение глобального состояния, fetch-waterfall, ленивый импорт, ссылку на токен — и выбираем фикс, который senior делает первым.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Архитектура читается в коде, а не в слайдах. Каждый сниппет ниже — это слой трека, пойманный в момент, когда он идёт не так. Прочитайте код, спрогнозируйте цену и выберите фикс, бьющий по слою, которому реально принадлежит баг.

Цель

Отработать кросс-трековый цикл диагностики: прочитать сниппет, определить, какому слою он принадлежит (state, fetch, splitting, токены), и выбрать самый рычажный фикс вместо того, что патчит симптом выше.

Сниппет 1 — где живёт нажатие клавиши

// глобальный store
const useStore = create((set) => ({
  search: "",
  setSearch: (v) => set({ search: v }),
}));

function SearchBox() {
  const setSearch = useStore((s) => s.setSearch);
  return <input onChange={(e) => setSearch(e.target.value)} />;
}

function Dashboard() {
  // Chart, Table, Filters, Sidebar — все где-то вызывают useStore(...)
  return <><SearchBox /><Chart /><Table /><Sidebar /></>;
}
Викторина

Ввод в поле поиска тормозит весь дашборд. По этому коду — в чём причина и фикс?

Сниппет 2 — граф fetch

function ProductPage({ id }) {
  const product = useQuery(["product", id], () => fetchProduct(id));
  // эти два НЕ зависят от product, но ждут его:
  const reviews = useQuery(["reviews", id], () => fetchReviews(id), {
    enabled: !!product.data,
  });
  const related = useQuery(["related", id], () => fetchRelated(id), {
    enabled: !!product.data,
  });
  // ...рендерит после резолва всех трёх
}
Викторина

Отзывы и похожие товары не зависят от полезной нагрузки product, и всё же LCP медленный. В чём дефект и фикс?

Сниппет 3 — ленивый импорт

import { HeavyChart } from "./HeavyChart"; // тянет 400 КБ библиотеки графиков

function Analytics() {
  const [open, setOpen] = useState(false);
  return (
    <>
      <button onClick={() => setOpen(true)}>Show charts</button>
      {open && <HeavyChart />}
    </>
  );
}
Викторина

Библиотека графиков на 400 КБ уходит в начальный бандл, хотя большинство пользователей никогда не жмут 'Show charts'. Почему и в чём фикс?

Сниппет 4 — ссылка на токен

/* Button.css */
.btn-danger {
  background: #d33; /* брендовый красный, захардкожен */
  color: #fff;
}
/* повторяется в ~40 компонентах: #d33, #fff, #1a1a1a ... */
Викторина

Тёмной теме нужно, чтобы `.btn-danger` читался иначе на тёмной поверхности, а ребрендинг сменит красный. Что вскрывает этот CSS и в чём структурный фикс?

Итог

Четыре сниппета, четыре слоя, одна привычка: per-keystroke состояние должно быть колокейтнуто, а не в глобальном store; гейт enabled на независимом fetch’е — это искусственный waterfall; статический импорт бандлит жадно, а только динамический import() разбивает; захардкоженный hex — это отсутствующий семантический токен. В каждом случае самый рычажный фикс живёт на слое, которому принадлежит баг — перенести состояние, убрать ложную зависимость, разбить чанк, добавить семантический слой — никогда не патч на слой выше.

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

Trademarks belong to their respective owners. Editorial reference only.