マーリンアームズ サポート   翻訳   コンサル   講座   アプリ   コラム
JavaScript講座     辞書サイト

Node.jsデザインパターン 第2版    Mario Casciaro + Luciano Mammino著    武舎広幸+阿部和也訳

目次

本書の構成

1章 Node.jsの世界へようこそ
Node.jsのアプリケーション設計の入り口となるこの章では、Nodeのコアモジュールに見られる、文字どおりコアとなるパターンを紹介します。また、Nodeのエコシステムや、基礎となる「哲学」も紹介します。
2章 Node.jsの基本パターン
Nodeの非同期プログラミングの土台となる3つのパターン、すなわちコールバック、モジュール、そしてEventEmitterObserverオブザーバパターン)について説明します。
3章 コールバックを用いた非同期パターン
非同期処理を効率的に記述するためのパターンをいくつか紹介します。いわゆる「コールバック地獄」を回避するための方法を、のJavaScriptの場合(ライブラリをいっさい使用しない場合)とasyncというライブラリを使用した場合との両方の例をあげて解説します。
4章 ES2015以降の機能を使った非同期パターン
3章で紹介したパターンを、ES2015やそれ以降の標準で導入された非同期処理のための機構であるプロミスやジェネレータ、そしてasync/awaitを使って書き直したものを説明します。
5章 ストリーム
Nodeの重要な概念としてストリームがあげられます。この章ではストリームを使ったデータ処理と、複数のストリームを組み合わせる方法を紹介します。
6章 オブジェクト指向デザインパターンのNode.jsへの適用
従来からあるデザインパターンがNodeに適用可能かどうかを検討するため、オブジェクト指向プログラミングの世界でよく知られているデザインパターンを、Nodeでの再現を試みます◆→変。OK?←◆。また、JavaScriptとNodeに固有のパターンについても紹介します。
7章 モジュールの接続
アプリケーションを構成するモジュール間の依存関係をどう解決するかというのは開発者を悩ませる問題です。この章ではそういった問題に取り組むべく、依存性注入(DI)やサービスロケータといったいくつかのパターンについて学びます。
8章 ユニバーサルJavaScript
Nodeを使ったウェブアプリケーション開発においてもっとも興味深いトピックが「ユニバーサルJavaScript」すなわちクライアントとサーバ間で同じコードを共有する手法です。この章では、React、WebpackおよびBabelを使って簡単なウェブアプリケーションを開発することで、ユニバーサルJavaScriptの基本原則について学びます。
9章 特殊な問題を解決するためのパターン
これまでに見てきたパターンは一般的な問題を解決するためのものでしたが、この章ではより特殊な問題を解決するためのパターンをいくつか紹介します。
10章 スケーラビリティとアーキテクチャ
Nodeアプリケーションをスケーラブルにする手法について、いくつかのパターンを紹介します。
11章 メッセージ通信と統合
ZMQ(ØMQ)やAMQPといったメッセージングミドルウェアを使って分散システムを構築する際に、適用可能なパターンを紹介します。
付録A ES2015以降のJavaScriptの新機能
この本のサンプルコードの全体を通じて使用されているECMAScript 2015(ES2015)の主要な機能を説明します。

目次(詳細)

まえがき

1章 Node.jsの世界へようこそ
    1.1 Node.jsの「哲学」
        1.1.1 小さなコア
        1.1.2 小さなモジュール
        1.1.3 露出部分最小化
        1.1.4 単純さと実用主義
    1.2 リアクタパターン
        1.2.1 入出力は遅い
        1.2.2 入出力のブロック
        1.2.3 ノンブロッキングI/O
        1.2.4 イベント多重分離
        1.2.5 リアクタパターン
        1.2.6 libuv
        1.2.7 Node.jsのアーキテクチャ
    1.3 まとめ

2章 Node.jsの基本パターン
    2.1 コールバックパターン
        2.1.1 継続渡しスタイル(continuation-passing style:CPS)
        2.1.2 同期処理か非同期処理か
        2.1.3 Node.jsのコールバック
    2.2 モジュールシステムとパターン
        2.2.1 公開モジュールパターン
        2.2.2 Node.jsモジュールシステムの詳細
        2.2.3 モジュール定義におけるパターン
    2.3 オブザーバパターン
        2.3.1 EventEmitterクラス
        2.3.2 EventEmitterの使用例
        2.3.3 エラーの伝播
        2.3.4 EventEmitterクラスの拡張
        2.3.5 同期イベントと非同期イベント
        2.3.6 コールバックとの使い分け
        2.3.7 コールバックとEventEmitterの組み合わせ
    2.4 まとめ

3章 コールバックを用いた非同期パターン
    3.1 非同期プログラミングの難しさ
        3.1.1 ウェブスパイダーを作って学ぶ非同期プログラミング
        3.1.2 コールバック地獄
    3.2 非同期パターン(素のJavaScript編)
        3.2.1 基本原則
        3.2.2 基本原則の適用
        3.2.3 逐次処理
        3.2.4 並行処理
        3.2.5 同時実行数を制限した並行処理パターン
    3.3 非同期パターン(asyncライブラリ編)
        3.3.1 逐次処理
        3.3.2 並行処理
        3.3.3 同時実行数を制限した並行処理パターン
    3.4 まとめ

4章 ES2015以降の機能を使った非同期パターン
    4.1 プロミス
        4.1.1 プロミスの基礎
        4.1.2 プロミスの実装
        4.1.3 Node.jsのAPIをプロミス化する
        4.1.4 逐次処理
        4.1.5 並行処理
        4.1.6 同時実行数を制限した並行処理パターン
        4.1.7 コールバックとプロミスの両方をサポートするAPI
    4.2 ジェネレータ
        4.2.1 ジェネレータの基礎
        4.2.2 ジェネレータを使った非同期制御フロー
        4.2.3 逐次処理
        4.2.4 並行処理
        4.2.5 同時実行数を制限した並行処理パターン
    4.3 async/await
    4.4 非同期プログラミングの手法の比較
    4.5 まとめ

5章 ストリーム
    5.1 ストリームの重要性
        5.1.1 バッファvs.ストリーム
        5.1.2 領域的な効率
        5.1.3 時間的な効率
        5.1.4 コンポーザビリティ
    5.2 ストリームの基本的な使い方
        5.2.1 ストリームの詳細
        5.2.2 Readableストリーム
        5.2.3 Writableストリーム
        5.2.4 Duplexストリーム
        5.2.5 Transformストリーム
        5.2.6 パイプを使ったストリームの接続
    5.3 非同期プログラミングにおけるストリームの活用
        5.3.1 逐次実行
        5.3.2 順序なしの並行実行
        5.3.3 順序なしの制限付き並行実行
    5.4 パイプ処理パターン
        5.4.1 Combinedストリーム
        5.4.2 ストリームのフォーク
        5.4.3 ストリームのマージ
        5.4.4 マルチプレクシングとデマルチプレクシング
    5.5 まとめ

6章 オブジェクト指向デザインパターンのNode.jsへの適用
    6.1 ファクトリ
        6.1.1 オブジェクト生成の一般的インタフェース
        6.1.2 カプセル化強化の仕組み
        6.1.3 単純なコードプロファイラの作成
        6.1.4 合成可能ファクトリ関数
        6.1.5 実践での利用
    6.2 公開コンストラクタ
        6.2.1 読み出し専用イベントエミッタ
        6.2.2 実践での利用

    6.3 プロキシ
        6.3.1 プロキシ実装の手法
        6.3.2 異なる技法の比較
        6.3.3 ログ付きの出力ストリームの作成
        6.3.4 現場でのプロキシ.関数フッキングとAOP
        6.3.5 ES2015のプロキシ
        6.3.6 実践での利用
    6.4 デコレータ
        6.4.1 デコレータの実装
        6.4.2 データベースLevelUPへのデコレータ使用
        6.4.3 実践での利用
    6.5 アダプタ
        6.5.1 ファイルシステムAPIによるLevelUPの利用
        6.5.2 実践での利用
    6.6 ストラテジー
        6.6.1 マルチフォーマットの設定用オブジェクト
        6.6.2 実践での利用
    6.7 ステート
        6.7.1 基本的なフェイルセーフソケットの実装
    6.8 テンプレート
        6.8.1 設定管理用テンプレート
        6.8.2 実践での利用
    6.9 ミドルウェア
        6.9.1 Expressにおけるミドルウェア
        6.9.2 パターンとしてのミドルウェア
        6.9.3 OMQ用のミドルウェアフレームワークの作成
        6.9.4 Koaのジェネレータを使用したミドルウェア
    6.10 コマンド
        6.10.1 柔軟なパターン
    6.11 まとめ

7章 モジュールの接続
    7.1 モジュールと依存関係
        7.1.1 Node.jsにおけるもっとも一般的な依存関係
        7.1.2 凝集度と結合度
        7.1.3 ステートをもつモジュール
    7.2 モジュール接続のためのパターン
        7.2.1 依存関係のハードコーディング
        7.2.2 依存性注入
        7.2.3 サービスロケータ

        7.2.4 DIコンテナ
    7.3 プラグインの接続
        7.3.1 パッケージとしてのプラグイン
        7.3.2 拡張ポイント
        7.3.3 拡張機能のプラグイン側制御とアプリケーション側制御
        7.3.4 ログアウトプラグインの実装
    7.4 まとめ

8章 ユニバーサルJavaScript
    8.1 ブラウザとのコード共有
        8.1.1 モジュールの共有
    8.2 Webpackの導入
        8.2.1 Webpackの魔法を探る
        8.2.2 Webpackを使う利点
        8.2.3 ES2015をWebpackとともに使用
    8.3 クロスプラットフォーム開発の基礎
        8.3.1 実行時のコード分岐
        8.3.2 ビルド時のコード分岐
        8.3.3 モジュールの置換
        8.3.4 クロスプラットフォーム開発向けのデザインパターン
    8.4 Reactの紹介
        8.4.1 最初のReactコンポーネント
        8.4.2 JSXとは
        8.4.3 JSXトランスパイルを実行させるWebpack設定
        8.4.4 ブラウザでの描画
        8.4.5 ライブラリReact Router
    8.5 ユニバーサルJavaScriptアプリケーションの作成
        8.5.1 再利用可能なコンポーネントの作成
        8.5.2 サーバ側でのレンダリング
        8.5.3 ユニバーサルレンダリングとルーティング
        8.5.4 ユニバーサルなデータ取得
    8.6 まとめ

9章 特殊な問題を解決するためのパターン
    9.1 非同期に初期化されるモジュールのrequire
        9.1.1 標準的なソリューション
        9.1.2 初期化前キュー
        9.1.3 実践での利用
    9.2 非同期のバッチ処理とキャッシュの利用
        9.2.1 キャッシュ処理もバッチ処理もないサーバの実装
        9.2.2 非同期リクエストのバッチ処理
        9.2.3 非同期リクエストのキャッシュ処理
        9.2.4 プロミスを使ったバッチ処理とキャッシュ処理
    9.3 CPUバウンドなタスクの実行
        9.3.1 部分和問題の解法
        9.3.2 setImmediateによるインタリーブ
        9.3.3 マルチプロセス
    9.4 まとめ

10章 スケーラビリティとアーキテクチャ
    10.1 アプリケーションスケーリング入門
        10.1.1 Node.jsアプリケーションのスケーリング
        10.1.2 スケーラビリティの3つの次元
    10.2 クローニングと負荷分散
        10.2.1 モジュールcluster
        10.2.2 ステートのある接続の処理
        10.2.3 リバースプロキシによるスケーリング
        10.2.4 サービスレジストリの利用
        10.2.5 ピアツーピア負荷分散
    10.3 複雑なアプリケーションの分解
        10.3.1 モノリシックなアーキテクチャ
        10.3.2 マイクロサービスのアーキテクチャ
        10.3.3 マイクロサービスアーキテクチャにおける統合パターン
    10.4 まとめ

11章 メッセージ通信と統合
    11.1 メッセージ通信システムの基礎
        11.1.1 一方向パターンとリクエスト/リプライ・パターン
        11.1.2 メッセージの種類
        11.1.3 非同期メッセージ送信とキュー
        11.1.4 ピアツーピアメッセージ通信とブローカを使ったメッセージ通信
    11.2 パブリッシュ/サブスクライブ(pub/sub)パターン
        11.2.1 機能最小限のリアルタイムチャットアプリケーションの作成
        11.2.2 メッセージブローカとしてのRedisの使用
        11.2.3 OMQを使ったピアツーピア型パブリッシュ/サブスクライブ
        11.2.4 永続サブスクライバ
    11.3 パイプラインとタスク分散パターン
        11.3.1 OMQのファンアウト/ファンイン・パターン
        11.3.2 パイプラインとAMQPの競合コンシューマ
    11.4 リクエスト/リプライ・パターン
        11.4.1 相関識別子
        11.4.2 返信先アドレス
    11.5 まとめ

付録A ES2015以降のJavaScriptの主要機能
    A.1 letとconst
    A.2 アロー関数
    A.3 class構文
    A.4 オブジェクトリテラルの改善
    A.5 MapとSet
    A.6 WeakMapとWeakSet
    A.7 テンプレートリテラル
    A.8 その他のES2015の機能

索引

↑ Topへ戻る