ウェブブラウザの off-the-main-thread API の話
実際にWebWorkerを使ってる感想shokai.icon
Worker poolを作るのがちょっと面倒
だけど我慢できない程ではない
Workerの起動コストが高い
プロセスとして起動する部分だけでなく、new window.Worker(url)を呼ぶ毎にHTTPリクエストがサーバーに飛ぶのがちょっとやっかい
まあしょうがないか
複数のWebWorkerそれぞれでlodashとかをmodule bundleしていると、1つ1つのworkerのサイズが大きくなってしまう 最終的に、3種類の処理ができる1つのworkerを作って
3箇所から個別にworker立てておいて
それぞれで使うようにした
こんな感じ
code:worker.js
onmessage = e => postMessage(exec(e.data))
function exec ({name, data}) {
debug({name, data})
switch (name) {
case 'quick-search:compile':
return compileQuickSearch(data)
case 'related-page:compile':
return compileRelatedPages(data)
}
}
1つのworkerで複数taskを実行できるようにしている
大きなjsライブラリをbundleしてworkerが巨大になってしまっても、workerのダウンロードが1回で済む
2つ目以降のworkerは、サーバーが304 Not Modifiedを返せばダウンロードせずcacheを使うので
自分が書いたアプリケーションコードよりもライブラリの方がサイズが大きい
nodejsのライブラリはdebugというnpmでログを出す物が結構ある
WebWorkerにはどちらも無いので、debugが何も出ない
まあこれはdebug側の実装の問題か