Web開発の選択肢の1つ、Node.jsはいかが?『入門Node.jsプログラミング』で始めよう|翔泳社の本

Web開発の選択肢の1つ、Node.jsはいかが?『入門Node.jsプログラミング』で始めよう

2019/10/02 07:00

 RailsやDjango、LaravelなどWeb開発のフレームワークはいくつかありますが、JavaScriptだけで実装が可能なNode.jsも選択肢の1つ。Node.jsに関心がある方、初めてWeb開発をやってみようという方に、翔泳社から9月25日に発売した『入門Node.jsプログラミング』がいかがでしょうか。今回は、本書を使ってどのように学んでいけばいいのか、抜粋して紹介します。

本記事は『入門Node.jsプログラミング』の「LESSON 0 Node.jsとJavaScriptエンジンの準備」から抜粋したものです。掲載に当たり、一部を編集しています。

本書で学ぶこと

 本書の目標は、Node.jsというプラットフォームで、JavaScript言語を使って、Webアプリケーションを構築する方法を学ぶことです。本書は、前章までに学んだ概念や開発スキルに基づいて進行します。

 順番にレッスンを終えていくことで、Webアプリケーションの構築に役立つ、新しいWeb開発のコンセプトや用語やコーディングのスキルを身に付けていきます。本書の主題はNode.jsですが、学ぶコンセプトの多くは、他の新しいプラットフォームやプログラミング言語にも適用できます。

 Web開発のスキルは、典型的なソフトウェアエンジニアリングやコンピュータ理論の知識とは違います。本書で学ぶのは、コーディングの概念だけではありません。目先のプロジェクトに限らず、インターネットの仕組みを理解するのにも、本書は役立ちます。ものごとを、はっきり理解できるよう、できるだけ詳しく説明していきます。

Node.jsを理解する

 Node.jsは、JavaScriptコードを解釈してアプリケーションを実行するためのプラットフォームです。JavaScriptは、すでに20年も利用され、改善を重ねて、クライアントサイドのスクリプト言語から、データ管理のための完全なサーバーサイドプログラミング言語へとシフトしています。

 Node.jsは、GoogleChromeのJavaScriptエンジンとともに構築され(そのエンジンが、JavaScript言語を解釈し、コンピュータにとって意味のある命令に変換します)、サーバーサイド言語としてのJavaScriptを強力にサポートします。JavaScriptは、Webページのクライアントサイドでのインタラクションにも、サーバーに到着するアプリケーションデータやデータベースの通信処理にも使えます(後者は、しばしばC、Java、Python、Rubyなどの言語の仕事とみなされてきました)。

 開発者たちは、完全なWebアプリケーションを構築する仕事を達成するのに、それら複数の言語をマスターする必要がなく、代わりにJavaScriptの習熟に専念できるのです。

 Node.jsは、1本のスレッドを使うイベントループで動作します。「スレッド」というのは、1個のタスクの実行に必要な計算能力と資源を、ひとつに束ねたものです。一般に、タスクの開始と完了の両方を1本のスレッドで扱います。同時に実行したいタスクの数が多くなれば、より多くのスレッドが必要です。

 ほとんどのソフトウェアでは、コンピュータが同時に提供可能なスレッドプールから複数のタスクにスレッドを割り当てて管理します。けれどもNode.jsは、同時に1本のタスクしか扱いません。そしてメインスレッドで処理できないタスクにだけ、より多くのスレッドを使います。

 このプロセスは、直感に反するように思えるかもしれません。しかし、コンピュータの莫大な処理能力を集中的に要求するタスクを必要としない、多くのアプリケーションでは、シングルスレッドで全部のタスクを迅速に管理し実行できます。図0‒1は、イベントループを単純化したものです。タスクは実行の準備が終わると、キュー(待ち行列)に入り、イベントループの特定のフェーズで、順に処理されます。

図0‒1:Node.jsのイベントループを単純化したモデル
図0‒1:Node.jsのイベントループを単純化したモデル

 Node.jsのイベントループは、無限に繰り返して実行され、新しいタスクや別のタスクの完了を通知するために、サーバーによってトリガされるJavaScriptのイベントを監視します。タスクの数が増えると、複数のタスクがキューに並び、イベントループによって徐々に処理されます。

 ただし、その事実を意識してコーディングする必要はありません。コードは非同期的な習慣に従って書けばよく、タスクの処理は、舞台裏でNode.jsアーキテクチャがスケジューリングしてくれます。だからNode.jsは、送受信されるデータを継続的に監視するリアルタイムアプリケーションの作成に、よく使われるようになったのです。

 イベントループは、オフィスマネージャーのようなものです。マネージャーの役割は、到着するメッセージや、仕事の割り当てや、オフィス関連の仕事を処理することです。マネージャーには、片付けるべき仕事が山のようにあるでしょう。その長いリストには、完全な財務リポートの作成委託から、鳴った電話に出たり、オフィスパーティの装飾まで含まれます。

 ある種のタスクは、他のタスクよりも長い時間がかかるので、マネージャーは新しい仕事に着手する前に個々のタスクを終えるという義務を負いません。たとえばパーティの装飾を準備しているときに電話が鳴ったら、準備を中断して電話に出ることができます。しかも、電話を他の従業員に転送して、元の仕事に戻ることができるのです。

 同じように、イベントループも一連のタスクを処理しますが、同時に処理するのは常に1個のタスクだけです。イベントループでタスクのリストを消化しつつ、より大きなタスクにコンピュータの処理能力を分配することができます。他のほとんどのプラットフォームでは、新規に到着するタスクに新たなプロセスを割り当て、それぞれのタスクに新しいイベントループを作ります。

 けれども、むやみにタスクの数を増やすのは、狭いオフィスで従業員を増やすようなもので、結局はコストや処理能力や共有リソースなどに関する新たな問題に取り組むはめになります(たとえば、もし従業員2人が1本の電話を同時に使う必要が生じたら、どうなるでしょう)。

 この本では、Webアプリケーション構築におけるNode.jsの強みを、もっと探究していきます。けれども、深い話に入る前に、Node.jsが有益な理由を説明しましょう。

クイックチェック

 Node.jsのイベントループでは、それぞれのタスクの実行を完了させてから次のタスクを処理します。ホントでしょうか、ウソでしょうか。

なぜNode.jsでの開発を学ぶのか

 あなたがこの本を選んだ理由は、プログラマとしての腕をみがき、Webアプリケーションを作りたいからだと思います。Node.jsを使い、JavaScriptのコーディングに上達したい理由も、だいたい同じでしょう。

 ユーザーにはNode.jsアプリケーションと見分けがつかないようなアプリケーションを作る選択肢は、RubyonRailsやPHPなど、たくさんあります。それらの代わりにNode.jsを学習する理由としては、次のものが考えられます。

  • 安定したアプリケーション開発のために複数の言語のバランスをとる必要がなく、開発のコア言語としてJavaScriptだけに注意を集中できます。
  • データの連続的なストリーミングや、何らかのチャット機能が欲しい場合、他のプラットフォームよりもNode.jsのほうが有利とみなされています。
  • Node.jsの背後には、GoogleのV8JavaScriptインタープリタがあるので、広くサポートされ、性能と機能の向上を期待でき、すぐに消え失せることもないでしょう。Node.jsの各バージョンで、どのような機能がサポートされたかは、こちらを参照してください。
  • Node.jsは、Web開発のコミュニティで大きな人気を得ています。他の開発者たちと会う機会があり、サポートを得ることもできるでしょう(5年におよぶNode.js開発の経験を持つ人もいます)。また、いまではNode.jsのほうが、他の古いプラットフォームよりも多くの、しっかりしたサポートのあるオープンソースツールが作られています。

 あなたが新人プログラマとしてWeb開発に参入する場合でも、あるいはソフトウェア開発の経験があって、みんなの話に出てくる新しいものを物色している場合でも、Node.jsは選択すべきプラットフォームであり、この本は、あなたが読むべき本です。

読み進めるための準備

 この本では最初から、Node.jsで基本的なWebサーバーを構築するプロセスを通じてWeb開発を紹介します。読み進めるにつれ、あなたは手元のアプリケーションにコードを追加して、堅牢なWebアプリケーションの完成へと近づきます。

 新しいトピックを迎える準備のために、それぞれの章を熟読し、すべてのコードサンプルを自分で入力してください。コードをコピー&ペーストするだけでは、エラーに遭遇しても対処できません。もっと重要な問題として、その方法では概念を身に付けることができません。

 JavaScriptは、本書の重要な前提条件です。だから、もし仕事への取り組みに苦労したら、その問題に対するベストプラクティスや、その他の一般的なソリューションを、オンラインで探してください。本書では、随所の「クイックチェック」で、身に付けた知識をテストできます(最初の「クイックチェック」は、すでに「Node.jsを理解する」で終えています)。それぞれの章の終わりに、「練習問題」があり、レッスンで学んだコーディングの概念を実際に使ってみることができます。

 これらの課題や「演習」は、さまざまな機能を備えたWebアプリケーション開発の各段階を構成しています。

 本書の目標は、演習で作るようなWebアプリケーションの構築を、快適に行えるようにすることです。これらの演習では、ConfettiCuisineという架空の会社のためにWebアプリケーションを作ります。これは調理学校のクラスを提供します。ユーザーはサインアップして接続し、他のユーザーとレシピに関する意見交換ができます。この演習のガイドラインに従って、一度だけではなく、プロジェクトの一部または全部を、何度か作り直してみてください。

 課題は3回行うのがベストです。最初はガイドに従い、2回目にはガイドを参考にして考え、3回目にはガイドに頼らず自力で作るのです。3度目には、関係するコンセプトについて十分に具体的な理解が身についているでしょう。

 本書の課題のほとんどは、「ターミナルウィンドウ」を使って行うものです。Node.jsは、クロスプラットフォームのツールです。つまり、Windows、macOS、Linuxのマシンで実行できますが、本書はUNIX的な視点で記述しています。Windowsのユーザーは、「コマンドライン」を使ってNode.jsを実行できますが、一部のコマンドに違いがあるでしょう。

 だからWindowsユーザーには、GitBashのインストールを推奨します。これならば、UNIXコマンドを使って、本書のすべてのサンプルを再現できます。ただし、Node.jsとともにインストールされるNode.jsコマンドライン環境でも、ずいぶん多くのことを達成できます。GitBashとそのインストールについては、こちらを参照してください。

 それぞれの章を読み終えたら、前回の演習の課題から、どれほど進歩したか、振り返ってみましょう。最終章を終えたときには、Node.jsで完全なWebアプリケーションを構築しています。そこに至るまで、次のことに注意して、本書に取り組んでください。

  • ソースファイルはJavaScriptで書かれています。ファイルの拡張子は.jsです。
  • 本書のすべてのサンプルで使うメインアプリケーションファイルはmain.jsです(違うときは特記します)。
  • Webブラウザが必要な課題には、最新のGoogleChromeブラウザを使うことを推奨します。このブラウザは、こちらからダウンロードできます。

 レッスンでは、Node.jsの学習経験に関係する新しい用語や概念について、できるだけ説明を試みています。本書で触れるトピックに、もっと詳しい情報が欲しいときは、下記のリソースが参考になるでしょう。

  • 『HTML5inAction』(RobCrowther、JoeLennon、AshBlue、GregWanish共著、Manning刊、2014年)
  • 『CSSinDepth』(KeithJ.Grant著、Manning刊、2018年)
  • KyleSimpsonによるブックシリーズの『YouDon’tKnowJS:Up&Going』(https://github.com/getify/You-Dont-Know-JS、O’ReillyMedia、2015年)
  • WesHigbeeによるレクチャー『ES6inMotion』(https://www.manning.com/livevideo/es6-in-motion)

まとめ

 今回は、本書の構成を示し、Node.jsとは何であり、なぜ重要なのかを解説しました。また、本書に接する準備にも触れました。この本は、サブトピックやレクチャーを含む講座のようなものだと思ってください。実力のあるWeb開発者を目指して、知識とスキルを積み重ねていきましょう。

プロセスとスレッド

 Node.jsのイベントループは、1本のスレッドで全部のタスクを管理しますが、必ずそのスレッドだけをタスクの完了まで使うとは限りません。実際Node.jsは、大きなタスクをホストコンピュータに渡すように設計され、そのコンピュータでは、タスクを運用するため新しいスレッドやプロセスを作ることがあります。

「スレッド」というのは、タスクのなかで一連の命令を実行するのに使うコンピュータ資源を、束ねて割り当てたものです。通常、スレッドで処理されるタスクは単純で高速です。このため、Node.jsのイベントループは、他のすべてのタスクを管理するのに1本のスレッドしか必要としません。スレッドはコンピュータのプロセスを通じて利用されます。負荷の重いタスクの実行には、独自のプロセスが要求されるでしょう。

「プロセス」も、タスクの実行に使う計算能力や資源をまとめたものですが、スレッドで処理するよりも大規模なタスクの実行に使うのが普通です。スレッドを作るにはプロセスの存在が不可欠です。Node.jsのアプリケーションは、それぞれ独自のプロセスで実行されます。

 Node.jsはシングルスレッドですが、プロセスのインスタンス1を、いくつも並行して実行でき、それによって外から入ってくる要求やタスクを処理できます。このため、Node.jsはスケーリングが良好です。Node.jsは、タスクを非同期にスケジューリングします。タスクごとに新しいプロセスを生成するのではなく、必要なときにだけ、スレッドとプロセスを追加して使います。タスクのリストを処理するのに必要なプロセスの数が多ければ多いほど、コンピュータの負荷が高まります。Node.jsでは、同時に処理するプロセスの数を最小限に抑えるのがベストです。

「スレッド」と「プロセス」という用語の関連については、いろいろ耳にすることがあるでしょう。けれども本書では「Node.jsがいつでも1個のタスクハンドラに依存する」ということさえ知っていれば十分です。

クイックチェックの解答

 ウソ。Node.jsのイベントループでは、キューからタスクを順番に取り出しますが、そのタスクの実行を、アプリケーションを実行しているマシンに分担させることも、新しいタスクを処理しながらタスクの完了を待つこともあります。

入門Node.jsプログラミング

Amazon SEshop その他


入門Node.jsプログラミング

著者:JonathanWexler 翻訳:吉川邦夫
発売日:2019年9月25日(水)
価格:3,400円+税

本書について

本書は、純粋にJavaScript(ECMAScript 2015以降)だけを使ってアプリケーションを構築する手法と、その手立てを提供します。そのため、JavaScriptの機能と使い所の極意を否が応でも学ぶことになります。