angular-architect
Angular 16以降の最新機能やRxJS/NgRxを駆使し、大規模なエンタープライズ向けAngular開発を専門的に行うSkill。
📜 元の英語説明(参考)
Enterprise Angular development expert specializing in Angular 16+ features, Signals, Standalone Components, and RxJS/NgRx at scale.
🇯🇵 日本人クリエイター向け解説
Angular 16以降の最新機能やRxJS/NgRxを駆使し、大規模なエンタープライズ向けAngular開発を専門的に行うSkill。
※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。
⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。
🎯 このSkillでできること
下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。
📦 インストール方法 (3ステップ)
- 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
- 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
- 3. 展開してできたフォルダを、ホームフォルダの
.claude/skills/に置く- · macOS / Linux:
~/.claude/skills/ - · Windows:
%USERPROFILE%\.claude\skills\
- · macOS / Linux:
Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。
詳しい使い方ガイドを見る →- 最終更新
- 2026-05-17
- 取得日時
- 2026-05-17
- 同梱ファイル
- 1
📖 Skill本文(日本語訳)
※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。
Angular Architect
目的
Angular 16+ の機能(Signals、Standalone Components)、RxJS リアクティブプログラミング、NgRx スケールでの状態管理に特化した、エンタープライズ Angular 開発の専門知識を提供します。パフォーマンス最適化と最新のアーキテクチャパターンを用いて、大規模な Angular アプリケーションを設計します。
使用する場面
- 大規模な Angular アプリケーション(Monorepo、Micro-frontends)のアーキテクチャ設計
- きめ細やかなリアクティビティのための Signals の実装(Angular 16+)
- レガシーな Modules (NgModule) から Standalone Components への移行
- NgRx または NgRx Signal Store を用いた複雑な状態管理の設計
- パフォーマンスの最適化(Zoneless、OnPush、Hydration)
- Nx または Turborepo を用いたエンタープライズ CI/CD のセットアップ
2. 意思決定フレームワーク
状態管理戦略
What is the complexity level?
│
├─ **Local State (Component)**
│ ├─ Simple? → **Signals (`signal`, `computed`)**
│ └─ Complex streams? → **RxJS (`BehaviorSubject`)**
│
├─ **Global Shared State**
│ ├─ Lightweight? → **NgRx Signal Store** (Modern, functional)
│ ├─ Enterprise/Complex? → **NgRx Store (Redux)** (Strict actions/reducers)
│ └─ Entity Collections? → **NgRx Entity**
│
└─ **Server State**
└─ Caching/Deduplication? → **TanStack Query (Angular)** or **RxJS + Cache Operator**
アーキテクチャパターン
| パターン | ユースケース | 利点 | 欠点 |
|---|---|---|---|
| Standalone | 15+ のデフォルト | ボイラープレートが少ない、ツリーシェイク可能 | レガシー開発者にとって学習曲線がある |
| Nx Monorepo | マルチアプリのエンタープライズ | 共有ライブラリ、影響を受けるビルド | ツーリングの複雑さ |
| Micro-Frontends | 異なるチーム/スタック | 独立したデプロイ | ランタイムの複雑さ、共有依存関係の地獄 |
| Zoneless | 高パフォーマンス | Zone.js のオーバーヘッドがない | 明示的な変更検知が必要 |
危険信号 → performance-engineer にエスカレート:
- "ExpressionChangedAfterItHasBeenCheckedError" が頻繁に発生する
- 初期ロード時のバンドルサイズが 5MB を超える
- 変更検知サイクルが常に実行されている(Zone.js のスラッシング)
- RxJS サブスクリプションでのメモリリーク(
takeUntilDestroyedの忘れ)
ワークフロー 2: NgRx Signal Store (モダンな状態)
目標: Redux よりも少ないボイラープレートで機能の状態を管理します。
手順:
-
ストアの定義
import { signalStore, withState, withMethods, patchState } from '@ngrx/signals'; export const UserStore = signalStore( { providedIn: 'root' }, withState({ users: [], loading: false, query: '' }), withMethods((store) => ({ setQuery(query: string) { patchState(store, { query }); }, async loadUsers() { patchState(store, { loading: true }); const users = await fetchUsers(store.query()); patchState(store, { users, loading: false }); } })) ); -
コンポーネントでの使用
export class UserListComponent { readonly store = inject(UserStore); constructor() { // Auto-load when query changes (Effect) effect(() => { this.store.loadUsers(); }); } }
ワークフロー 4: Zoneless アプリケーション (Angular 18+)
目標: Zone.js を削除して、バンドルサイズを小さくし、デバッグを改善します。
手順:
-
ブートストラップ設定
// main.ts bootstrapApplication(AppComponent, { providers: [ provideExperimentalZonelessChangeDetection() ] }); -
状態管理 (Signals のみ)
ApplicationRef.tick()を手動で使用しないでください。- すべての状態に
signal()を使用してください。 - イベントは自動的に変更検知をトリガーします。
-
統合
- RxJS:
AsyncPipe(引き続き機能します) またはtoSignalを使用してください。 - タイマー:
setIntervalは自動的に CD をトリガーしません。タイマー内でsignalの更新を使用してください。
- RxJS:
コア機能
エンタープライズ Angular アーキテクチャ
- 大規模な Angular アプリケーションアーキテクチャを設計します
- モジュラー設計パターン(Nx モノレポ、マイクロフロントエンド)を実装します
- チームのコーディング標準とベストプラクティスを確立します
- スケーラブルなフォルダ構造とモジュール構成を作成します
モダン Angular 開発
- きめ細やかなリアクティビティのために Signals を実装します(Angular 16+)
- レガシーな NgModule ベースのコードを Standalone Components に移行します
- OnPush および Zoneless 戦略で変更検知を最適化します
- 新しい Angular 機能(deferrable views、hydration)を活用します
状態管理
- エンタープライズアプリケーション向けに NgRx Store アーキテクチャを設計します
- 軽量な状態管理のために NgRx Signal Store を実装します
- 複雑な要件のためにカスタム状態管理ソリューションを作成します
- TanStack Query または RxJS パターンでサーバーの状態を統合します
パフォーマンスエンジニアリング
- ツリーシェイキングと遅延ロードでバンドルサイズを最適化します
- コード分割と差分ロードを実装します
- パフォーマンス監視とメトリクス収集を作成します
- 大規模な Angular アプリケーションの最適化戦略を開発します
5. アンチパターンと落とし穴
❌ アンチパターン 1: ネストされたサブスクリプション(「コールバック地獄」)
どのようなものか:
this.route.params.subscribe(params => {
this.service.getData(params.id).subscribe(data => {
this.data = data; // Manual assignment
});
});
なぜ失敗するのか:
- 競合状態(パラメーターが速く変更された場合)。
- メモリリーク(購読解除されない場合)。
正しいアプローチ:
- SwitchMap:
this.data$ = this.route.params.pipe( switchMap(params => this.service.getData(params.id)) ); - テンプレートで
AsyncPipeまたはtoSignalを使用します。
❌ アンチパターン 2: テンプレート内のロジック
どのようなものか:
<div *ngIf="user.roles.includes('ADMIN') && user.active && !isLoading">
なぜ失敗するのか:
- テストが難しい。
- すべての変更検知サイクルで実行される。
正しいアプローチ:
- Computed Signal / Getter:
isAdmin = computed(() => this.user().roles.includes('ADMIN'));<div *n
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開
Angular Architect
Purpose
Provides enterprise Angular development expertise specializing in Angular 16+ features (Signals, Standalone Components), RxJS reactive programming, and NgRx state management at scale. Designs large-scale Angular applications with performance optimization and modern architectural patterns.
When to Use
- Architecting a large-scale Angular application (Monorepo, Micro-frontends)
- Implementing Signals for fine-grained reactivity (Angular 16+)
- Migrating legacy Modules (NgModule) to Standalone Components
- Designing complex state management with NgRx or NgRx Signal Store
- Optimizing performance (Zoneless, OnPush, Hydration)
- Setting up enterprise CI/CD with Nx or Turborepo
2. Decision Framework
State Management Strategy
What is the complexity level?
│
├─ **Local State (Component)**
│ ├─ Simple? → **Signals (`signal`, `computed`)**
│ └─ Complex streams? → **RxJS (`BehaviorSubject`)**
│
├─ **Global Shared State**
│ ├─ Lightweight? → **NgRx Signal Store** (Modern, functional)
│ ├─ Enterprise/Complex? → **NgRx Store (Redux)** (Strict actions/reducers)
│ └─ Entity Collections? → **NgRx Entity**
│
└─ **Server State**
└─ Caching/Deduplication? → **TanStack Query (Angular)** or **RxJS + Cache Operator**
Architecture Patterns
| Pattern | Use Case | Pros | Cons |
|---|---|---|---|
| Standalone | Default for 15+ | Less boilerplate, tree-shakable | Learning curve for legacy devs |
| Nx Monorepo | Multi-app enterprise | Shared libs, affected builds | Tooling complexity |
| Micro-Frontends | Different teams/stacks | Independent deployment | Runtime complexity, shared deps hell |
| Zoneless | High performance | No Zone.js overhead | Requires explicit Change Detection |
Red Flags → Escalate to performance-engineer:
- "ExpressionChangedAfterItHasBeenCheckedError" appearing frequently
- Bundle size > 5MB initial load
- Change detection cycles running constantly (Zone.js thrashing)
- Memory leaks in RxJS subscriptions (forgotten
takeUntilDestroyed)
Workflow 2: NgRx Signal Store (Modern State)
Goal: Manage feature state with less boilerplate than Redux.
Steps:
-
Define Store
import { signalStore, withState, withMethods, patchState } from '@ngrx/signals'; export const UserStore = signalStore( { providedIn: 'root' }, withState({ users: [], loading: false, query: '' }), withMethods((store) => ({ setQuery(query: string) { patchState(store, { query }); }, async loadUsers() { patchState(store, { loading: true }); const users = await fetchUsers(store.query()); patchState(store, { users, loading: false }); } })) ); -
Use in Component
export class UserListComponent { readonly store = inject(UserStore); constructor() { // Auto-load when query changes (Effect) effect(() => { this.store.loadUsers(); }); } }
Workflow 4: Zoneless Applications (Angular 18+)
Goal: Remove Zone.js for smaller bundles and better debugging.
Steps:
-
Bootstrap Config
// main.ts bootstrapApplication(AppComponent, { providers: [ provideExperimentalZonelessChangeDetection() ] }); -
State Management (Signals Only)
- Do NOT use
ApplicationRef.tick()manually. - Use
signal()for all state. - Events automatically trigger change detection.
- Do NOT use
-
Integrations
- RxJS: Use
AsyncPipe(still works) ortoSignal. - Timers:
setIntervaldoes NOT trigger CD automatically. Usesignalupdates inside the timer.
- RxJS: Use
Core Capabilities
Enterprise Angular Architecture
- Designs large-scale Angular application architectures
- Implements modular design patterns (Nx monorepos, micro-frontends)
- Establishes coding standards and best practices for teams
- Creates scalable folder structures and module organization
Modern Angular Development
- Implements Signals for fine-grained reactivity (Angular 16+)
- Migrates legacy NgModule-based code to Standalone Components
- Optimizes Change Detection with OnPush and Zoneless strategies
- Leverages new Angular features (deferrable views, hydration)
State Management
- Designs NgRx Store architectures for enterprise applications
- Implements NgRx Signal Store for lightweight state management
- Creates custom state management solutions for complex requirements
- Integrates server state with TanStack Query or RxJS patterns
Performance Engineering
- Optimizes bundle size with tree-shaking and lazy loading
- Implements code splitting and differential loading
- Creates performance monitoring and metrics collection
- Develops optimization strategies for large Angular applications
5. Anti-Patterns & Gotchas
❌ Anti-Pattern 1: Nested Subscriptions ("Callback Hell")
What it looks like:
this.route.params.subscribe(params => {
this.service.getData(params.id).subscribe(data => {
this.data = data; // Manual assignment
});
});
Why it fails:
- Race conditions (if params change fast).
- Memory leaks (if not unsubscribed).
Correct approach:
- SwitchMap:
this.data$ = this.route.params.pipe( switchMap(params => this.service.getData(params.id)) ); - Use
AsyncPipeortoSignalin template.
❌ Anti-Pattern 2: Logic in Templates
What it looks like:
<div *ngIf="user.roles.includes('ADMIN') && user.active && !isLoading">
Why it fails:
- Hard to test.
- Runs on every change detection cycle.
Correct approach:
- Computed Signal / Getter:
isAdmin = computed(() => this.user().roles.includes('ADMIN'));<div *ngIf="isAdmin()">
❌ Anti-Pattern 3: Shared Module Bloat
What it looks like:
- One massive
SharedModuleimporting everything (Material, Utils, Components).
Why it fails:
- Breaks tree-shaking.
- Increases initial bundle size.
Correct approach:
- Standalone Components: Import exactly what you need in the component's
imports: []array.
7. Quality Checklist
Architecture:
- [ ] Standalone: No
NgModulesfor new features. - [ ] Lazy Loading: All feature routes are lazy loaded (
loadComponent). - [ ] State: Local state uses Signals, Shared state uses Store.
Performance:
- [ ] Change Detection:
OnPushenabled everywhere. - [ ] Bundle: Initial bundle < 200KB.
- [ ] Defer:
@deferused for heavy components below the fold.
Code Quality:
- [ ] Strict Mode:
strict: truein tsconfig. - [ ] No Subscriptions:
AsyncPipeortoSignalused instead of.subscribe(). - [ ] Security: Inputs verified, no
innerHTMLwithout sanitization.
Examples
Example 1: Enterprise E-Commerce Platform Architecture
Scenario: A retail company needs to architect a large-scale e-commerce platform handling 100K+ concurrent users, with separate modules for catalog, cart, checkout, and user management.
Architecture Decisions:
- Nx Monorepo Structure: Split into apps (storefront, admin, api) and shared libraries (ui, utilities, data-access)
- State Management: NgRx Signal Store for cart/user state, TanStack Query for server state
- Performance Strategy: Deferrable views for below-fold content, OnPush everywhere, lazy loading for feature modules
- Micro-frontend Ready: Module Federation configured for potential future separation
Key Implementation Details:
- Cart Service using Signals with computed totals and persisted state
- Product Catalog with TanStack Query caching and optimistic updates
- Checkout flow with multi-step wizard and form validation
- Admin panel with separate build and deployment pipeline
Example 2: Legacy NgModule to Standalone Migration
Scenario: A financial services company has a 5-year-old Angular application using NgModules and wants to modernize to Angular 18 with Standalone Components.
Migration Strategy:
- Incremental Approach: Migrate one feature module at a time, never breaking the app
- Dependency Analysis: Use
ng-dompurifyto find all module dependencies - Component Conversion: Convert components to standalone with proper imports
- Service Refactoring: Remove module-level providedIn, use root or feature-level injection
Migration Results:
- Reduced initial bundle size by 40% through tree-shaking
- Eliminated 200+ lines of boilerplate NgModule code
- Improved change detection performance by 60%
- Enabled adoption of new Angular features (defer blocks, zoneless)
Example 3: Real-Time Dashboard with Signals
Scenario: A SaaS company needs a monitoring dashboard showing real-time metrics with 1-second updates, requiring fine-grained reactivity without Zone.js overhead.
Implementation Approach:
- Zoneless Bootstrap: Enable experimental zoneless change detection
- Signal-Based State: All dashboard state managed through Signals
- RxJS Interop: Use toSignal for converting Observables to Signals
- WebSocket Integration: Push updates directly to Signals
Performance Results:
- 30% reduction in bundle size (no Zone.js)
- 50% improvement in change detection cycles
- Smooth 60fps updates with complex data visualizations
- Improved debugging with clearer change detection logs
Best Practices
Architecture Design
- Design for Scale: Plan folder structures and module boundaries before writing code
- Embrace Standalone: Default to Standalone Components for all new development
- Lazy Load Everything: Feature modules, routes, and heavy components
- Separate Concerns: Smart containers vs. dumb presentational components
- Define Boundaries: Clear interfaces between layers (data, domain, presentation)
State Management
- Local State = Signals: Use signal() and computed() for component-level state
- Global State = Signal Store: NgRx Signal Store for shared feature state
- Server State = TanStack Query: Never manually manage server state caching
- Avoid Subscriptions: Use AsyncPipe, toSignal, or takeUntilDestroyed pattern
- Immutable Updates: Always create new references for state changes
Performance Engineering
- OnPush Everywhere: Default ChangeDetectionStrategy.OnPush for all components
- Defer Loading: Use @defer blocks for heavy components and dependencies
- Optimize Images: Lazy load images, use modern formats (WebP, AVIF)
- Bundle Analysis: Regular webpack bundle analysis to identify bloat
- Preload Strategically: Preload critical routes, lazy load everything else
Code Quality
- Strict Mode: Enable and maintain TypeScript strict mode
- Strict Null Checks: Never allow undefined/null without explicit handling
- Document APIs: Clear JSDoc for public methods and interfaces
- Centralize Configuration: Feature flags, environment configs in one place
- Automated Linting: ESLint with angular-specific rules and auto-fix
Testing Strategy
- Unit Tests: Jest or Vitest for component and service testing
- Integration Tests: Cypress or Playwright for critical user flows
- Test Coverage: Target 80%+ coverage for business logic
- Component Testing: Angular Testing Library for behavioral tests
- E2E Smoke Tests: Automated smoke tests on every deployment