Node.js vs ブラウザ
1. 実行環境における主な違い
Node.jsとブラウザはどちらもJavaScriptを実行しますが、その環境(Environment)と機能(Capabilities)は大きく異なります。
- 用途: Node.jsはサーバーサイド開発のために設計されており、ブラウザはクライアントサイド(ユーザー側)のアプリケーションのために存在します。
- API: Node.jsは、ブラウザには存在しないファイルシステム(File System)、ネットワーキング(Networking)、OSレベルのAPIを提供します。逆に、ブラウザはNode.jsにはないDOM(Document Object Model)、Fetch、UI APIを提供します。
- グローバルオブジェクト: Node.jsでは
globalを使用しますが、ブラウザではwindowまたはselfを使用します。 - モジュール(Modules): Node.jsは CommonJS (require) と ES Modules (import) の両方をサポートします。ブラウザは主に ES Modules または従来の
<script>タグを使用します。 - セキュリティ: ブラウザは権限が制限されたサンドボックス(Sandbox)内で動作しますが、Node.jsはファイルシステムやネットワークへのフルアクセス権限を持っています。
- イベントループ(Event Loop): どちらの環境もイベントループを使用しますが、Node.jsにはタイマーやプロセス処理のための追加APIが存在します。
- 環境変数(Environment Variables): Node.jsは環境変数(
process.env)にアクセスできますが、ブラウザは直接アクセスできません。 - パッケージ管理: Node.jsは npm や yarn を使用します。ブラウザでは CDN や バンドラー(Bundler) を通じてライブラリを利用します。
2. 具体的なコード例
2.1 グローバルオブジェクト
それぞれの環境でグローバルな値を保持する方法が異なります。
// Node.js の場合
global.mylet = 42;
console.log(global.mylet); // 42
// ブラウザ の場合
window.mylet = 42;
console.log(window.mylet); // 422.2 ファイルアクセス
Node.jsはサーバー上のファイルを操作できますが、ブラウザはセキュリティ上の理由で制限されています。
// Node.js の場合
const fs = require('fs');
fs.readFile('myfile.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data); // ファイルの内容を出力
});
// ブラウザ の場合
// セキュリティ上の理由により、ローカルファイルへの直接アクセスは許可されていません2.3 HTTP リクエスト
Node.jsには標準の https モジュールがありますが、ブラウザでは fetch が一般的に使われます。
// Node.js の場合
const https = require('https');
https.get('https://example.com', res => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => console.log(data));
});
// ブラウザ の場合
fetch('https://example.com')
.then(response => response.text())
.then(console.log);2.4 モジュールシステム
Node.jsでは require が主流ですが、フロントエンドでは import が標準です。
// Node.js (CommonJS)
const fs = require('fs');
// Node.js & ブラウザ (ES Modules)
// import fs from 'fs'; // Node.jsのみ、ブラウザでは不可
// import _ from 'https://cdn.jsdelivr.net/npm/lodash-es/lodash.js'; // ブラウザでの利用例3. 比較表
| 機能 | Node.js | ブラウザ |
|---|---|---|
| ファイルシステムへのアクセス | あり | なし |
| ネットワーキング (TCP/UDP) | あり | なし |
| DOM アクセス | なし | あり |
| グローバルオブジェクト | global | window / self |
| モジュール | CommonJS / ESM | ESM / Scripts |
| 環境変数 | あり (process.env) | なし |
| セキュリティ | OSへのフルアクセス | サンドボックス化 |
| パッケージ管理 | npm / yarn | CDN / バンドラー |