关于 angular-ssr
面向 Angular 21 开发者的服务端渲染、Hydration 与预渲染参考技能,涵盖当前配置方式及按路由设置混合渲染。
主要功能
- 01通过 Angular CLI 配置 SSR
- 02客户端与增量 Hydration
- 03按路由配置混合渲染
- 04使用 @defer 延迟加载
- 05区分浏览器与服务端代码
- 06通过 TransferState 复用请求
适用场景
- 01为 Angular 应用添加 SSR
- 02配置增量 Hydration
- 03按路由选择渲染模式
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ oguzhan18/ angular-ecosystem-skills --skill angular-ssr安装后在 Claude Code 中输入/angular-ssr确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/discussions/_INDEX.mdreferences/docs/_INDEX.mdreferences/issues/_INDEX.mdreferences/releases/_INDEX.md详细介绍
@angular/ssr(服务器端渲染)
版本: Angular 21(2025) 标签: SSR、Hydration、预渲染、SEO、Angular Universal
参考资料: SSR 指南 • Hydration • @angular/ssr
API 变更
本节介绍近期特定版本的 API 变更。
-
新增:增量 Hydration — 逐步 Hydration 组件,而不是一次性完成 来源
-
新增:混合渲染 — 按路由配置渲染模式 来源
-
新增:
provideClientHydration— 支持事件重放的现代 Hydration 设置 -
新增:可延迟视图(@defer)— 延迟加载组件并支持 SSR
-
新增:
ngSkipHydration— 为特定组件停用 Hydration -
已弃用:Angular Universal — 迁移到 @angular/ssr
最佳实践
- 使用 CLI 启用 SSR
ng add @angular/ssr
# Or create new project with SSR
ng new my-app --ssr
- 启用客户端 Hydration
import { provideClientHydration } from '@angular/platform-browser';
export const appConfig: ApplicationConfig = {
providers: [
provideClientHydration()
]
};
- 使用增量 Hydration 提升性能
import { provideClientHydration, withIncrementalHydration } from '@angular/platform-browser';
export const appConfig: ApplicationConfig = {
providers: [
provideClientHydration(withIncrementalHydration())
]
};
- 使用 @defer 延迟加载
@Component({
template: `
@defer (on viewport) {
<heavy-component />
} @placeholder {
<div>Loading...</div>
}
`
})
export class MainComponent {}
- 使用 isPlatformBrowser 处理浏览器专属代码
import { PLATFORM_ID, Inject } from '@angular/core';
constructor(@Inject(PLATFORM_ID) private platformId: Object) {
if (isPlatformBrowser(this.platformId)) {
// Browser-only code
}
}
- 使用 TransferState 防止重复发送 HTTP 请求
import { TransferState, makeStateKey } from '@angular/platform-browser';
@Injectable()
export class DataService {
constructor(private http: HttpClient, private transferState: TransferState) {}
getData() {
const DATA_KEY = makeStateKey('DATA');
if (this.transferState.hasKey(DATA_KEY)) {
return of(this.transferState.get(DATA_KEY, []));
}
return this.http.get('/api/data').pipe(
tap(data => this.transferState.set(DATA_KEY, data))
);
}
}
- 对会操作 DOM 的组件跳过 Hydration
@Component({
selector: 'app-third-party',
host: {
'ngSkipHydration': 'true'
}
})
export class ThirdPartyComponent {}
- 按路由配置混合渲染
import { RenderMode, ServerRoute } from '@angular/ssr';
export const serverRoutes: ServerRoute[] = [
{
path: 'dashboard',
renderMode: RenderMode.Client
},
{
path: 'blog/:slug',
renderMode: RenderMode.Server
},
{
path: 'about',
renderMode: RenderMode.Prerender
}
];
- 使用 platform-server 处理服务器端逻辑
import { isPlatformServer } from '@angular/common';
constructor(@Inject(PLATFORM_ID) platformId: Object) {
if (isPlatformServer(platformId)) {
// Server-side only
}
}
评论
支持 Markdown