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.