Когда браузер получает index.html
, он проходит через несколько ключевых этапов для отображения страницы. Этот процесс называется Critical Rendering Path (CRP) — критический путь рендеринга.
<!DOCTYPE html>
<html>
<head>
<title>My App</title>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<div>Hello World</div>
<script src="app.js"></script>
</body>
</html>
<script>
или <link>
парсинг может блокироваться (если нет атрибутов async/defer
для JS или preload
для CSS).async/defer
).// app.js
document.querySelector('div').style.color = 'red'; // Требует готового DOM
display: none
исключаются).div { width: 50%; margin: 10px; } // Браузер пересчитывает % в пиксели
will-change
или transform
для оптимизации.Стратегии загрузки JS:
async/defer
в <script>
:
<script src="vendor.js" defer></script> // Выполняется после DOMContentLoaded
Предзагрузка ресурсов:
<link rel="preload" href="critical.css" as="style">
Ленивая загрузка модулей:
// Angular
const routes: Routes = [
{ path: 'admin', loadChildren: () => import('./admin.module') }
];
Server-Side Rendering (SSR):
defer
/async
для скриптов.P.S. Для проверки CRP используйте Lighthouse или WebPageTest. Оптимальный CRP — это когда First Meaningful Paint происходит за <2 секунды.