ハンズオンNode.js
オライリー・ジャパン
著者:今村謙士
まえがき
1章 イントロダクション
1.1 Node.jsの特徴
1.1.1 イベントループによる並行処理
1.1.2 スモールコアとnpm
1.1.3 モジュールシステム
1.1.4 ユニバーサルJavaScript、ユニバーサルWebアプリケーション
1.2 Node.jsとECMAScript標準、Web標準
1.2.1 ECMAScript標準
1.2.2 Web標準
1.3 ハンズオンの進め方
1.4 JavaScriptの基本
1.4.1 変数の宣言
1.4.2 関数
1.4.3 オブジェクト
1.4.4 配列
1.4.5 クラス
1.4.6 等価性
1.4.7 CommonJSモジュール
1.5 まとめ
1.6 練習問題
2章 非同期プログラミング
2.1 イベントループと非同期プログラミング
2.1.1 マルチスレッドによる並行処理とその問題点
2.1.2 イベントループによる並行処理と非同期プログラミング
2.2 コールバック
2.2.1 コールバックを利用した非同期APIを実行する
2.2.2 エラーハンドリング
2.2.3 混ぜるな危険、同期と非同期
2.2.4 コールバックヘル
2.3 Promise
2.3.1 Promiseインスタンスの生成と状態遷移
2.3.2 then()、catch()、finally()
2.3.3 Promiseのスタティックメソッドを使った非同期処理の並行実行
2.3.4 Promiseのメリット
2.3.5 Promiseの利用が適さないケース
2.3.6 Node.jsにおけるPromiseのこれまでとこれから
2.4 ジェネレータ
2.4.1 ジェネレータの生成
2.4.2 イテレータとイテラブル
2.4.3 引数を渡したnext()の実行、およびthrow()
2.4.4 ジェネレータを利用した非同期プログラミング
2.4.5 非同期プログラミング以外のジェネレータの利用例
2.5 async/await
2.5.1 async/await構文の使い方
2.5.2 async/await構文のメリット
2.5.3 async/await構文と非同期処理の並行実行
2.5.4 トップレベルawait
2.5.5 for await…of
2.6 まとめ
2.7 練習問題
3章 EventEmitterとストリーム
3.1 ObserverパターンとEventEmitter
3.1.1 EventEmitterの利用
3.1.2 EventEmitterとメモリリーク
3.1.3 エラーハンドリング
3.1.4 EventEmitterの継承
3.1.5 コールバックパターン形式でイベントリスナを登録する
3.1.6 EventEmitterからのasyncイテラブルの生成
3.1.7 EventEmitterのPromise化
3.2 ストリーム
3.2.1 ストリームの基本
3.2.2 読み込みストリーム
3.2.3 書き込みストリーム
3.2.4 二重ストリームと変換ストリーム
3.2.5 pipe()によるストリームの連結
3.2.6 エラーハンドリングとstream.pipeline()
3.2.7 ストリームの異常終了とstream.finished()
3.2.8 読み込みストリームとasyncイテラブルの互換性
3.3 まとめ
3.4 練習問題
4章 マルチプロセス、マルチスレッド
4.1 プロセスとスレッド
4.2 clusterモジュールによるマルチプロセス化
4.2.1 Webアプリケーションのマルチプロセス化
4.2.2 IPC(プロセス間通信)
4.3 worker_threadsモジュールによるマルチスレッド化
4.3.1 worker_threadsモジュールの使い方
4.3.2 スレッドプールの実装
4.3.3 スレッド間通信とIPCの違い
4.3.4 スレッド間での値の転送
4.3.5 スレッド間での値の共有
4.4 まとめ
5章 HTTPサーバとHTTPクライアント
5.1 ToDo管理アプリケーション
5.2 httpモジュールの利用
5.3 WebアプリケーションフレームワークとExpress
5.3.1 ルーティング
5.3.2 ミドルウェア
5.3.3 プロキシを介したHTTPリクエストの処理
5.4 ExpressによるToDo管理アプリケーションの開発
5.4.1 GETリクエストのハンドリング
5.4.2 POSTリクエストのハンドリング
5.5 ユニバーサルWebアプリケーション
5.5.1 Next.jsによるユニバーサルWebアプリケーションの実装
5.6 まとめ
5.7 練習問題
6章 リアルタイムWebアプリケーション
6.1 ポーリング
6.2 ロングポーリング
6.3 SSE(Server Sent Events)
6.3.1 SSEの実装
6.4 WebSocket
6.4.1 WebSocket実装のためのライブラリ
6.4.2 Socket.IOを利用したToDo管理アプリケーションの実装
6.5 まとめ
6.6 練習問題
7章 データストレージ
7.1 データストレージに対する操作の抽象化
7.2 ファイルシステム
7.2.1 ファイル操作の基本
7.2.2 ToDo管理アプリケーションのデータストレージの実装
7.3 リレーショナルデータベース
7.3.1 sqlite3パッケージを使ったSQLiteの操作
7.3.2 ToDo管理アプリケーションでのSQLiteの利用
7.4 NoSQL
7.4.1 NoSQLの分類
7.4.2 levelパッケージによるLevelDBの操作
7.4.3 ToDo管理アプリケーションでのLevelDBの利用
7.5 まとめ
7.6 練習問題
8章 ユニットテストとデバッグ
8.1 ユニットテストツールの分類
8.2 Mocha+Chai+Sinon.JS+Istanbul
8.2.1 Mochaによるテストコードの構造
8.2.2 非同期処理のテスト
8.2.3 Chaiによるアサーション
8.2.4 設定の記述
8.2.5 データストレージに対するユニットテスト
8.2.6 テストダブルとSinon.JS
8.2.7 Web APIに対するユニットテスト
8.2.8 カバレッジの計測
8.2.9 ウォッチモードでのテストの実行
8.3 Jest
8.3.1 Jestによるテストコードの構造
8.3.2 非同期処理のテスト
8.3.3 アサーション
8.3.4 設定の記述
8.3.5 データストレージに対するユニットテスト
8.3.6 テストダブル
8.3.7 Web APIに対するユニットテスト
8.3.8 カバレッジの計測
8.3.9 ウォッチモードでのテストの実行
8.4 デバッグ
8.4.1 インスペクタの有効化
8.4.2 インスペクタクライアントによるデバッグの実施
8.5 まとめ
8.6 練習問題
9章 デプロイ
9.1 デプロイ用アプリケーションの作成
9.2 PM2
9.2.1 PM2のインストール
9.2.2 PM2のシンプルな使い方
9.2.3 エコシステムファイルを利用したアプリケーションの詳細な設定とデプロイ
9.3 Docker
9.3.1 Dokcerのインストール
9.3.2 Dockerfileとイメージ、コンテナ、レジストリ
9.3.3 Dockerfileの記述
9.3.4 .dockerignoreファイル
9.3.5 イメージのビルドとコンテナの実行、停止、削除
9.3.6 ローカルPCでの開発におけるDockerの利用
9.4 クラウドサービスの利用
9.4.1 GAE利用のための準備
9.4.2 GAEアプリケーションのデプロイ
9.4.3 静的ファイルの配信
9.4.4 管理コンソール
9.4.5 GCPプロジェクトの削除
9.5 まとめ
10章 パッケージ管理
10.1 パッケージ管理ツール
10.2 npm
10.2.1 npmを構成するレジストリ、CLI、Webサイト
10.2.2 package.json
10.2.3 npmパッケージに含まれるファイル、含まれないファイル
10.2.4 npmパッケージのグローバルインストールとnpx
10.2.5 npmのワークスペース
10.2.6 npmレジストリへのパッケージの公開
10.3 Yarn
10.3.1 Yarnの特徴
10.3.2 Yarnのバージョン
10.3.3 Yarnのインストール
10.3.4 Yarnの使い方
10.3.5 Yarnのワークスペース
10.3.6 Yarn 2
10.4 まとめ
11章 Node.jsとJavaScript標準
11.1 ESモジュール
11.1.1 ESモジュールの構文
11.1.2 CommonJSモジュールとESモジュールの識別
11.1.3 CommonJSモジュールとESモジュールの性質の違い
11.1.4 CommonJSモジュールとESモジュールの相互依存
11.1.5 二重パッケージとpackage.jsonのexportsフィールド
11.2 WebAssembly
11.2.1 WebAssemblyテキスト形式
11.2.2 WebAssemblyオブジェクト
11.2.3 Wasmモジュール
11.2.4 WebAssemblyシステムインタフェース(WASI)
11.3 まとめ
11.4 練習問題
付録A Node.jsのインストール
A.1 Windows
A.2 macOS
A.3 Linux
A.3.1 Ubuntu、Debian
A.3.2 RHEL、CentOS
A.4 バージョンマネージャの利用
A.4.1 nvm
A.4.2 nvm-windows
付録B JavaScriptとコンパイル
B.1 コンパイルの仕組み
B.2 Babel
B.2.1 プロジェクトの初期化と依存パッケージのインストール
B.2.2 設定ファイルの記述
B.2.3 コンパイルの実行
B.3 TypeScript
B.3.1 プロジェクトの初期化と依存パッケージのインストール
B.3.2 設定ファイルの記述
B.3.3 コンパイルの実行
B.4 まとめ
付録C 練習問題の解答
C.1 1章 イントロダクション
C.2 2章 非同期プログラミング
C.3 3章 EventEmitterとストリーム
C.4 5章 HTTPサーバとHTTPクライアント
C.5 6章 リアルタイムWebアプリケーション
C.6 7章 データストレージ
C.7 8章 ユニットテストとデバッグ
C.8 11章 Node.jsとJavaScript標準
索引
コラム目次
ミュータブルとイミュータブル
–experimental-repl-awaitフラグ
ストリームの基底クラスをそのまま使う方法
読み込みストリームの一時停止モードとフローイングモード
child_processモジュール
HTTPメソッドとその意味
Node.jsプロジェクト開発のためのnpmコマンドとファイル
Function.prototype.bind()とthis
ORMとデータベースマイグレーション
TDDとBDD
ブラウザ環境で動作するJavaScriptのコードのユニットテスト
npm CLIの設定
Node.jsのリリースサイクル
BabelのAPIを利用したコンパイル