SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

次世代Webアプリケーションフレームワーク「Angular」の活用

半年ごとに更新を重ねる「Angular」バージョン10・11の新機能をチェック

次世代Webアプリケーションフレームワーク「Angular」の活用 第24回

  • X ポスト
  • このエントリーをはてなブックマークに追加

Angular 11の新機能

 以下では、Angular 11で導入された主な新機能を紹介していきます。

Webフォントのインライン展開

 Webフォントを利用すると、図4のように、インターネット上に公開されたフォントを参照してWebページ内の文字に設定できます。

図4:Webフォントを利用するサンプル(p003-inline-font)
図4:Webフォントを利用するサンプル(p003-inline-font)

 図4のサンプルでは、index.htmlでリスト6の通りWebフォントを参照しています。

[リスト6]Webフォントを参照する記述(p003-inline-font/src/index.html)
<link href="https://fonts.googleapis.com/css2?family=Nerko+One&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Sawarabi+Mincho" rel="stylesheet">

 Angular 11では、Webフォントの表示速度を向上するため、「ng build --prod」コマンドで本番用のビルドを行うと、リスト6の記述を図5の通りインライン展開します。

図5:Angular 11がインライン展開したWebフォント指定(p003-inline-font)
図5:Angular 11がインライン展開したWebフォント指定(p003-inline-font)

 インライン展開の有無は、angular.jsonの「optimization」オプションで、リスト7の通り設定できます。フォントのほかにJavaScriptとCSSの最適化も併せて設定できます。プロジェクト生成時のデフォルト設定は(1)で、すべての最適化が有効になっています。

[リスト7]ビルド時に最適化を行う設定(p003-inline-font/angular.json)
// スクリプト、CSS、フォントの最適化を一括で設定する場合 ...(1)
"optimization": true,
// スクリプト、CSS、フォントの最適化を個別に設定する場合 ...(2)
"optimization": {
  "scripts": true,
  "styles": true,
  "fonts": true
},

Component Test Harnessの対応範囲拡大

 Component Test Harnessは、単体テストの記述時に、HTMLの記述や構造変更の影響を受けずにAngular Materialのコンポーネントを操作できる「ハーネス」を提供する仕組みで、Angular 9から導入されました。Angular 11では、すべてのAngular MaterialコンポーネントでComponent Test Harnessが利用できるようになりました。

 ここではComponent Test Harnessの利用方法を、図6のサンプルで説明します。メーカーのボタンをクリックすると、そのメーカーのスマートフォン名を画面に表示します。

図6:Component Test Harnessを利用するサンプル(p004-test-harness)
図6:Component Test Harnessを利用するサンプル(p004-test-harness)

 「ng test」コマンドで単体テストを実行すると、Chromeブラウザーが起動してテストが実行され、図7の通り表示されます。ここでは「iPhone12」の名称が誤り(「iPhone」の次にスペースが必要)のため、Appleボタン押下時のテストがエラーになります。

図7:単体テストの実行結果(p004-test-harness)
図7:単体テストの実行結果(p004-test-harness)

 図7の単体テスト記述は、リスト8の通りです。

[リスト8]AppComponentの単体テスト(p004-test-harness/src/app/app.component.spec.ts)
describe('AppComponent', () => {
  let component: AppComponent;  // テスト対象のコンポーネント
  let loader: HarnessLoader;    // ハーネスのローダー ...(1)

  beforeEach(async () => {
(略)
    // fixtureから、テストするコンポーネントを生成
    let fixture = TestBed.createComponent(AppComponent);
    component = fixture.componentInstance;
    // fixtureから、ハーネスのローダーを生成 ...(2)
    loader = TestbedHarnessEnvironment.loader(fixture);
  });

  // Appleボタンクリック時 ...(3)
  it('Apple button clicked', async() => {
    // phoneの初期値は空文字
    expect(component.phone).toBe('');
    // コンポーネント内の最初のMatButtonに対するハーネスを取得 ...(4)
    const firstButton
      = await loader.getHarness(MatButtonHarness);
    // ボタンをクリック ...(5)
    await firstButton.click();
    // phoneの内容を確認
    expect(component.phone).toBe('iPhone 12');
  });
(略)
});

 (1)はハーネスを取得するためのローダーです。ローダーはAppComponentに対応するfixtureをもとに、(2)のloaderメソッドで生成します。単体テストの処理(3)では、(4)のloader.getHarnessメソッドに、Angular Materialコンポーネントのハーネスクラス(ここではMatButtonに対応するMatButtonHarness)を渡してハーネスを生成します。生成したハーネスには、対象のAngular Materialコンポーネントを操作できるメソッドが定義されており、ここでは(5)のclickメソッドでボタンをクリックしています。

 なお、リスト8(4)ではAppComponent内の最初のボタンに対するハーネスを取得していますが、リスト9の通り、さまざまな指定方法でハーネスを取得できます。詳細はサンプルコードを参照してください。

[リスト9]ハーネスを取得するさまざまな指定方法(p004-test-harness/src/app/app.component.spec.ts)
// コンポーネント中のすべてのMatButtonに対するハーネスを取得
const buttons
  = await loader.getAllHarnesses(MatButtonHarness);
----
// コンポーネント内で、テキストが「SHARP」のボタンに対するハーネスを取得
const sharpButton
  = await loader.getHarness(MatButtonHarness.with({ text: 'SHARP' }));
----
// コンポーネント内で、IDが「btn-sony」のボタンに対するハーネスを取得
const sonyButton
  = await loader.getHarness(MatButtonHarness.with({ selector: '#btn-sony' }));

開発効率をアップするHot Module Replacement

 「ng serve」で実行されるAngularの開発用Webサーバーでは、ソースコードを変更するとブラウザーがリロードされて変更が反映されますが、このときにフォームの入力内容などの画面状態が消えてしまいます。

 Angularでは、画面状態を保持しつつモジュールを動的に変更するHot Module Replacement(HMR)が従来から利用できましたが、利用には設定やコードを変更する必要がありました。Angular 11では、「ng serve --hmr」を実行することで、設定やコードを変更することなくHMRを有効にできます。

 図8は、入力された名前をもとにあいさつ文を表示するサンプルです。HMRを利用しない場合、コードの「こんにちは」を「こんばんは」に変更すると、入力された名前が消えてしまいますが、HMR利用時は、入力された名前を維持しつつ、コードの変更がWebページに反映されます。

図8:Hot Module Replacementの動作(p005-hmr)
図8:Hot Module Replacementの動作(p005-hmr)

TSLintからESLintへ

 Angularでは、Lint(ソースコードの形式チェック)を行うのにTSLintを利用していました。しかし、TSLintは開発者によって非推奨とされ、ESLintへ移行するように案内されています。

 これを受けてAngular 11ではTSLintが非推奨になり、ESLintへ移行する方法が提供されています。リスト10のサンプルで移行例を説明します。このコードは(1)〜(3)の箇所でLintのエラーが表示されます。

[リスト10]Lintエラーになる実装(p006a-tslint/src/app/app.component.ts)
lintErrorFunc(): void {
  // ★文字列は「"」ではなく「'」を利用するべき ...(1)
  // ★letでなくconstを利用するべき ...(2)
  let greet = "ご挨拶申し上げます";
  // ★行末のセミコロンがない ...(3)
  console.log(greet)
}

 リスト10のコードに対して「ng lint」でLintを実行すると、TSLintでチェックが行われてエラーが表示されますが、TSLintが非推奨であるメッセージも表示されます。

図9:TSLintによるソースコードチェック結果(p006a-tslint)
図9:TSLintによるソースコードチェック結果(p006a-tslint)

 このプロジェクトをESLintに移行するには、リスト11のコマンドを実行します。(1)で移行の処理を行うSchematicsをインストールして、(2)でそれを実行します。コマンドの最後に指定している「p006-eslint」は、移行するプロジェクト名です。

[リスト11]プロジェクトをESLintに移行するコマンド(p006-eslint)
ng add @angular-eslint/schematics #...(1)
ng g @angular-eslint/schematics:convert-tslint-to-eslint p006-eslint # ...(2)

 移行後に「ng lint」でLintを実行すると、図10の通りESLintでチェックが行われます。

図10:ESLintによるソースコードチェック結果(p006-eslint)
図10:ESLintによるソースコードチェック結果(p006-eslint)

次のページ
Angular 10と11で行われたそのほかの変更

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
次世代Webアプリケーションフレームワーク「Angular」の活用連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト  吉川 英一(ヨシカワ エイイチ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/13349 2020/12/23 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング