最近はDenoの普及により、Web APIの利用機会が増えました。Web APIが使えることはメリットの一つとされていますが、なぜWeb APIを使えることが良いことだとされているのか、改めて考えてみたいと思います。
そもそもWeb APIとは何か
JavaScriptはランタイムによる拡張が許されている言語です。全てのランタイムで使えるArray
、Map
などの標準組み込みオブジェクトのほかに、固有のランタイムでしか使えないfetch
やprocess
などの拡張APIがあります。
この拡張API、ランタイムごとにいくつかの種類が存在します。例えば、
- Node.jsで使えるNode.js API
- Denoで使えるDeno API
- ブラウザなどで使えるWeb API
などが該当します。
このうち「Web API」はwhatwgで定義されており、みなさんがいつもブラウザで使っているfetch
、document
、HTMLElement
、URL
などが含まれています。
近年ではWeb APIをブラウザだけでなくNode.jsやDenoにも導入し、サーバーサイドでもWeb APIを使おうという動きが広がっています。
この動きについて、どういうメリットがあるのか整理したいと思います。
Web APIをサーバー側にも導入するメリット
JavaScript実行環境はブラウザとサーバー、だけではない
JavaScriptが動く場所はブラウザとサーバーだけでなく多岐にわたります。筆者が認知しているJavaScriptランタイムとしては以下のような種類があります。
- ブラウザ
- Node.js
- Deno
- Google Apps Script
- ブラウザの拡張機能
- Waveformsという波形解析ツールで動くスクリプト
もし仮に、各ランタイムが完全に別々のAPIを採用していたらどうなるでしょうか?
各ランタイム共通で動作するコードを書くためには、
if (EventTarget) else if (EventEmitter) else if (MyEventEmitter) else if (SugoiEventEmitter) else if (OreOreEventEmitter) else if (EventEmitterPollyfil) else ...
(以下略)となるのが目に見えますね。
このような状況を防ぐためには、事前にWeb APIというランタイム共通の仕様を定めておき、各ランタイムが必要な場合はその仕様に沿って実装するという方法が最善です。
もちろん、全てのWeb APIを実装する必要はありません。APIの中から一部の機能だけ実装することになるとしても、別のAPIを「車輪の最発明」するよりはいいです。
Denoは(自分が知る範囲では)この方針であり、「導入したいAPIがWeb APIにあれば、それを実装する」「Web APIにあるものでも、Denoにとって必要なければ実装しない」という方針になっています。
かつてInternet explorerとNetScapeという2つのブラウザが主流だった頃、両者のAPIには互換性がありませんでした。違うブラウザでは実装を共有できないのが当たり前だった時代だと思います。しかし、共通のAPIを実装しなかったブラウザは廃れました。
今はブラウザとサーバーで実装を共有できないのが当たり前な時代ですが、いつかはそんな常識も破られる日が来るかもしれません。
WPTによるテスト
Web APIには「WPT(Web Platform Test)」が存在します。これはその名の通り、Web API向けのテストコードです。
Web APIを実装するランタイムは、WPTにあるテストコードを使って実装をテストします。
仮に、Web APIではない独自のAPIが実装されたランタイムがあるとします。
その場合は当然、テストも1から実装されることになります。普通のユーザーから見れば、テストが正しいかどうかなんて分かりません。
その点、Web APIを使っているランタイムなら、WPTの通過率を見ることでAPIの信頼性を他のランタイムと比較することができます。WPTという信頼度の高いテストが最初から用意されているというのが、Web APIを使うメリットです。
仕様が堅牢
JavaScriptは特殊な言語です。一度stable(安定)としてWebに出荷されたAPIは、基本的には後方互換性のために削除できません。
この「削除できない」という理由から過去の古いAPI(atob
やXMLHttpRequest
)がまだ残っていることが批判の対象になっていたりしますが、それはまあそういう物です。後方互換性のために残っているだけなので無視してください。
話を元に戻します。一度出荷されたAPIは削除できないことから、最近作られるWeb APIは堅牢な設計になっています。ライブラリのアップデートで使い方が変わり、コードの書き換えを余儀なくされた経験がある方も多いと思いますが、Web APIについてはそういう事が無いので安心して使えます。
Web APIの設計方針については、こちらのページが詳しいです。
まとめ
Web APIが利用できることは以下のようなメリットがあります。
- 多数のJavaScript実行環境で共通の仕様を持つことで分断を回避する
- WPTによるテストで信頼性を確保
- 堅牢なAPI設計