NodeJS 速習チュートリアル

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は npmyarn を使用します。ブラウザでは CDNバンドラー(Bundler) を通じてライブラリを利用します。

2. 具体的なコード例

2.1 グローバルオブジェクト

それぞれの環境でグローバルな値を保持する方法が異なります。

// Node.js の場合
global.mylet = 42;
console.log(global.mylet); // 42

// ブラウザ の場合
window.mylet = 42;
console.log(window.mylet); // 42

2.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 アクセスなしあり
グローバルオブジェクトglobalwindow / self
モジュールCommonJS / ESMESM / Scripts
環境変数あり (process.env)なし
セキュリティOSへのフルアクセスサンドボックス化
パッケージ管理npm / yarnCDN / バンドラー