reference-compiler-cli について
Angular の `ngtsc` コンパイラー構造を解説するスキル資料です。Angular コンパイラーの開発者向けに、増分コンパイル、テンプレート型チェック、Ivy コード生成を説明します。
主な機能
- 01`NgtscProgram` とコンパイラー制御
- 02デコレーターの解析と解決
- 03TCB によるテンプレート型チェック
- 04Ivy 命令の生成
活用シーン
- 01コンパイル段階の把握
- 02デコレーターから Ivy 生成までの追跡
- 03テンプレート診断の調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ angular/ angular --skill reference-compiler-cliインストール後、Claude Code で/reference-compiler-cliを入力して読み込まれたか確認します。
詳細
Angular Compiler CLI(ngtsc)のアーキテクチャ
概要
packages/compiler-cli パッケージには、Angular Compiler(Ivy)が含まれており、一般に ngtsc と呼ばれています。これは TypeScript コンパイラー(tsc)をラップし、Angular 固有の機能を拡張するものです。
ngtsc の主な目的は、Angular デコレーター(@Component、@Directive、@Pipe など)を、クラス上の静的プロパティ(Ivy 命令、例:static ɵcmp = ...)にコンパイルすることです。また、テンプレートの型チェックと事前(AOT)コンパイルも行います。
メンタルモデル
このコンパイラーは、遅延型、インクリメンタル、部分的なコンパイルパイプラインとして設計されています。
- ラッパーパターン:
NgtscProgramは標準のts.Programをラップします。標準のツールをそのまま置き換えられるよう、呼び出しをインターセプトします。 - Trait システム:Angular デコレーターを持つすべてのクラスは「Trait」として扱われます。コンパイラーは、次の状態を持つステートマシンでこれらの Trait を管理します。
- Pending:検出済みですが、未処理です。
- Analyzed:メタデータが抽出され、テンプレートが解析されています(ただし、依存関係はまだリンクされていません)。
- Resolved:依存関係(テンプレート内のディレクティブ/パイプ)が解決され、インポートの循環が処理されています。
- Skipped:Angular クラスではありません。
- 遅延分析:分析は必要な場合にのみ行われます(診断が要求されたときや、出力の準備が行われるときなど)。
- 出力 AST:コンパイラーは、生成コード用の中間的な「出力 AST」(
o.Expression)を生成します。出力フェーズでは、これが TypeScript AST ノードに変換されます。
主なサブシステム
1. コアのオーケストレーション(ngtsc/core)
NgtscProgram:api.Programを実装する公開 API です。ts.ProgramとNgCompilerを管理します。NgCompiler:コンパイラーの中核です。コンパイルフェーズ(分析、解決、型チェック、出力)を統括します。TraitCompilerを保持します。
2. Trait のコンパイル(ngtsc/transform)
TraitCompiler:「Trait」のライフサイクルを管理します。ソースファイルを反復処理し、デコレーター付きクラスを識別して、適切なDecoratorHandlerに処理を委譲します。Trait:クラスの状態を保持するコンテナーで、ハンドラー、分析結果、解決結果を格納します。
3. デコレーターのハンドラー(ngtsc/annotations)
DecoratorHandler:特定のデコレーターを処理するためのインターフェースです。ComponentDecoratorHandler:最も複雑なハンドラーです。次の処理を行います。- メタデータ(セレクター、入力、出力)を抽出します。
- テンプレートを解析します。
- 使用されているディレクティブとパイプを解決します(
R3TargetBinder)。 ɵcmp命令を生成します。
DirectiveDecoratorHandler、PipeDecoratorHandler、NgModuleDecoratorHandler:それぞれ対応するデコレーターを処理します。
4. テンプレートの型チェック(ngtsc/typecheck)
TemplateTypeChecker:「型チェックブロック」(TCB)を生成します。TCB は、tscが理解してエラーをチェックできる形式でテンプレートのロジックを表す TypeScript コードのブロックです。generateTypeCheckBlock(@angular/compilerから提供され、TypeCheckFileとInlineTcbOpから呼び出されます):テンプレートのバインディング、イベント、ディレクティブの使用、ホストバインディングをチェックするための TypeScript ソースを生成します。
5. メタデータとスコープ(ngtsc/metadata、ngtsc/scope)
MetadataReader:ソースファイル(LocalMetadataRegistryを使用)および.d.tsファイル(DtsMetadataReaderを使用)から Angular メタデータを読み取ります。ComponentScopeReader:NgModuleの推移的なエクスポートとスタンドアロンコンポーネントのインポートを処理し、コンポーネントの「コンパイルスコープ」(そのコンポーネントで使用できるディレクティブ/パイプ)を特定します。
6. 出力と変換(ngtsc/transform)
ivyTransformFactory:TypeScript トランスフォーマーファクトリーです。IvyCompilationVisitor:クラスを訪問し、TraitCompilerを介してコンパイルを実行し、出力 AST を収集します。IvyTransformationVisitor:出力 AST を TypeScript AST に変換し、static ɵ...フィールドを挿入して、元のデコレーターを削除します。
コンパイルのフェーズ
- 構築:
NgtscProgramがNgCompilerを作成し、すべてのレジストリとTraitCompilerを初期化します。 - 解析(
analyzeSync):TraitCompilerがファイルをスキャンします。DecoratorHandlerがメタデータを抽出し、テンプレートを解析します。- ここではファイル間の解決は行われません(並列処理とキャッシュを可能にするためです)。
- 解決(
resolve):TraitCompilerがトレイトを解決します。- コンポーネントはテンプレートを特定のディレクティブとパイプにリンクします(
ComponentScopeReaderを通じて検出します)。 - インポートの循環依存を検出して処理します(「リモートスコーピング」など)。
- 型チェック:
TemplateTypeCheckerがすべてのコンポーネントの TCB を作成します。- これらの TCB に関する TypeScript の診断情報を取得します。
- 出力(
prepareEmit):ivyTransformFactoryを作成します。- TS の
emitを呼び出します。 - トランスフォーマーが実行され、コンパイルされた Ivy 命令を JS/DTS 出力に挿入します。
重要なファイルの場所
packages/compiler-cli/src/ngtsc/program.ts:エントリーポイント(NgtscProgram)。packages/compiler-cli/src/ngtsc/core/src/compiler.ts:コアロジック(NgCompiler)。packages/compiler-cli/src/ngtsc/transform/src/trait.ts:トレイトの状態機械。packages/compiler-cli/src/ngtsc/annotations/component/src/handler.ts:コンポーネントのコンパイルロジック。packages/compiler-cli/src/ngtsc/typecheck/src/checker.ts:型チェックのロジック(TemplateTypeCheckerImpl)。packages/compiler-cli/src/ngtsc/transform/src/transform.ts:AST 変換ロジック。
コメント
Markdown 対応