angularjs npm tutorial

AngularJS NPM チュートリアルを完了する: 最初のアプリをゼロから構築する

この記事では、npm パッケージ マネージャーを使用して最初の AngularJS アプリケーションを構築する手順を段階的に説明します。詳細な手順とサンプル コードを使用して、AngularJS の基本をマスターし、NPM を使用して依存関係を管理する方法を学びます。

このチュートリアルでは、AngularJS を使用してフル機能のシングルページアプリケーション (SPA) を構築する方法を、一級方程式レース情報アプリケーションを例に、段階的に説明します。AngularJS の核となる概念と実践を学ぶことができます。

1. AngularJS とは?

AngularJS は Google によって開発された JavaScript MVC フレームワークであり、構造化され、テストが容易で、保守しやすいフロントエンドアプリケーションを構築するための簡潔かつ強力な方法を提供します。

2. AngularJS を選択する理由

AngularJS には、最新の Web アプリケーションを構築するための理想的な選択肢となる、以下のような顕著な利点があります。

  • モジュール化開発: コードを再利用可能なモジュールに分割することで、保守性とテスト容易性を向上させます。

  • ディレクティブによる HTML の拡張: ディレクティブを使用して HTML にカスタム機能を追加し、動的なテンプレートを作成できます。

  • 双方向データバインディング: モデルとビュー間のデータを自動的に同期するため、DOM 操作が少なくなります。

  • サーバー通信の簡素化: バックエンド API とのやり取りを簡素化する便利なサービスを提供します。

  • フロントエンドでのビジネスロジック処理: ビジネスロジックをフロントエンドに移行することで、より応答性の高いアプリケーションを構築できます。

3. プロジェクトの目標

今回のプロジェクトでは、F1 レースの最新ランキング、ドライバー情報、レース結果を表示するレース情報アプリケーションを構築します。バックエンド開発を簡素化するために、Ergast が提供する無料のレース API を使用してデータを取得します。

4. 入門チュートリアル

angular-seed プロジェクトを出発点として使用します。これは、事前に設定された AngularJS プロジェクト構造と、Karma ユニットテストフレームワークを含んでいます。

まず、angular-seed リポジトリをクローンします。

git clone https://github.com/angular/angular-seed.git <your-project-name>

次に、プロジェクトの依存関係をインストールします。

cd <your-project-name>
npm install

angular-seed プロジェクトは、Bower を使用してフロントエンドの依存関係を管理します。後の手順で、Bower を使用して angular-route モジュールをインストールします。

5. ドライバーズチャンピオンシップの構築

まず、ドライバーのランキング、名前、チーム、ポイントを表示するドライバーズチャンピオンシップページを構築します。

5.1 drivers.html ビューの作成

app/partials フォルダに drivers.html という名前のファイルを作成し、以下のコードを追加します。

<div ng-app="F1FeederApp" ng-controller="driversController">
  <table>
    <thead>
      <tr><th colspan="4">ドライバーズランキング</th></tr>
    </thead>
    <tbody>
      <tr ng-repeat="driver in driversList">
        <td>{{$index + 1}}</td>
        <td>
          <img src="img/flags/{{driver.Driver.nationality}}.png" />
          {{driver.Driver.givenName}} {{driver.Driver.familyName}}
        </td>
        <td>{{driver.Constructors[0].name}}</td>
        <td>{{driver.points}}</td>
      </tr>
    </tbody>
  </table>
</div>

このコードは、以下の AngularJS の概念を示しています。

  • ng-app ディレクティブ: AngularJS アプリケーションのルート要素をマークします。

  • ng-controller ディレクティブ: ビューの動作とデータを管理するコントローラーを指定します。

  • ng-repeat ディレクティブ: driversList 配列を反復処理し、要素ごとにテーブル行を生成します。

  • 式 {{ ... }}: ビューにデータを表示するために使用されます。

5.2 driversController コントローラーの作成

app/js フォルダに controllers.js という名前のファイルを作成し、以下のコードを追加します。

angular.module('F1FeederApp.controllers', []).
controller('driversController', function($scope) {
  $scope.driversList = [
    // 静的データ...
  ];
});

このコントローラーは、driversList という名前の配列を定義し、それを $scope オブジェクトにアタッチします。$scope はコントローラーとビュー間のブリッジであり、ビューからコントローラーのデータや関数にアクセスできるようにします。

5.3 アプリケーションモジュールの定義

app/js/app.js ファイルで、アプリケーションモジュールを定義し、コントローラーモジュールを含めます。

angular.module('F1FeederApp', [
  'F1FeederApp.controllers'
]);

6. サーバーからデータを読み込む

$http サービスを使用して、Ergast API からドライバーデータを取得します。

6.1 ergastAPIservice サービスの作成

app/js フォルダに services.js という名前のファイルを作成し、以下のコードを追加します。

angular.module('F1FeederApp.services', []).
  factory('ergastAPIservice', function($http) {
    var ergastAPI = {};

    ergastAPI.getDrivers = function() {
      return $http({
        method: 'JSONP',
        url: 'http://ergast.com/api/f1/2013/driverStandings.json?callback=JSON_CALLBACK'
      });
    };

    return ergastAPI;
  });

ergastAPIservice サービスは、getDrivers 関数を提供します。この関数は、$http サービスを使用して Ergast API に JSONP リクエストを送信し、promise オブジェクトを返します。

6.2 コントローラーでサービスを使用する

ergastAPIservice を driversController に注入し、コントローラー内で getDrivers 関数を呼び出してデータを取得します。

angular.module('F1FeederApp.controllers', ['F1FeederApp.services']).
  controller('driversController', function($scope, ergastAPIservice) {
    ergastAPIservice.getDrivers().success(function(response) {
      $scope.driversList = response.MRData.StandingsTable.StandingsLists[0].DriverStandings;
    });
  });

これで、driversController は Ergast API から取得した動的データを使用してビューをレンダリングします。

7. 検索フィルターの追加

特定のドライバーを簡単に見つけられるように、検索フィルターを追加します。

7.1 ビューに検索ボックスを追加する

drivers.html ファイルのテーブルの上に、以下のコードを追加します。

<input type="text" ng-model="nameFilter" placeholder="ドライバーを検索...">

7.2 filter フィルターを使用する

ユーザー入力に基づいてドライバーリストをフィルタリングするために、filter フィルターを使用して ng-repeat ディレクティブを変更します。

<tr ng-repeat="driver in driversList | filter:nameFilter">

これで、ユーザー入力は自動的に nameFilter モデルに反映され、filter フィルターは nameFilter の値に基づいて driversList 配列を動的にフィルタリングします。

8. ルーティングと部分ビューの追加

より複雑なアプリケーションナビゲーションを実現するために、AngularJS のルーティング機能を使用して複数のビューを作成し、部分ビューを使用してテンプレートコードを整理します。

8.1 angular-route モジュールのインストール

Bower を使用して angular-route モジュールをインストールします。

bower install angular-route --save

8.2 ルーティング規則の定義

app.js ファイルで、ngRoute モジュールを含め、ルーティング規則を定義します。

angular.module('F1FeederApp', [
  'F1FeederApp.controllers',
  'F1FeederApp.services',
  'ngRoute'
]).
config(['$routeProvider', function($routeProvider) {
  $routeProvider.
    when('/drivers', {
      templateUrl: 'partials/drivers.html',
      controller: 'driversController'
    }).
    otherwise({
      redirectTo: '/drivers'
    });
}]);

このコードは、/drivers パスを driversController コントローラーと partials/drivers.html テンプレートにマッピングするルーティング規則を定義しています。

8.3 ng-view ディレクティブの使用

index.html ファイルで、ng-view ディレクティブを使用して、部分ビューをレンダリングする場所を指定します。

<!DOCTYPE html>
<html>
<head>
  <title>F1 情報フィード</title>
</head>
<body ng-app="F1FeederApp">
  <div ng-view></div>

  <script src="bower_components/angular/angular.js"></script>
  <script src="bower_components/angular-route/angular-route.js"></script>
  <script src="js/app.js"></script>
  <script src="js/services.js"></script>
  <script src="js/controllers.js"></script>
</body>
</html>

これで、ユーザーが /drivers パスにアクセスすると、drivers.html の内容が ng-view ディレクティブがある場所にレンダリングされます。

9. ドライバー詳細ページの作成

特定のドライバーの詳細情報を表示するために、ドライバー詳細ページを作成します。

9.1 API 関数の追加

ergastAPIservice サービスに、ドライバーの詳細とレース結果を取得するための 2 つの関数を追加します。

ergastAPI.getDriverDetails = function(id) {
  return $http({
    method: 'JSONP',
    url: 'http://ergast.com/api/f1/2013/drivers/' + id + '/driverStandings.json?callback=JSON_CALLBACK'
  });
};

ergastAPI.getDriverRaces = function(id) {
  return $http({
    method: 'JSONP',
    url: 'http://ergast.com/api/f1/2013/drivers/' + id + '/results.json?callback=JSON_CALLBACK'
  });
};

9.2 driverController コントローラーの作成

controllers.js ファイルに、ドライバー詳細ページを管理する driverController という名前のコントローラーを作成します。

angular.module('F1FeederApp.controllers', ['F1FeederApp.services']).
  // ...driversController...
  .controller('driverController', function($scope, $routeParams, ergastAPIservice) {
    $scope.id = $routeParams.id;
    $scope.driver = null;
    $scope.races = [];

    ergastAPIservice.getDriverDetails($scope.id).success(function(response) {
      $scope.driver = response.MRData.StandingsTable.StandingsLists[0].DriverStandings[0];
    });

    ergastAPIservice.getDriverRaces($scope.id).success(function(response) {
      $scope.races = response.MRData.RaceTable.Races;
    });
  });

driverController コントローラーは、$routeParams サービスを使用して URL から渡されたドライバー ID を取得し、ergastAPIservice の関数を呼び出してデータを取得します。

9.3 driver.html 部分ビューの作成

app/partials フォルダに driver.html という名前のファイルを作成し、以下のコードを追加します。

<div ng-show="driver">
  <h2>{{driver.Driver.givenName}} {{driver.Driver.familyName}}</h2>
  <p>国籍: {{driver.Driver.nationality}}</p>
  <p>チーム: {{driver.Constructors[0].name}}</p>
  
  <h3>レース結果</h3>
  <table>
    <thead>
      <tr>
        <th>ラウンド</th>
        <th>グランプリ</th>
        <th>チーム</th>
        <th>予選</th>
        <th>決勝</th>
      </tr>
    </thead>
    <tbody>
      <tr ng-repeat="race in races">
        <td>{{race.round}}</td>
        <td>{{race.raceName}}</td>
        <td>{{race.Results[0].Constructor.name}}</td>
        <td>{{race.Results[0].grid}}</td>
        <td>{{race.Results[0].position}}</td>
      </tr>
    </tbody>
  </table>
</div>

9.4 ルーティング規則の追加

app.js ファイルに、/drivers/:id パスを driverController コントローラーと partials/driver.html テンプレートにマッピングするルーティング規則を追加します。

// ...その他のルーティング規則...
.when('/drivers/:id', {
  templateUrl: 'partials/driver.html',
  controller: 'driverController'
})
// ...その他のルーティング規則...

これで、ユーザーがドライバーの名前をクリックすると、アプリケーションはドライバー詳細ページに移動し、そのドライバーの詳細とレース結果が表示されるようになります。

10. 仕上げ

ユーザーエクスペリエンスを向上させるために、CSS スタイルを追加してページの見た目を良くすることができます。

11. 結論

このチュートリアルでは、AngularJS を使用してシンプルなレース情報アプリケーションを構築する方法を学びました。モジュール、コントローラー、テンプレート、ディレクティブ、サービス、フィルター、ルーティングなど、AngularJS の核となる概念について説明しました。これはほんの始まりに過ぎず、AngularJS には、より複雑で堅牢な Web アプリケーションを構築するのに役立つ、他にも多くの強力な機能があります。

参考資料

よくある質問

Q1: AngularJS はまだ使われていますか?

A1: AngularJS (Angular 1.x) は、2016 年にリリースされた Angular (Angular 2 以降) によって大部分が置き換えられました。しかし、既存の AngularJS アプリケーションは多数あり、AngularJS の知識は依然として役立ちます。

Q2: AngularJS と Angular の違いは何ですか?

A2: Angular は、AngularJS の完全な書き直しであり、TypeScript をベースにしています。コンポーネントベースのアーキテクチャ、モバイルファースト、パフォーマンスの向上など、多くの点で AngularJS とは異なります。

Q3: AngularJS を学ぶべきですか、それとも Angular を学ぶべきですか?

A3: 新しいプロジェクトを開始する場合は、Angular を学ぶことをお勧めします。AngularJS は、既存の AngularJS アプリケーションを保守する場合にのみ必要になります。