Angular Universal — это технология, которая позволяет выполнять рендеринг Angular-приложений на стороне сервера (Server-Side Rendering, SSR). Это улучшает SEO, время первой загрузки и производительность на слабых устройствах. Рассмотрим пошаговую реализацию.
Добавляем Universal в существующий проект:
ng add @nguniversal/express-engine
Эта команда:
server.ts
, main.server.ts
).Ключевые файлы:
server.ts
— Express-сервер для рендеринга.app.module.server.ts
— корневой модуль для серверного рендеринга.main.server.ts
— точка входа для серверного приложения.Серверный рендеринг требует проверки платформы:
import { PLATFORM_ID } from '@angular/core';
import { isPlatformBrowser, isPlatformServer } from '@angular/common';
constructor(@Inject(PLATFORM_ID) private platformId: Object) {
if (isPlatformBrowser(this.platformId)) {
// Код выполнится только в браузере
console.log('Running in browser');
}
if (isPlatformServer(this.platformId)) {
// Код выполнится только на сервере
console.log('Running on server');
}
}
Используйте Renderer2
или проверку isPlatformBrowser
:
if (isPlatformBrowser(this.platformId)) {
window.scrollTo(0, 0);
}
Используйте TransferState
для предотвращения дублирования запросов:
import { TransferState, makeStateKey } from '@angular/platform-browser';
const DATA_KEY = makeStateKey<any>('data');
constructor(
private http: HttpClient,
private transferState: TransferState
) {}
getData() {
const storedData = this.transferState.get(DATA_KEY, null);
if (storedData) {
return of(storedData);
}
return this.http.get('/api/data').pipe(
tap(data => {
if (isPlatformServer(this.platformId)) {
this.transferState.set(DATA_KEY, data);
}
})
);
}
npm run dev:ssr
npm run build:ssr && npm run serve:ssr
Для статических страниц можно использовать prerender:
npm run prerender
Настройка кэширования в server.ts
:
server.get('*', (req, res) => {
res.setHeader('Cache-Control', 'public, max-age=600');
// ...
});
Используйте critters
для инлайнинга критического CSS:
// в angular.json
"configurations": {
"production": {
"optimization": {
"styles": {
"inlineCritical": true
}
}
}
}
Популярные варианты:
Пример Dockerfile:
FROM node:16-alpine
WORKDIR /app
COPY . .
RUN npm install && npm run build:ssr
EXPOSE 4000
CMD ["npm", "run", "serve:ssr"]
ng add @nguniversal/express-engine
добавляет SSR.build:ssr
и serve:ssr
для продакшена.Angular Universal значительно улучшает производительность и SEO, но требует адаптации кода для работы в SSR-режиме. Для простых проектов можно начать с prerendering, для сложных — с полноценного SSR.