Node.jsに関する世界観です。JavaScript1(一般)も参照のこと。
サーバーサイドのJavaScript技術。
ChromeのJavaScriptエンジンV8を用いて、サーバーサイドのJavaScript環境を実現する。クライアントサイドだけではなく、サーバーサイドもJavaScriptで書ける。
JavaScriptでビューを実現する技術にVue.jsなどがあるが、Node.jsとExpressを組み合わせることでRuby on Railsなどを完全に代替できる。
また、Nginxと同様、ノンブロッキングI/Oとイベントループによるモデルを採用し、スレッドやプロセスを使わない。これにより、高速で軽量でメモリを大きく使用せずにWebサーバーを実現できる。
自分の書いたブログ「神々とともに生きる詩人」2021/02/05より。
クライアントサイドのJavaScriptに加えて、サーバーサイドもJavaScriptで書いてやろうという、Node.jsも流行っています。
JavaScriptは、DOMなどの事実上の標準APIについては、ECMAScriptのような形で、Netscapeの後継であるMozilla.orgなどが標準規格を定めていますが、サーバーサイドにはそれがありません。
そのため、JavaScriptには標準のファイル操作APIもありません。
そのため、CommonJSという規格があります。
Node.jsはこのCommonJSに則り、サーバーサイドに必要なモジュールを提供しています。
Node.jsは、たとえば、非同期のファイル操作APIなどを提供しています。
(詳しくはパーフェクトJavaScript (PERFECT SERIES 4)が参考になります。)
公式のNode.js とは | Node.jsにサンプルコードがあります。
Node.jsでは、Apache/CGIやJavaサーブレットとは違い、コンテナとなるWebサーバもアプリケーションもどちらもまとめて実装する。
ノンブロッキングI/Oとイベント駆動の仕組みについてはNginxを参照のこと。
以下の動画が参考になります。Node.jsのバージョン管理のためにnodebrewを導入します。
標準のzipファイルからNode.jsを導入することもできるが、Node.jsはバージョンを切り替えることが多いので、zipファイルから導入すると、バージョンを変えるたびに別のバージョンをインストールしなければならず、面倒である。
このため、nodebrewというNode.jsのバージョン管理ツールを使う。
まずhomebrewを先にインストールする。それが終わったら、homebrewを通じてnodebrewを導入する。
brew install nodebrew
PATHなどを通したら、以下のコマンドでNode.jsの安定板あるいは最新版をインストールできる。
nodebrew install-binary stable nodebrew install-binary latest
インストールされたバージョンは以下で確認する。
nodebrew list
しかしながら、この状態では、インストールされただけで、どのバージョンを使うかを指定していない。使うバージョンを指定するには以下のコマンドを使う。
nodebrew use latest
stableやlatestの代わりにバージョンを指定する(v14.15.4など)こともできる。
インストールが終わったら、nodeコマンドを実行すると、プロンプトにJavaScriptコードを入力可能となる。
$ node > console.log('hello'); hello
また、PATHを毎回通すのではなく、シェルの初期化スクリプトに書くことで自動でPATHを通すようにしておこう。
以上は、以下の動画を見て、自分なりに書きました。
以下はパーフェクトJavaScript (PERFECT SERIES 4)を参考に執筆・引用しました。
CommonJSで特に開発が進んでいるのがモジュールシステムで、require()関数でインポートし、exportsオブジェクトで変数や関数をエクスポートする。
以下は主なモジュール。
モジュールなど | 説明 |
---|---|
console | log()など、端末への出力などが可能で、デバッグに使う。 標準で読み込まれるため自分でロードする必要はない。 |
util | consoleと同様によく使われるモジュールで、print()での出力などが可能。明示的に読み込んで使う。 |
process | processオブジェクトは、Node.jsにおけるホストオブジェクト(グローバル変数)のひとつ。 基本的にひとつのインスタンスしか存在しない。 プロパティにstdin/stdout/stderrなどのストリームや、プロセス(argv, chdir(), pid, kill()など)の機能を持つ。 |
Buffer | ほかの言語にあるような連続的な配列。 サイズが変更できず、必ずメモリの連続領域となる。 |
Stream | Node.jsのストリームは、必ず非同期になる(非同期しかできない)という特徴がある。 コールバック関数によって非同期での読み書きを処理する。 |
fs | fsモジュールにより、Node.jsでファイル処理ができる。 ファイル処理のAPIには同期版と非同期版(コールバック関数を使う)がある。 |
(パーフェクトJavaScript (PERFECT SERIES 4)を参考に執筆しました。)
2022.11.28編集
Node.jsの非同期処理は、たとえばhttp.createServer()の中にコールバック関数を指定する。これにより、指定ポート(たとえば8080番など)にHTTPの接続があると、イベントループからコールバック関数が呼ばれる。
createServer()だけで書くこともできるが、より明確に書く場合は、基本的に、
var httpd = http.createServer();
でサーバを作成し、これに対して
httpd.listen(8080);
などでポートを指定し、
httpd.on('イベント名', イベントハンドラの関数);
でコールバック関数を登録する。
(パーフェクトJavaScript (PERFECT SERIES 4)を参考に執筆しました。)
Node.jsでファイル処理を行うには、fsモジュールとパス情報を操作するpathモジュールを使用する。
以下はファイル読み書きのための主なメソッド。
API | 説明 |
---|---|
stat() | ファイル情報を得る(非同期版) |
fstat() | ファイル情報を得る。 ファイルパスではなくファイルディスクリプタを引数に指定する。 |
lstat() | ファイル情報を得る。 シンボリックリンクの場合にリンク先を参照しない。 |
statSync() | ファイル情報を得る(同期版) |
open() | ファイルを開く(非同期版) |
openSync() | ファイルを開く(同期版) |
read() | ファイルを読み込む(非同期版) |
readSync() | ファイルを読み込む(同期版) |
readFile() | ファイルを読み込む(簡易版・非同期版) |
readFileSync() | ファイルを読み込む(簡易版・同期版) |
write() | ファイルを書き込む(非同期版) |
writeSync() | ファイルを書き込む(同期版) |
writeFile() | ファイルを書き込む(簡易版・非同期版) |
writeFileSync() | ファイルを書き込む(簡易版・同期版) |
これらのAPIのほか、バッファを表すBufferオブジェクトをデータの保持に使用する。また非同期APIをつかう場合はコールバック関数を指定する必要がある。
(パーフェクトJavaScript (PERFECT SERIES 4)を参考に執筆しました。)
2023.09.10
Node.jsではバックエンドのデータベースとして、RDBMSのほか、NoSQLのひとつであるMongoDBを使うことができる。
MongoDBも参照のこと。
以下の書籍が参考になります。
ツイッターなどを見ていると、最新のWeb開発の技術スタックとして流行しているのは、TypeScript + Node.js + Next.jsの組み合わせです。
まず、TypeScriptを使うことで、JavaScriptで型のある開発ができます。動的に型が決まるのではなく、自らその変数に入る値の種類をきちんと明示的に決められます。
TypeScriptは、JavaScriptの開発では必須であり、TypeScriptのない開発は考えられません。
同時に、サーバーサイドのJavaScript技術としてNode.js、フレームワークとしてNext.jsを使うのが最新の流行です。
Ruby on Railsなどは今でも流行しているように見えるかもしれませんが、実際はもはや古い技術です。唯一Railsに優れた点があるとしたら、ActiveRecordだけです。
今の時代のWebエンジニアを目指すなら、TypeScript + Node.js + Next.jsでプロダクトやサービスを作りましょう。
TypeScriptやReactやNext.jsも参照のこと。
2023.06.14
Node.jsはサーバーサイドJavaScriptのための環境としてよく知られているが、実際はサーバーサイドでなくても、JavaScriptコードを動かすランタイムとして利用できる。
たとえば、Pythonコードを動かすためにPythonインタープリタをランタイムとして利用したり、Rubyコードを動かすためにRubyインタープリタをランタイムとして利用したりできるのと同じように、JavaScriptコードを動かすためにNode.jsをランタイムとして利用できる。
JavaScriptはGoogle ChromeやMozilla FirefoxのようなWebブラウザで動くため、Webブラウザ上で動かすのであればランタイムは必要なく見えるかもしれないが、Node.jsはWebブラウザで実行される環境よりも多くの機能を提供しており、たとえばストリーム処理(標準入出力など)やファイル処理やプロセス処理を使うために、Node.jsをサーバーサイドではなくローカルにランタイムとして導入することができる。
2023.09.10
npmを参照のこと。
Expressを参照のこと。
Denoも参照のこと。
MongoDBを参照のこと。
Nginxを参照のこと。
Linuxシステムコール・APIも参照のこと。
Herokuを参照のこと。
サーバーサイドのJavaScript環境。クライアントサイドだけではなくサーバーサイドでもJavaScriptを使う。
一部ではPHPやRubyよりも流行っている。
Node.jsはサーバーサイドで動くJavaScriptの実行環境。イベント駆動とノンブロッキング I/O モデルによって、高性能な動作が可能です。