用途
本资料用于在 Angular v20+ 项目中实现服务端渲染(SSR)、混合(hydration / 水合)与预渲染(prerendering),核心依赖为 @angular/ssr 包。
安装与项目结构
向现有项目添加 SSR 使用命令:
ng add @angular/ssr
该命令会添加 @angular/ssr 包、server.ts(Express 服务器)、src/main.server.ts(服务端引导)、src/app/app.config.server.ts(服务端 providers),并更新 angular.json 的 SSR 配置。
生成的项目结构大致为:
src/
├── app/
│ ├── app.config.ts # Browser config
│ ├── app.config.server.ts # Server config
│ └── app.routes.ts
├── main.ts # Browser bootstrap
├── main.server.ts # Server bootstrap
server.ts # Express server
服务端配置
app.config.server.ts 使用 provideServerRendering() 与 provideServerRoutesConfig(serverRoutes),并通过 mergeApplicationConfig 合并浏览器与服务端配置。
路由级渲染模式在 app.routes.server.ts 中通过 ServerRoute 数组定义,使用 RenderMode 指定:
- RenderMode.Prerender:构建时生成静态 HTML,适用于营销页面、博客。
- RenderMode.Server:按请求动态 SSR,适用于用户相关内容。
- RenderMode.Client:仅客户端渲染(SPA),适用于需登录的仪表盘。
混合(Hydration)
默认混合通过 provideClientHydration() 启用。增量混合使用 @defer (hydrate ...) 延迟特定组件的混合,支持的触发条件包括:hydrate on viewport(元素进入视口时)、hydrate on interaction(点击、聚焦或输入时)、hydrate on idle(浏览器空闲时)、hydrate on immediate(加载后立即)、hydrate on timer(ms)(延迟指定毫秒后)、hydrate when condition(表达式为真时)、hydrate never(永不混合,保持静态)。
事件重放通过 provideClientHydration(withEventReplay()) 捕获混合完成前的用户事件。
仅浏览器代码
通过注入 PLATFORM_ID 并配合 isPlatformBrowser / isPlatformServer 判断运行平台;也可使用 afterNextRender(首次渲染后运行一次)与 afterRender(每次渲染后运行),二者仅在浏览器中执行。浏览器 API 可通过 InjectionToken(如 WINDOW、LOCAL_STORAGE)在工厂函数中按平台判断后安全注入。
预渲染
静态路由直接设置 renderMode: RenderMode.Prerender。动态路由可通过 getPrerenderParams 异步获取参数列表进行预渲染,并使用 fallback 指定未预渲染路由的处理方式:
- PrerenderFallback.Server:对这些路由做 SSR。
- PrerenderFallback.Client:客户端渲染。
- PrerenderFallback.None:返回 404。
HTTP 缓存
TransferState 可将 HTTP 响应从服务端传递到客户端。可通过 provideClientHydration(withHttpTransferCacheOptions({...})) 配置,选项包括 includePostRequests、includeRequestsWithAuthHeaders 与 filter;也可手动使用 TransferState 与 makeStateKey 实现。
构建与部署
构建命令为 ng build,产物结构包含 browser/(客户端资源)与 server/(服务端 bundle)。运行 SSR 服务器:开发环境使用 npm run serve:ssr:my-app,生产环境使用 node dist/my-app/server/server.mjs。资料给出基于 Express 与 CommonEngine 的 Node.js 部署示例,监听 4000 端口。
限制
资料未提供关于具体版本兼容细节、性能基准、收费或平台支持的额外信息;更多高级模式需参见 references/ssr-patterns.md(资料中提及但未展开)。