サイトアイコンmaita tomoya dev io

JavaScript

frontend-languages

JavaScript

はじめに

JavaScriptは、Webブラウザで動作する唯一のプログラミング言語であり、世界で最も広く使われている言語の一つです。1995年に誕生して以来、Webの進化とともに成長し続け、現在ではフロントエンドだけでなく、バックエンド、モバイルアプリ、デスクトップアプリ、IoTまで幅広い領域で使われています。

本記事では、技術選定の観点からJavaScriptの特徴、強み、弱み、適しているユースケースを詳しく解説します。


歴史

タイムライン

1995  Brendan EichがNetscape社で10日間で開発(当初はMocha、後にLiveScript)
  |
1996  JavaScriptに改名。Microsoft がJScript を開発(IE向け)
  |
1997  ECMAScript 1 標準化(ECMA-262)
  |
1999  ECMAScript 3(正規表現、try/catch)
  |
2005  Ajax(Asynchronous JavaScript and XML)の普及。Gmail、Google Maps
  |
2006  jQuery 登場。ブラウザ互換性の問題を解決
  |
2008  Google Chrome + V8エンジン登場。JavaScript高速化の転機
  |
2009  Node.js 登場。サーバーサイドJavaScriptの幕開け
  |
2009  ECMAScript 5(strict mode、JSON対応、Array メソッド)
  |
2015  ECMAScript 2015 (ES6) ★ 革命的アップデート
  |    - let/const、アロー関数、クラス構文、Promise
  |    - テンプレートリテラル、分割代入、モジュール
  |
2017  ECMAScript 2017 (async/await) 非同期処理の劇的改善
  |
2017~ 毎年の定期リリース(ES2018, ES2019, ...)
  |
2020  Optional Chaining (?.)、Nullish Coalescing (??)
  |
2024  ECMAScript 2024(Array grouping、Promise.withResolvers等)
  |
2025~ 引き続き進化中(Temporal API、Pattern Matching等の提案)

ES6革命

2015年のES6(ECMAScript 2015)は、JavaScriptの歴史における最大の転換点です。

ES5以前:

// var のスコープ問題
var i
for (i = 0; i < 5; i++) {
  setTimeout(function () {
    console.log(i) // 全て5が出力される
  }, 100)
}

// コールバック地獄
getUser(function (user) {
  getOrders(user.id, function (orders) {
    getDetails(orders[0].id, function (details) {
      console.log(details)
    })
  })
})

ES6以降:

// let/const でブロックスコープ
for (let i = 0; i < 5; i++) {
  setTimeout(() => {
    console.log(i) // 0, 1, 2, 3, 4 が正しく出力される
  }, 100)
}

// async/await で直感的な非同期処理
const user = await getUser()
const orders = await getOrders(user.id)
const details = await getDetails(orders[0].id)
console.log(details)

強み

1. ブラウザで唯一ネイティブに動く言語

WebAssemblyの登場により他の言語もブラウザで動作可能になりましたが、DOM操作やブラウザAPIへの直接アクセスはJavaScriptのみです。

+-------------------------------------------------------+
|                     Webブラウザ                          |
+-------------------------------------------------------+
|                                                       |
|   JavaScript ←→ DOM API    ←→  画面描画                |
|       ↓                                               |
|   ブラウザAPI                                          |
|   - fetch(HTTP通信)                                  |
|   - localStorage(データ保存)                          |
|   - WebSocket(リアルタイム通信)                        |
|   - Web Workers(並列処理)                             |
|   - Canvas/WebGL(グラフィックス)                       |
|   - Web Audio API(音声処理)                           |
|                                                       |
|   WebAssembly(Rust, C++等)                           |
|   → 計算処理は高速だが、DOM操作にはJSが必要              |
|                                                       |
+-------------------------------------------------------+

2. フロントエンド・バックエンド両方で使える

+-------------------+        +-------------------+
|   フロントエンド    |        |   バックエンド      |
+-------------------+        +-------------------+
| React             |        | Node.js           |
| Vue.js            |  同じ  | Express           |
| Angular           |  言語  | Hono              |
| Svelte            | <----> | Fastify           |
| Next.js (SSR)     |        | NestJS            |
+-------------------+        +-------------------+
        |                            |
        |     JavaScript / TypeScript |
        +----------------------------+

メリット:
- フロントエンドとバックエンドで型定義を共有できる
- チーム全員が同じ言語を書ける
- 学習コストが抑えられる

3. 巨大なエコシステム

npmは世界最大のパッケージレジストリです。

パッケージマネージャーパッケージ数(概算)週間ダウンロード数
npm (JavaScript)200万+数十億
PyPI (Python)50万+数億
Maven Central (Java)60万+数億
crates.io (Rust)15万+数千万

4. 学習リソースが豊富

JavaScriptは最も学習リソースが豊富な言語です。

  • 公式ドキュメント(MDN Web Docs)が非常に充実
  • Stack Overflowでの質問・回答数がトップクラス
  • 書籍、オンライン講座、チュートリアルが大量に存在
  • 日本語の情報も豊富

弱み

1. 型安全性がない

JavaScriptは動的型付け言語であり、実行時まで型エラーが検出されません。

// 意図しない型変換
console.log('5' + 3) // "53"(文字列結合)
console.log('5' - 3) // 2(数値減算)
console.log(true + 1) // 2
console.log(null + 1) // 1
console.log([] + []) // ""
console.log({} + []) // "[object Object]"

// 比較の罠
console.log(0 == '') // true
console.log(0 == '0') // true
console.log('' == '0') // false(!)

この弱みを解決するのがTypeScriptです(次の記事で詳述)。

2. thisの挙動が複雑

const obj = {
  name: 'Alice',
  greet: function () {
    console.log(this.name) // "Alice"

    setTimeout(function () {
      console.log(this.name) // undefined(thisがwindowを指す)
    }, 100)

    // アロー関数で解決
    setTimeout(() => {
      console.log(this.name) // "Alice"(外側のthisを引き継ぐ)
    }, 100)
  },
}

3. シングルスレッド

JavaScriptはシングルスレッドで動作するため、CPU集約型の処理には向いていません。

JavaScript(シングルスレッド + イベントループ)

  メインスレッド
  +----+----+----+----+----+----+----+-->
  |タスク|タスク|タスク|タスク|タスク|タスク|
  +----+----+----+----+----+----+----+

  CPU集約型の処理が入ると:
  +----+====================+----+----+-->
  |タスク|    重い計算処理      |タスク|タスク|
  +----+====================+----+----+
         ↑ この間、他の処理がブロックされる

  対策: Web Workers(ブラウザ)/ Worker Threads(Node.js)
  メインスレッド:  +----+----+----+----+-->
  Workerスレッド:  +====================+-->  (並行処理)

4. ブラウザ互換性の歴史的課題

現在は大幅に改善されましたが、古いブラウザをサポートする必要がある場合、Babelなどのトランスパイラが必要になります。


適しているユースケース

ユースケース適合度理由
Webアプリケーション(SPA)非常に高いブラウザで動く唯一の言語
フルスタック開発高いFE/BEを同じ言語で統一できる
プロトタイプ/MVP非常に高い開発速度が速い
スタートアップ高いエコシステムが豊富、採用しやすい
リアルタイムWebアプリ高いNode.jsのイベントループが最適
サーバーレス高いLambda等のコールドスタートが速い
BFF(Backend for Frontend)高いフロントエンドとの親和性が高い

適していないユースケース

ユースケース適合度理由代替技術
CPU密集型処理低いシングルスレッドRust、Go、C++
システムプログラミング非常に低いメモリ管理不可Rust、C/C++
機械学習/データサイエンス低いエコシステム不足Python
組み込みシステム非常に低いリソース制約C、Rust
大規模バッチ処理やや低い型安全性の欠如Java、Go

実際のプロダクト例

Netflix

技術スタック(フロントエンド):
- React + JavaScript/TypeScript
- Node.js (バックエンドのBFF層)

採用理由:
- フロントエンドとBFFの言語統一
- Reactによる高速なUI開発
- Node.jsの非同期I/Oによるストリーミング処理

PayPal

移行の背景:
- Java + Spring → Node.js + Express に一部移行

結果:
- 開発速度が2倍に向上
- コード行数が33%減少
- リクエスト処理時間が35%短縮
- ページ提供速度が200ms高速化

LinkedIn

技術スタック:
- モバイルアプリのサーバーサイドをRuby on Rails → Node.jsに移行

結果:
- サーバー台数を30台から3台に削減
- パフォーマンスが最大20倍向上

パフォーマンス特性

V8エンジンとJITコンパイル

JavaScriptのコード
    |
    v
+-------------------+
| パーサー           |  ← ソースコードを解析
+-------------------+
    |
    v
+-------------------+
| AST(抽象構文木)   |  ← コードの構造を木構造で表現
+-------------------+
    |
    v
+-------------------+
| Ignition          |  ← バイトコードインタプリタ
| (インタプリタ)     |     最初は解釈実行(起動が速い)
+-------------------+
    |
    | ホットパス検出(繰り返し実行されるコード)
    v
+-------------------+
| TurboFan          |  ← 最適化コンパイラ
| (JITコンパイラ)    |     頻繁に実行されるコードを機械語に変換
+-------------------+
    |
    v
  ネイティブコード(高速実行)

イベントループ

+-----------------------------------------------------------+
|                    Node.js イベントループ                    |
+-----------------------------------------------------------+
|                                                           |
|   リクエスト1 → コールバック登録 → I/O待ち                   |
|   リクエスト2 → コールバック登録 → I/O待ち                   |
|   リクエスト3 → コールバック登録 → I/O待ち                   |
|                                                           |
|   イベントループ:                                           |
|   +------+                                                |
|   |      | ← I/O完了イベントを検知                          |
|   | Loop | ← 対応するコールバックを実行                      |
|   |      | ← 次のイベントを検知...                           |
|   +------+                                                |
|                                                           |
|   I/O完了: リクエスト2 → コールバック実行 → レスポンス返却    |
|   I/O完了: リクエスト1 → コールバック実行 → レスポンス返却    |
|   I/O完了: リクエスト3 → コールバック実行 → レスポンス返却    |
|                                                           |
+-----------------------------------------------------------+

メリット: 大量の同時接続を少ないリソースで処理できる
デメリット: CPU集約型の処理でブロックされる

エコシステムの規模

主要なフレームワーク・ライブラリ

カテゴリ名前用途
UIライブラリReactコンポーネントベースのUI構築
UIフレームワークVue.js学習しやすいUIフレームワーク
UIフレームワークAngularフルスタックフロントエンドFW
UIフレームワークSvelteコンパイル時最適化
メタフレームワークNext.jsReact向けSSR/SSG
メタフレームワークNuxt.jsVue.js向けSSR/SSG
バックエンドExpress軽量Webフレームワーク
バックエンドHono高速・軽量Webフレームワーク
バックエンドFastify高性能Webフレームワーク
バックエンドNestJS構造化されたバックエンドFW
テストVitest高速テストランナー
テストPlaywrightE2Eテスト
ビルドVite高速ビルドツール
ビルドTurbopackNext.js向けビルドツール
パッケージ管理npm / pnpm / yarnパッケージマネージャー
リンターESLint / Biomeコード品質チェック

学習曲線

生産性
  ^
  |
  |                                        ........... 上級者
  |                                  ...../
  |                            ...../
  |                       ..../
  |                  ...../
  |             ..../
  |         .../  ← フレームワーク学習
  |       ./      (React、Vue等)
  |     ./
  |    /  ← 基本文法の習得は比較的容易
  |   /
  |  /
  | /
  |/
  +-----------------------------------------> 学習時間
  0    1ヶ月   3ヶ月   6ヶ月   1年     2年

  フェーズ1(0〜1ヶ月): 基本文法、DOM操作
  フェーズ2(1〜3ヶ月): 非同期処理、ES6+機能
  フェーズ3(3〜6ヶ月): フレームワーク(React/Vue等)
  フェーズ4(6ヶ月〜1年): Node.js、ビルドツール、テスト
  フェーズ5(1年〜): アーキテクチャ、パフォーマンス最適化

採用市場の状況

JavaScriptエンジニアの市場動向(2025-2026年)

指標状況
求人数非常に多い(Web開発の求人の大多数がJS必須)
候補者数非常に多い
競争率高い(差別化が必要)
平均年収フロントエンド: 中〜高、フルスタック: 高
将来性ブラウザがある限り需要は安定

キャリアパスの例

JavaScript初学者
    |
    v
フロントエンドエンジニア(React/Vue + JS)
    |
    +---> フルスタックエンジニア(+ Node.js)
    |
    +---> TypeScriptへの移行(大規模開発)
    |
    +---> テックリード / アーキテクト

まとめ: JavaScriptの技術選定での位置づけ

5段階評価

評価項目スコアコメント
パフォーマンス3/5I/O処理は得意、CPU処理は苦手
型安全性1/5動的型付け。TypeScriptで補完可能
学習曲線4/5入門しやすい。深い理解には時間が必要
エコシステム5/5世界最大のパッケージ数
採用市場5/5最も求人が多い言語の一つ
スケーラビリティ3/5水平スケーリングは可能だが設計が必要
開発速度4/5プロトタイプに最適
保守性2/5型がないため大規模開発では課題

JavaScriptを選ぶべきとき

  • Webアプリケーションを作りたい
  • プロトタイプを素早く作りたい
  • フルスタックで言語を統一したい
  • スタートアップで素早くMVPを出したい
  • チームがJavaScriptに慣れている

JavaScriptを選ぶべきでないとき

  • 大規模チームでの開発(TypeScriptを検討)
  • CPU集約型の処理が中心
  • 型安全性が重要なドメイン(金融、医療等)
  • システムプログラミング

参考資料