最近Reactのアプリ開発でサーバーサイドもNode.jsを使用して開発することがあったので、改めてNode.jsについてまとめたいと思います。
【基礎】Node.jsについて
1. そもそもNode.jsって何?
Node.jsとはサーバー側の機能・処理などの動作を、Web開発で使用するJavaScriptを使用して動作させるプラットフォームです。
そのため、JavaScriptを修めていれば自身でWebサイト・サーバーサイドの開発をすることができ、言語が統一されることによりプログラマの負担を軽減することができます。
また、言語が統一されることで言語を学ぶ時間を短縮できるので、最初にJavaScript関連のライブラリやフレームワークを使用するのは額十時間を減らせます。
1-1. JavaScriptとは
JavaScriptとはWebサイトなどを作成する際に使用するプログラム言語です。
HTML(DOM)やCSSに関する処理・機能を追加してWebサイトにUIに動作や制御をつけることができます。
現在はWeb開発だけではなくNode.jsなどを使用してサーバーサイドの開発や、他のライブラリやフレームワークを使用することでアプリ開発等の様々な用途に使用されています。
2. Node.jsでできること
最近Reactのアプリ開発でサーバーサイドもNode.jsを使用して開発することがあったので、改めてNode.jsについてまとめたいと思います。
・Node.jsでできること
Node.jsでは以下の5つのことが可能になっています。
①Webサーバーの作成
②スマホアプリの作成
③Webアプリの作成
④JavaScriptでプログラムを記述
⑤CSSへの変換
上記の5つが可能となっています。
Node.jsでは上記で上げたような利点があります。
Node,jsでは①のようなサーバー開発の場合でも、リアルタイム性の高いアプリ等に最適となっています。
②のスマホアプリの作成では基本的にはwindows関連ならJavaやC++、IOSではSwiftなどが主に活用されているというイメージが多いかと思われます。
ですが、ハイブリッド型のアプリ開発もありHTML5やJavaScriptなどのマークアップ言語やプログラム言語を使用してアプリ開発ができるようになりました。
③のWebアプリの作成でもNode.jsを使用して行うことができます。
メモリ消費が低く大量のアクセスに対応することができるNode.jsでは、使用できるライブラリやフレームワークが多数存在しています。
例えばVue.js・Angular.js・Next.jsなど、最近活用されている場面が多いフレームワークが利用できるので1からプログラムを作成する必要が無くなりました。
こちらを使用することによりどなたでも簡単なアプリであれば開発することができるようになりました。
④のJavaScriptでプログラムを記述ですが、元々はサーバーサイドでプログラムをする際にはPHPなどの言語が使用されていました。
ですので、Node.jsが出てくるまではフロントとバックエンドの両方の言語を習得しておかなければならず勉強コストが高くなっていました。
ですが、現在ではNode.jsを使用することによりJavaScriptが理解できればサーバーサイドもそのまま開発することができるようになりました。
そのため、勉強コストの削減や言語を統一できるため保守的な面でも管理などがしやすくなりました。
⑤のCSSへの変換ではTTFフォントというものをCSSに変換して使用することができるようになりました。
この機能があるため小さいファイルに対してCSSを取り込むことができるため、開発効率を向上させることができるようになりました。
3. Node.jsのメリット
Node.jsを使用することによるメリットは以下のようなことがあります。
①開発言語の統一が可能になる
②高性能処理ができC10K問題を解決できる
③ノンブロッキングI/O方式で非同期処理が可能
①の開発言語の統一が可能に関しては、Node.jsを使用すればフロントエンド/バックエンド共にJavaScriptで開発をすることになるので1言語で統一が可能となっています。
本来はクライアントサイドでのみJavaScriptが使用されていて、サーバーサイドではPHPなどの使用する言語が異なっていました。
ですが、Node.jsを導入することができればサーバーサイドでもJavaScriptが使用できるので習得・作業のスピードが上がり効率的に開発ができるようになりました。
②の高性能処理ができC10K問題を解決できるでは、簡単に言うと1万台以上になると通信が遅くなるというトラブルが解決できます。
3-1. C10K問題
C10K問題とはクライアントが10K(1万)問題で、サーバー同時接続台数が1万台以上になった場合にハードウェアに余力があるにも関わらず処理速度が低下してしまうという問題です。
Node.jsでは後述するノンブロッキングI/O方式を採用しているため、非同期処理を行うことができ複数プロセスをまとめて対応することができるので処理速度が低下しません。
③のノンブロッキングI/O方式に関してですが、この方式では非同期処理を行うことができます。
ですので、1つ1つタスクを対応する必要がなく、タスクが終わっていない状態でも次のタスクの対応ができるためスムーズに処理ができるようになっています。
このようにリアルタイムで複数対応することができるので、Webページの動作などがストレスを感じることなく快適に動作できるようななります。
4. Node.jsのデメリット
色々と便利なNode.jsですが、もちろんデメリットも存在しています。
①対応できるサーバーが少ない
②特定のイベントの処理が重たいと処理に時間がかかる
③JavaScriptと互換性がない
①対応できるサーバーが少ないに関しては、そのままの通り一般的にはNode.jsは対応サーバーが少な陽です。
ですが、VPS(仮想専用サーバー)かつ「root権限がある」状態なら問題なく使えます。
そのため、Webアプリかスマホアプリなどの開発では特には問題にはならないようです。
②の特定のイベントの処理が重たいと処理に時間がかかるに関しては、Node.jsの特徴であるシングルスレッドで動作することが関連しています。
シングルスレッドはプログラムを実行する際に、同時に1つの処理しか行わないことです。そのため、特定のイベントに関する処理が重なった場合に大量のリクエスト待ち状態になることがあります。
その結果、システムエラーなどが発生した場合にサーバーがダウンしてしまう可能性などがあります。
③のJavaScriptと互換性がないに関しては、その通りでJavaScriptで記述はできるのですが処理上は互換性がありません。
ですので、Node.jsで使用する場合には新たに独自のルールなどを学習する必要がありますが、記述はJavaScriptで行えるので0から学ぶよりかは学習コストはかなり少なくなります。