Google Chrome runs web pages and applications with lightning speed.

WebアプリケーションやWebサイトの開発にあたり、クロスブラウザ対応や将来リリースされるブラウザに対応するための開発テクニック「フィーチャーディテクション」が注目されている。フィーチャーディテクションではブラウザがサポートしている機能を調査し、機能がサポートされている場合にはその機能を使って実装を進めるというアプローチをとる。この方法であればどのブラウザを使っているのかを気にする必要がなく、また、将来のバージョンのブラウザで機能がサポートされた場合に、自動的にその機能が利用できるようになる。ブラウザの種類で処理を切り分ける従来の方法よりも柔軟性が高く効果的だとして注目されている。

しかし「フィーチャーディテクション」の方法に問題がないわけではない。最大の問題は処理が遅くなるということだ。そもそも性能が低いモバイルデバイスのブラウザや、JavaScriptエンジンの性能が低い古いバージョンのブラウザでは顕著な問題となる。このあたりの話題が、GoogleでChrome Frameの開発に携わっているAlex Russell氏のブログにまとまっている。Alex Russell氏は「フィーチャーディテクション」の最大の問題点となる遅さを指摘し、次のような回避方法を紹介している。

  • ブラウザが提供するWeb関連の機能はブラウザの同じバージョン内で変わるということはない。あらかじめ対象となるブラウザがサポートしている機能は明白なのだから、どの機能がサポートされているかを事前にキャッシュデータとして用意して「フィーチャーディテクション」における機能検出として利用する。こうすれば機能検出にかかる時間を短縮できる。
  • 動作しているブラウザがなんであるか不明である場合に、純粋に「フィーチャーディテクション」の処理を実施するようにする。

ブラウザやブラウザのバージョンを判定して処理を切り分ける方法は、「フィーチャーディテクション」が流行する以前に主流だった方法。どちらの方法にも利点と欠点があるため、双方の利点を活用するように組み合わせて使用すればいいというのがAlex Russell氏の主張だ。この主張を、同じくJavaScriptプログラミングテクニック関連で人気のあるNicholas C. Zakas氏が自分のブログで紹介している。Alex Russell氏の主張を補説するとともに、次のテクニックを追加紹介している。

  • ブラウザがサポートしている機能をキャッシュとして事前に用意しておくのはIE6、IE7、モバイルブラウザなど古いブラウザと処理性能が低いデバイスでのブラウザのみで十分。逆に、Chromeのように頻繁にバージョンがアップするブラウザにはキャッシュを用意しても効果が低い。

すべての処理を「フィーチャーディテクション」で実装すれば、それだけ処理が重くなる。これは性能の低いJavaScriptエンジンを搭載した古いブラウザや、処理性能が低いモバイルデバイスなどで特に問題となる。「フィーチャーディテクション」とブラウザ検出の機能を組み合わせるこのテクニックは、より多くのブラウザに対応する方法として興味深い。