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

Браузер и фронтенд-рантайм

Всё вместе: чтение кода и trace

Суть Прочитай четыре сниппета браузера — порядок microtask, layout thrash, hydration mismatch и блокирующий обработчик — и выбери поведение или фикс с наибольшим рычагом.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Trace говорит, куда ушло время; код говорит, почему. Читай каждый сниппет так, как читал бы на ревью медленной страницы, и выбирай поведение или фикс, к которому senior-инженер тянется первым.

Цель

Потренируйся отображать код обратно на слой, который он нагружает: порядок очередей event loop, связку layout/paint в render pipeline, детерминизм гидратации и бюджет INP на main thread.

Сниппет 1 — порядок очередей

console.log("A");
setTimeout(() => console.log("B"), 0);
Promise.resolve().then(() => console.log("C"));
queueMicrotask(() => console.log("D"));
console.log("E");
Викторина

В каком порядке это залогируется и почему?

Сниппет 2 — цикл ресайза

function fitAll(boxes) {
  for (const box of boxes) {
    const w = box.offsetWidth;     // READ — forces layout
    box.style.width = w + 10 + "px"; // WRITE — invalidates layout
  }
}
Викторина

При 500 боксах этот обработчик — длинная задача, разрушающая INP. В чём дефект и фикс?

Сниппет 3 — рендер на сервере/клиенте

function Price({ cents }) {
  // runs on both server and client during hydration
  const formatted = new Intl.NumberFormat(navigator.language, {
    style: "currency", currency: "USD",
  }).format(cents / 100);
  return <span id="price">{formatted}</span>;
}
Викторина

Этот компонент периодически мигает ценой и поднимает CLS при гидратации. В чём межслойный баг?

Сниппет 4 — обработчик клика

button.addEventListener("click", () => {
  cart.add(item);
  renderCartBadge();                  // small DOM update
  const report = JSON.parse(hugeBlob); // ~120 ms on a mid-range phone
  analytics.sendSync(report);          // synchronous beacon
});
Викторина

Badge обновляется, но INP этого клика ~180 мс даже на свободном потоке. Какой фикс уважает бюджет INP?

Итог

Четыре сниппета, четыре слоя. Event loop осушает все microtask (промис, queueMicrotask) до следующего macrotask (setTimeout), поэтому порядок — синхронное, затем microtask, затем macrotask. Чередование чтений и записей DOM форсирует reflow на итерацию — сначала чтения, потом записи. Компонент, рендерящий локаль- или браузер-зависимое значение на сервере, — это hydration mismatch: сделай серверный рендер детерминированным, а клиент-only форматирование отложи в useEffect. И любая синхронная тяжёлая работа в обработчике до paint засчитывается в INP — обнови UI минимально, затем уступи. Навык — читать код прямо обратно на трек, который он нагружает.

Продолжить восхождение ↑Всё вместе: диагностируй и почини дёрганую страницу end-to-end
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.