Dev Study
← 解説「テンプレートとスタイルの外部ファイル化」に戻る

サンプルコードで身につける: テンプレートとスタイルの外部ファイル化

解説で学んだ概念を、5つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1最小の外部ファイル構成

template と styles を templateUrl / styleUrl に置き換えるだけで、HTMLとCSSが別ファイルに分かれます。tsファイルにはロジックだけが残り、役割ごとにファイルが分かれるのが実務の標準形です。ng generate component で作ると最初からこの形になります。

import { Component } from '@angular/core';

@Component({
  selector: 'app-user-card',
  // 文字列の代わりに、同じフォルダのファイルを相対パスで指す
  templateUrl: './user-card.component.html',
  styleUrl: './user-card.component.css',
})
export class UserCardComponent {
  userName = '田中';
}

// ファイル構成(3点セット):
//   user-card.component.ts   ← ロジック(このファイル)
//   user-card.component.html ← テンプレート
//   user-card.component.css  ← スタイル

2HTMLファイル側の中身

外部ファイルにしたHTMLは、文字列連結やエスケープを気にせず普通のHTMLとして書けます。{{ }} の補間や @if などのテンプレート構文もそのまま使え、エディタの補完やフォーマッタも効きます。テンプレートが数十行に育つ実務では、この読み書きしやすさが効いてきます。

<!-- user-card.component.html -->
<!-- 補間や制御フローなどのテンプレート構文もそのまま書ける -->
<article class="card">
  <h2>{{ userName }}さんのプロフィール</h2>
  @if (isOnline) {
    <p class="status">オンライン</p>
  } @else {
    <p class="status">オフライン</p>
  }
</article>

3CSSファイル側の中身と :host

styleUrl で読み込んだCSSはこのコンポーネントの中だけに適用されるので、.card のような一般的なクラス名でも他の部品と衝突しません。コンポーネント自身のタグ(ここでは app-user-card)にスタイルを当てたいときは :host セレクタを使います。部品の外枠の余白や幅は :host に書くのが定番です。

/* user-card.component.css */

/* :host はコンポーネント自身のタグ(<app-user-card>)を指す */
:host {
  display: block;
  margin-bottom: 16px;
}

/* このファイルのスタイルはこの部品の中だけに効く */
.card {
  border: 1px solid #ddd;
  border-radius: 8px;
  padding: 16px;
}

.status {
  color: seagreen;
}

4インラインと外部ファイルの使い分け

テンプレートが1〜2行で収まる小さな部品ならインラインの template が手軽で、ファイルを行き来せずに全体を見渡せます。行数が増えてきたら外部ファイルへ移すのが目安です。どちらも動きは同じなので、チームの規約や部品の規模に合わせて選びます。

import { Component } from '@angular/core';

// 小さな部品: インラインで完結させると見渡しやすい
@Component({
  selector: 'app-badge',
  template: '<span class="badge">NEW</span>',
  styles: ['.badge { color: crimson; font-weight: bold; }'],
})
export class BadgeComponent {}

// 育ってきた部品: 外部ファイルに分けて整理する
@Component({
  selector: 'app-order-form',
  templateUrl: './order-form.component.html',
  styleUrl: './order-form.component.css',
})
export class OrderFormComponent {}

5複数のスタイルファイルを読み込む

スタイルファイルが複数に分かれているときは、styleUrl の代わりに styleUrls: [...] と配列で指定できます。レイアウト用と配色用でファイルを分ける、共通の部品スタイルを読み込む、といった整理がしたいときに使います。1ファイルで足りるうちは styleUrl のままで十分です。

import { Component } from '@angular/core';

@Component({
  selector: 'app-report',
  templateUrl: './report.component.html',
  // 複数のCSSファイルは styleUrls に配列で並べる
  styleUrls: [
    './report-layout.css', // レイアウト(配置・余白)
    './report-theme.css', // 配色・文字の見た目
  ],
})
export class ReportComponent {}

// どのファイルのスタイルも、この部品の中だけに適用される