はるか昔、インターネットがこの世に広まり始めたころ、私はHTMLを書いていました。
そしてjavascriptと出会い、時代とともに様々な変遷を経験してきました。
そのたびに思ったことが、「今この技術は必要なのか?」でした。
今回は、今すでに広く受け入れられている、Node.jsについて学んでいきたいと思います。
JavaScriptの進化と現在の重要性 - Node.jsの役割
1. javascriptの歴史
JavaScriptは、WEB開発において非常に重要な役割を果たしている言語であり、その歴史は非常に興味深いものです。
ここでは、DHTML、jQuery、Node.jsの3つの段階に分けてJavaScriptの歴史を振り返ります。
JavaScriptが開発者たちのニーズに応える形で、DHTMLからjQuery、そしてNode.jsへと進化してきた歴史をご覧ください。
1-1. DHTML(1995年〜2005年)
1995年にJavaScriptが最初にリリースされ、その後、DHTMLが誕生しました。
この時期には、JavaScriptは主に、HTMLドキュメントの動的な変更や、マウスイベントの処理など、Webページのユーザーインターフェースの改善に使用されていました。
ブラウザの差異や複雑なコードが必要だったため、開発者たちは、より簡単にコードを書くことができるライブラリの需要を感じていたと言えます。
1-2. jQuery(2005年〜2015年)
jQueryは、2005年に登場したJavaScriptのライブラリで、クロスブラウザ対応のためのヘルパーメソッドや、DOM操作、Ajaxリクエストの簡略化など、様々な機能を提供してきました。
jQueryは、当時のブラウザの差異に対処することができ、JavaScriptをより簡単に、効率的に書くことができるようになりました。
1-3. Node.js(2015年〜現在)
Node.jsは、ChromeのV8 JavaScriptエンジンをベースに作成されたJavaScriptのランタイム環境で、JavaScriptをサーバーサイドで実行することができます。
Node.jsは、ブラウザと同じように非同期処理を扱うことができ、Webサーバーの開発に役立ちます。
Node.jsは、最近では、ReactやAngularなどのフロントエンドのフレームワークやライブラリと組み合わせて使用されることが多く、現在のJavaScriptの世界において非常に重要な役割を果たしています。
2. なぜ今Node.jsなのか
現在では、ネットワーク上で扱うトラフィックが増加し、同時にWebアプリケーションの需要も増加しています。
これにより、サーバーサイドの処理性能の向上が求められるようになりました。
また、同時接続数が多い場合、従来のスレッド/プロセスモデルではその分だけスレッドやプロセスを生成する必要がありましたが、それに伴ってメモリの消費量も増加してしまいます。
Node.jsは、Webアプリケーション開発において、サーバーサイドでのJavaScriptの実行環境を提供することができます。
これにより、従来のサーバーサイド言語と比較して、開発速度が向上し、スケーラビリティが高まるといったメリットがあります。
2-1. JavaScriptの統一性
従来、フロントエンドとバックエンドの開発には異なる言語が必要でしたが、Node.jsにより、JavaScriptをフルスタックで使用できるようになりました。
JavaScriptの知識やスキルを一元化することができるため、開発者の負荷が軽減されます。
2-2. ノンブロッキングI/O
ノンブロッキングI/O方式は、多数のクライアントが同時に接続することができるWebサーバーの実装に役立ちます。
従来のブロッキングI/O方式では、クライアントの接続数が増加するにつれて、サーバーが過負荷になる可能性がありました。
しかし、ノンブロッキングI/O方式では、I/O操作が完了する前にプログラムの制御を返すため、多数のクライアントの接続をサーバーが同時に処理できるようになります。
Node.jsは、ノンブロッキングI/Oの仕組みを持っており、マイクロサービスやリアルタイムアプリケーションのような高い並行性が要求されるアプリケーション開発に適しています。
従来の同期型処理に比べ、I/O待機中に別の処理を実行できるため、スケーラビリティが高まります。
2-3. パッケージマネージャー
Node.jsは、npmと呼ばれるパッケージマネージャーを提供しています。
これにより、開発者は簡単に外部ライブラリを導入し、再利用することができます。
また、npmには開発者コミュニティが多数存在しており、便利なツールやパッケージが豊富に揃っています。
2-4. 大規模アプリケーションの開発
Node.jsは、大規模アプリケーションの開発にも適しています。
JavaScriptによるコールバックやPromiseそしてasync/awaitなどの非同期処理により、アプリケーションのパフォーマンスを向上させることができます。
また、Node.jsのクラスタリング機能により、複数のプロセスを使用して処理を分散することができます。
・コールバック関数
コールバック関数は、非同期処理が完了したときに呼び出される関数です。
JavaScriptでは、コールバック関数は通常、非同期処理の引数として渡されます。
例えば、ファイルを読み込む非同期関数では、ファイルの読み込みが完了したときにコールバック関数が呼び出され、処理が継続されます。
・Promise
Promiseは、非同期処理が完了すると解決(resolve)または拒否(reject)されるオブジェクトです。
非同期関数は、Promiseを返すことができ、Promiseチェーンを使用して、非同期処理の完了後に実行される処理を指定することができます。
・async/await
async/awaitは、ES2017で導入された構文で、非同期処理を同期的に書くことができるようにします。
async関数はPromiseを返す関数です。awaitキーワードを使用して、Promiseが解決されるまで待機することができます。これにより、非同期処理が同期処理のように見えるようになり、より読みやすく、保守しやすいコードを書くことができます。
3. Node.jsのインストール
sudo apt-get update
sudo apt-get install nodejs
Node.jsとnpmが正しくインストールされたかどうかを確認するには、以下のコマンドを使用します。
バージョン番号が表示されれば、Node.jsとnpmが正常にインストールされていることを意味します。
node -v
npm -v
4. Hello Worldの実行
4-1. コマンドラインでHello World
以下の手順でhello worldを実行できます。
1.テキストエディタを開き、新しいファイルを作成します。
2.ファイルに以下のコードを入力します。
console.log("Hello, world!");
3.ファイルを保存します。ファイル名を helloworld.js などにすると良いでしょう。
4.コマンドラインで、保存したファイルがあるディレクトリに移動します。
5.以下のコマンドを実行します。
node helloworld.js
6.コマンドラインに Hello, world! というテキストが表示されれば、成功です。
4-2. ブラウザでHello World
ブラウザにhello worldを表示するには、HTTPサーバーを作成し、ブラウザからリクエストを送信してレスポンスを返す必要があります。
以下は、Node.jsでHTTPサーバーを作成して、ブラウザにhello worldを表示するコード例です。
// helloworld_b.js
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World!');
});
server.listen(3000, () => {
console.log('Server is listening on port 3000');
});
このコードをファイルに保存し、ターミナルで node helloworld_b.js を実行してサーバーを起動します。
ブラウザから http://localhost:3000 にアクセスすると、"Hello World!"というテキストが表示されます。
起動させたサーバーを停止したいときは、Ctrl + Cを入力します。
5. MySQLと連携してみる
MySQLと連携できるかもやってみました。
1.mysqlパッケージをインストールします。
npm install mysql<
2.mysqlパッケージを使用してデータベースとテーブルを作成するjavascriptを書きます。
// create_test_database.js
const mysql = require('mysql');
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '', // rootユーザーのパスワードを入力
});
connection.connect((err) => {
if (err) throw err;
console.log('Connected!');
// mysqlデータベースを使用する
connection.query('USE mysql', (err, result) => {
if (err) throw err;
console.log('Using mysql database!');
// データベースが存在しない場合にのみデータベースを作成する
connection.query('CREATE DATABASE IF NOT EXISTS test_database', (err, result) => {
if (err) throw err;
console.log('Database created!');
// データベースが作成された後に接続しなおす
connection.changeUser({database: 'test_database'}, (err) => {
if (err) throw err;
// テーブルを作成する
const createTable = 'CREATE TABLE IF NOT EXISTS test_table (test_key VARCHAR(255), test_value VARCHAR(255))';
connection.query(createTable, (err, result) => {
if (err) throw err;
console.log('Table created!');
connection.end(); // 接続を終了する
});
});
});
});
});
作成されるデータベース名はt
6. まとめ
今回は、「Node.jsの導入」、「Hello Worldの表示」、「MySQLとの連携テスト」をやってみました。
今回行った段階では、Node.jsの使いどころや利便性などは、ほとんど体感できませんでしたが、時代はすでにNode.jsに移行しています。
Node.jsは、現在のJavaScriptの世界において非常に重要な役割を果たしており、JavaScriptの進化について考える上でも欠かせない存在であるとともに、これまでのサーバーサイド開発の慣習に変革をもたらすともされています。
Node.jsはnpmというパッケージマネージャーを使って、様々なパッケージやモジュールを簡単にインストールすることもできます。
Node.jsからMySQLを操作することで、データベースとのやりとりも簡単に行うことができました。
これらのツールを使って、Webアプリケーションのバックエンド開発やAPIの作成など、多くの開発プロジェクトを実現することができます。
また、JavaScriptを使ってフロントエンドの開発も同時に行うことができるため、より一層効率的な開発が可能となります。
今後ももっと深く、Node.jsを学習していきたいと思います。
今回は以上となります。
ありがとうございました。