msksgm’s blog

msksgm’s blog

Webエンジニアです。日々の勉強記録、技術書感想、美術観賞感想を投稿します。

Node.jsデザインパターン 感想 まとめ

「Node.js デザインパターン 第 2 版」[Mario Casciaro (著), Luciano Mammino (著), 武舎 広幸 (翻訳), 阿部 和也 (翻訳)]を読みました。

感想

デザインパターンに限らず Node.js のコアな部分について解説した本です。
個人開発のフロントエンドとバックエンドの両方に Node.js を使っているので気になって読みました。
著名なデザインパターンの本といえば GoF 本など Java を用いた技術書が多いですが、この本はタイトル通り、Node.js を対象にした本です。

本書で主に解説する事例は

  • Node 流の解決手法
    • Node 特有の問題を解決する、特有のアプローチ、"The Node Way"をまなぶ
  • デザインパターン
  • 設計手法
    • 大規模アプリケーションを Node で開発するのに必要とされる、設計上の基礎知識と原則を説明する

と記述されています。
この通り、デザインパターンのみに焦点を合わせた本ではなく、最初の方は、Node.js の仕組み(v8、バインディング、リアクタパターンなど)の解説、非同期処理の挙動と制御方法などからはじまります。
その後、基本的なデザインパターンの解説をしたあとに、ストリームやモジュールの中身につちえの話や、大規模アプリケーションにおける Node.js のデザインパターンの解説で終わります。

デザインパターンだけでなく、Node.js のコアな部分の理解をしたいという人を対象とした構成となっています。
その分、難易度は非常に高く、当たり前のように使っていてあまり意識しない部分や、いつ使うかわからない知識もあるので後半部分は斜め読みをしながら読み切りました。

章ごとのまとめ

1章 Node.js の世界へようこそ

Node.js の哲学、リアクタパターン、v8、バインディング、node-core などの、Node.js の核心の解説がされます。
公式ドキュメントなどにも書かれていそうな内容ですが、日本語訳されているため一読の価値があります。

2章 Node.js の基本パターン

Node の非同期プログラミングの土台となる、コールバックおよびオブザーバの2つのパターンについての解説です。
それぞれの、基本的な解説と用途についての解説や、モジュールのインポートの順番(node_modules、コアモジュール、./)などについて学ぶことができます。

3章 コールバックを用いた非同期パターン

ES2015 以前の非同期パターン(素の JavaScript、async ライブラリ)についての解説です。
いわゆるコールバック地獄のときの非同期処理の解説になります。

4章 ES2015 以降の機能を使った非同期パターン

ES2015 以降の非同期パターン(Promise、generator、async/await)についての解説です。
それぞれの実装方法と長所と短所について記述されています。

5章 ストリーム

I/O のストリームについての解説です。
ここまでの賞が Node.js のコアな機能の解説になります。

6章 デザインパターン

本書のタイトルのデザインパターンの解説になります。
他の言語にもみられるデザインパターンから、Node.js 独自のパターンも解説されます。
本書では以下が紹介されています。

  • ファクトリ
  • 公開コンストラク
  • プロキシ
  • デコレータ
  • アダプタ
  • ストラテジー
  • ステート
  • テンプレート
  • ミドルウェア
  • コマンド

7章 モジュールの接続

この章では主に、依存関係のハードコーディング、依存性注入、サービスロケータ、依存性注入コンテナなど、依存関係についての説明されています。
Node.js でどのように依存関係を分離するのか、パッケージを用いずに解説されます。

8章 ユニバーサル JavaScript

以下についての解説がされます。
Node.js のフロント部分の関連が多い気がします。

  • ユニバーサルなモジュール定義
  • webpack による、互換性
  • React について

9章 特殊な問題を解決するためのパターン

特殊な問題の対処方法についてです、パフォーマンスなどについて書かれています。

  • 非同期処理に初期化されるモジュールを require する方法
  • 非同期処理にバッチ処理やキャッシングを追加することで、計算量の大きいアプリケーションのパフォーマンスを最小限の手間で大きく向上させる方法
  • CPR バウンドな同期処理の効率をあげるための手法

10章 スケーラビリティとアーキテクチャ

スケーラビリティについての解説です。

  • スケールキューブとはなにか
  • 同じアプリケーションの複数のインスタンスを実行することによるスケーリング
  • アプリケーションのスケーリングにおけるロードバランサの利用法
  • サービスレジストリとその使用法
  • モノリシックなアプリケーションから生まれるマイクロサービスアーキテクチャのデザイン
  • 単純なアーキテクチャ的なパターンを利用した多数のサービスの統合

11章 メッセージ通信と統合

メッセージ通信システムや Pub/Sub パターンについての解説です。

分散アプリケーションを統合する主な手法は2つ。

  1. 共有ストレージを中央の調整期兼全情報の保持きとして使う
  2. メッセージを使ってデータ、イベント、コマンドをシステムの各ノードにいきわたらせる

  3. メッセージ通信システムの基本

  4. パブリッシュ/サブスクライブ(pub/sub)パターン
  5. パイプラインとタスク分散のパターン
  6. リクエスト/リプライ・パターン

まとめ

コールバックや非同期処理の解説、デザインパターン、ニッチな問題への対処方法など、Node.js の特徴を抑えたデザインパターン本となっています。
Node.js のオープンソースや大規模なアプリを作成するときに役立つ知識が多く含まれていると思います。
難易度が高く、デザインパターンもいきなりできるようになるものではないので、読むタイミングは遅くていい本だと思いました。