mcpField
A
angular-ssr

angular-ssr

github.com/oguzhan18开发7168 次安装31 周前更新
代码仓库

关于 angular-ssr

面向 Angular 21 开发者的服务端渲染、Hydration 与预渲染参考技能,涵盖当前配置方式及按路由设置混合渲染。

主要功能

  1. 01通过 Angular CLI 配置 SSR
  2. 02客户端与增量 Hydration
  3. 03按路由配置混合渲染
  4. 04使用 @defer 延迟加载
  5. 05区分浏览器与服务端代码
  6. 06通过 TransferState 复用请求

适用场景

  1. 01为 Angular 应用添加 SSR
  2. 02配置增量 Hydration
  3. 03按路由选择渲染模式

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/oguzhan18/angular-ecosystem-skills --skill angular-ssr

安装后在 Claude Code 中输入/angular-ssr确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/discussions/
_INDEX.md
references/docs/
_INDEX.md
references/issues/
_INDEX.md
references/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