- 昔のWebではfetchは「存在していなかった」だけではありません
- fetch以前のブラウザは非同期処理を持っていなかった
- ブラウザの違いが致命的だった
- JSONがまだ標準ではなかった
- エラーハンドリングの差
- なぜfetchが普及したのか
- 注意点:fetchはjQuery.ajaxの完全上位互換ではない
- まとめ
昔のWebではfetchは「存在していなかった」だけではありません
「昔はjQuery.ajaxを使っていたけど、今はfetchを使う」という説明はよく見かけます。
しかしこれは少し誤解を生みます。
理由は単純に
fetchがなかったから
ではありません。
正確には、
- fetchが存在しなかった
- 代替手段もなかった
- ブラウザの非同期処理が未成熟だった
この3つが同時に起きていました。
その穴を埋めていたのがjQuery.ajaxです。
つまりjQuery.ajaxは便利ライブラリではなく、当時のWebにおける「必須インフラ」に近い存在でした。
fetch以前のブラウザは非同期処理を持っていなかった
現在のJavaScriptはPromiseやasync/awaitが使えます。
ところが昔のJavaScriptにはPromiseがありませんでした。
非同期処理の書き方はイベントだけです。
xhr.onreadystatechange = function(){ if(xhr.readyState === 4){ if(xhr.status === 200){ // 成功処理 } } };
これには問題があります。
- 成功と失敗が分かりづらい
- ネストが深くなる
- 複数通信の管理が困難
- エラー伝播ができない
つまり、通信処理は書けても「アプリケーション」が書けませんでした。
jQuery.ajaxはここに手を入れ、success / error / complete という分岐構造を提供しました。
$.ajax({ url: "/api", success: function(){}, error: function(){} });
これだけで非同期の流れが理解できるようになりました。
当時としては非常に大きな改善です。
ブラウザの違いが致命的だった
現在の開発者が想像しにくい最大の理由がここです。
昔のブラウザは「同じJavaScriptが動かない」のが普通でした。
具体的にはXMLHttpRequestの生成方法すら違いました。
var xhr; if (window.XMLHttpRequest) { xhr = new XMLHttpRequest(); } else { xhr = new ActiveXObject("Microsoft.XMLHTTP"); }
これはInternet Explorer対応コードです。
さらに問題はこれだけではありません。
- POST送信で文字化け
- キャッシュ挙動の差
- ヘッダ設定の制限
- 同期通信の挙動差
- ステータスコードの違い
つまり「通信コードを書くたびにバグる」状況でした。
jQuery.ajaxはブラウザごとに内部実装を分岐し、
開発者には単一APIだけを見せました。
これが普及した最大の理由です。
JSONがまだ標準ではなかった
現在はAPIといえばJSONが前提です。
しかし昔はそうではありませんでした。
- XMLレスポンス
- HTML断片
- テキスト
- JavaScriptコード
すべて混在していました。
XMLHttpRequestはデータを文字列で返します。
つまり開発者が自分で判断しなければなりません。
jQuery.ajaxはここも吸収しました。
| dataType | 動作 |
| json | 自動でJSON.parse |
| html | DOM挿入用処理 |
| script | 実行 |
| xml | XMLDocumentとして解析 |
この自動判別が「とりあえず通信できる」体験を作りました。
fetchにはこの自動変換はありません。
常に明示的に書く必要があります。
fetch("/user.json") .then(res => res.json()) .then(data => console.log(data));
現在はこれが普通ですが、当時はこの構造自体が存在しませんでした。
エラーハンドリングの差
XMLHttpRequestの難しさの一つは、通信失敗とHTTPエラーの区別です。
例えば404は通信成功です。
サーバ応答があるためです。
初心者が最もハマるポイントでした。
jQuery.ajaxはこの判断を内部で行い、errorコールバックに統一しました。
つまり
- ネットワーク断
- 500エラー
- 404
を同じ書き方で処理できます。
これは地味ですが、実務では非常に大きな価値でした。
なぜfetchが普及したのか
fetchが普及した理由は「jQueryが不要になった」からです。
その背景にはブラウザの進化があります。
変化したポイント**
- Promiseが標準化された
- CORSが標準化された
- JSONが前提になった
- ブラウザ差異が減少した
- ES6以降の構文が使えるようになった
つまり、かつてjQueryが補っていた部分をブラウザ自身が持つようになりました。
fetchは新しい技術というより、
jQuery.ajaxの役割をブラウザが内蔵した形です。
注意点:fetchはjQuery.ajaxの完全上位互換ではない
fetchは便利ですが、初心者が戸惑うポイントがあります。
fetchはHTTPエラーで例外を投げません。
fetch("/notfound") .then(res => console.log(res.ok)); // false
404でもthenに入ります。
これはXMLHttpRequestと同じ仕様です。
jQuery.ajaxのerrorコールバックの挙動に慣れていると、ここで混乱します。
実務でもバグの原因になりやすい部分です。
まとめ
昔jQuery.ajaxが使われていた理由は、単なる流行ではありません。
当時のWebは
- 非同期が扱いにくい
- 通信が不安定
- ブラウザが統一されていない
という状態でした。
jQuery.ajaxはこれをまとめて解決し、「Webアプリケーションを書くこと」を現実的にしました。
現在はfetchが使われますが、それはjQueryが不要になったからではなく、
jQueryが解決した問題がブラウザ標準になったからです。
技術が消えたのではなく、役割が吸収された。
これが、jQuery.ajaxからfetchへ移行した本当の理由です。