Коротка відповідь
seniorКешування файлів контролюється через унікальний hash у URL, наприклад `app.abc123.js`. При оновленні коду змінюється hash, що змушує браузер завантажити нову версію. Також можна встановити заголовки `Cache-Control: no-cache` для критичних ресурсів.
Повне пояснення
Що це і навіщо
Кешування статичних файлів (скриптів, стилів) зменшує час завантаження сторінки, але у разі оновлення коду браузер може продовжувати використовувати стару версію. Щоб уникнути цього, треба забезпечити зміну URL‑адреси при кожному релізі.
Ключові принципи
- Cache busting – додавання унікального параметра (hash, timestamp) до URL.
- Cache‑control headers –
max-age,no-cache,must-revalidate. - Service‑worker – контроль кешу на стороні клієнта.
Як це працює
- При збірці проекту інструмент (Webpack, Vite, Next.js) генерує файл з хешем у назві.
- HTML посилається на цей файл:
<script src="/static/js/app.abc123.js"></script>. - Коли код змінюється, генерується новий hash (
app.def456.js). Браузер бачить інший URL і завантажує новий файл.
Практика та реалізація
- Webpack:
output.filename = '[name].[contenthash].js'. - Vite: автоматично додає
[hash]у назву файлів. - Next.js:
next.config.js→output: 'standalone', кешування за замовчуванням.
Тестування
import { render } from '@testing-library/react';
const { container } = render(<App />);
expect(container.querySelector('script[src*=".js"]')).toHaveAttribute('src', /\.abc123\.js$/);
Безпека та приватність
Уникайте Cache-Control: no-store для всіх ресурсів, бо це знижує продуктивність. Використовуйте immutable для файлів, що не змінюються.
Оптимізація
- Preload:
<link rel="preload" href="/static/js/app.abc123.js" as="script">. - HTTP/2 push: сервер може надсилати ресурси разом із HTML.
Часті помилки
- Залишаєте статичні файли без хешу → браузер кешує.
- Неправильний
Cache-Control→ ресурси не оновлюються. - Service‑worker кешує старі файли → потрібно правильно обробляти
activate.
Cheatsheet
- Hash:
[contenthash]→ змінюється при змінах. - Headers:
Cache-Control: public, max-age=31536000, immutableдля статичних. - No-cache:
Cache-Control: no-cache, must-revalidateдля динамічних.
Follow‑up питання
- Як працює
service-workerу контексті кешування? - Які переваги має HTTP/2 push над preload?