JavaScript はシングルスレッドでイベントドリブンであり、実行を非同期にすることはできるけど、基本的に同時に一つのことしかできない。Web Workersを使えば、メインスレッドとは別のスレッドで処理を実行することができるので、メインスレッドとは別の処理を同時に実行することができる。Web Workers を使ったメインスレッドの負荷低減は今後のフロンドエンドにおいて必携の技術になると思われる。
なのだけど、Web Workers は意外と歴史があり(よく知らないけど)、IE10 でも動作する(Can I use Web Workers)。
IE10 は IE8 と比べるとだいぶ良いのだけど、それでも ES5(ES2015 ではない)までしか対応していない(ECMAScript 5 compatibility table)。Fetch API など一部の Web API にも対応していない(Can I use Fetch API)など、いろいろつらい部分がある。
とはいえ、Babel とかで transpile してしまえばたぶん問題は起きないと思し、Fetch API についても polyfill を入れることで解決する。だから「Web Workers はモダンブラウザでしか動作しないから、モダンブラウザ向きの処理をしても良い」と誤解しなければ、さほど困らない。たぶん。
このあたり、Service Worker では少し事情が異なり、Service Worker の場合は、Service Worker 自体がモダンブラウザでしか動作しない。Service Worker 用のスクリプトはモダンブラウザ向けに書いてしまっても特段問題ない。
Web Workers の方が歴史があるわりに今まで必携の機能ではなかった。プッシュ通知などの機能を持った Service Worker の方がサービスに先に導入されやすい。そうした事情から、Service Worker に携わった後に、Web Workers を導入し始める場合も多いと思う。そこに「Web Worker も Service Worker と同じように動く(モダンブラウザでしか動作しないからそれを前提に作ってもいい)」と誤解するという罠がある。
というメモ。