📐

Angular v20 "スタイルガイド" の変更点まとめ

に公開

2025年5月にリリースされた Angular v20 には派手な新機能はありませんでしたが、実はスタイルガイドが大きく更新されました。

この記事では、スタイルガイドに注目して v19 からの変更点を見ていきたいと思います!

どう変わったかの概要

v19 では「Style 01-01」のようにナンバリングがされていましたが、v20 では普通のセクション分けでの記述に変わりました。

また、Angular 固有のものではない、プログラミング・TypeScript のベストプラクティスは、ガイドから削除されています。
(TypeScript に関しては、Google TypeScript Style Guide を見るようにリンクが追加されています。)

その他、古かったガイドや、冗長なガイドなどもなくなり、かなりスッキリした印象です。

更新について

v19 と v20 のスタイルガイドを比較して、ざっと、
変わらないもの・変わったもの・追加されたもの・削除されたもの
に分けてみました。

※ 厳密に同じ意味ではなくてもほぼ同じであれば 変わらないもの としている部分もあります🙇

変わらないガイド

変わらないのでサラッと流します

  • ブートストラップコードは src 直下の main.ts にしてください
  • アプリケーションのコードは src フォルダ内に含めてください
  • componentsdirectices, services のようなフォルダにまとめるのではなく、機能別にフォルダを分けてください
  • 関連するファイルはフォルダに分けましょう
  • ファイル名の単語は dash-case にしてください
  • テストファイル名は .spec.ts で終わってください
  • TypeScript のクラス名とファイル名は対応させてください
  • TypeScript、テンプレート、スタイルのファイル名は同じ名前にしてください
  • @Componentselector は dash-case にしてください[1]
    • 接頭語を使うことを推奨しています(ng 以外で)
  • @Outputoutput のイベント名で、すでに定義されているものや on prefix はつけないでください[1:1]
  • @Directiveselector は lowerCamelCase にしてください
  • @Pipename は lowerCamelCase を、クラス名には name を UpperCamelCase にして Pipe の接尾語をつけてください[1:2]
  • ライフサイクル型(ngOnInit など)を implements で使ってください
  • テンプレート内に過度に複雑なロジックを書くのは避けてください
  • コンポーネント、ディレクティブの中身は表示に関連するものに重点をおいてください

変更になったガイド

v19 と v20 で違いがあったガイドです

コンポーネントで属性セレクタを使う場合

具体的には以下のようなとき

v20 で挙げられていた例
// https://angular.dev/guide/components/selectors#when-to-use-an-attribute-selector
@Component({
  selector: 'button[yt-upload]',
   ...
})
export class YouTubeUploadButton { }

v19

Consider:コンポーネントは属性セレクタではなくタグ名で使ってください

v19 の例 では Avoid(避けましょう)となっています

v19 では Avoid の例として紹介
// https://v19.angular.dev/style-guide#example-16
/* avoid */
@Component({
  selector: '[toHeroButton]',
  templateUrl: './hero-button.component.html',
})
export class HeroButtonComponent {}

v20

属性セレクタ名を使う場合はハイフン区切りにしてください

「属性セレクタではなく」という表記はなくなり、「使う場合は」に変わっていることから、使うことを避ける必要はなくなっていそうでした。
aria-label の有効活用もできる と書いてあることからも、ネガティブな表現ではなくなったと捉えて良さそうです。

ただ、命名規則がもともと Directive に似せた lowerCamelCase だったのが、dash-case にするよう明記されました。

プロパティの記述場所

プロパティの記述場所に関して少しだけ変更がありました。

v19

Consider:@Input, @Output は同じところにまとめるとよいです

v20

Angular 特有のプロパティ(inject, input, output など)は関数定義の前に持ってきてください

対象が、@Input, @Output だけから「Angular 特有のプロパティ」に変更され、まとめるとよい という表記から「関数定義の前に」と場所も含めて明記されました

特有のプロパティなので、@Input@Output だけでなく signal 系の input computed なども対象になると思われます。

【大きな変更】 接尾語に関する話

v19

Do:ファイル名のタイプは . で区切ってください
Do: .component,.service などの慣例的な名前を使用してください
Do:接尾語 Component, Service などをつけてください(ファイル名と同じく)
Do:接尾語には Service をつけてください

v20
削除

コンポーネントには Component .component.ts をつけましょう
サービスには Service .service.ts をつけましょう

というところがごっそりなくなっています。

スタイルガイドから無くなっているだけでなく、ng generate で作成されるコンポーネントやサービス、ディレクティブからも接尾語が無くなっていることから、ガイドの変更と捉えて良さそうです。

ただ、この変更は賛否両論があり、ng generate pipe でのパイプの作成でもまだ接尾語がつく(ng cli v20.1.4) 状況なので、もしかすると今後変わる可能性もあるのかなと思っています 🤔

@Componenthost プロパティ

v19

Consider:host プロパティよりも @HostBinding 等を使ってください

v20
削除

これまでは、@HostBinding を使うことが推奨されていましたが、
シグナル変数では @HostBinding が使えないことから、逆に host プロパティの方を推奨とするように変更されました

参照:Host elements • Angular

host プロパティの型補完も最近で改善されており、昔よりも使い勝手は良くなっていると感じます😄

追加されたガイド

v20 で新たに追加されたガイドです

Angular とはあまり関係ないけどコーディングのガイドライン的なもの

1ファイルには1つのコンセプトにしてください
イベントハンドラの関数名は機能を表すようにしてください(handleClick() ではなく saveUserData() みたいに)
ライフサイクルメソッド(ngOnInit など)の中身は簡潔にしてください(細かい実装は関数に抽出してください)

inject 関数について明記

コンストラクタでのインジェクションより inject 関数を使いましょう

v14 から追加された inject 関数を使うように明記されました

インラインでのクラス・スタイル指定方法について

ngClass, ngStyle よりも class.xxx などを使ってください

読みやすさやパフォーマンスの観点から、個別に指定するほうが良いと追加されました

アクセス修飾子について

・テンプレートからしか使われない変数は protected をつけてください
input, model, output には readonly をつけてください

削除されたガイド

v19 で記述があったものの、v20 ではなくなっていたガイドです

プログラミング全般のベストプラクティスだったもの

Do:データ操作などはサービスにまとめましょう
Consider:コードは400行以内にしましょう
Do:ファイル名は一貫した名前を使用してください
Do:クラス名には一貫した名前を使用してください
Do:サービス名には一貫した名前を使用してください
Do:テンプレート・スタイルが3行より多い場合は別ファイルに分けてください

TypeScript(JS) のスタイルガイドに関係するもの

Do:クラス名にはキャメルケースを使用してください

古くなっていたもの

Do:inputs, outputs は使わずに @Input 等を使ってください

冗長だったもの

Consider:ts に付随のファイル css 等 がある場合はフォルダーを作るとよいです
Do:遅延ロードに関連するファイルは、まとめてフォルダに含めてください

別で「関連するファイルはフォルダに分けましょう」というガイドもあり、そのガイドに含まれていると考えていいと思います

その他

サービス系

Do:サービスはシングルトンとして使ってください
Do:providedIn: 'root' を使いましょう
Do:@Injectable() を使いましょう

@Component での templateUrl, styleUrl などの話

Do:相対パスで使用してください

その他

Avoid:input,output にエイリアスを設定することは避けてください
Do:テンプレートのないロジックがある場合は Directive にしてください

まとめ

Angular のスタイルガイドに注目して、v20 での変更点を見てきました。

Angular のスタイルガイドは、コーディング中に迷ったときの指標となるようなガイドも多く、チームでの合意を取るためにも役立つものとなっています。

Angular 使っているけどまだ読んだことないよ、という方はぜひ一度スタイルガイドを読んでみることをオススメします!

参考・リンク

脚注
  1. スタイルガイドからは記載がなくなっていますが、それぞれのドキュメントページに記述が移動した形になります ↩︎ ↩︎ ↩︎

jig.jp Engineers' Blog

Discussion