JavaScriptはシングルスレッドで動作しているので、ロックされてしまう処理があると他の処理まで影響を受けてしまいます。なるべく処理は短く終われるのが理想で、そのためには既存の状態を調査しなければなりません。 今回紹介するobstructed.jsはそうした処理のロックを感知するソフトウェアです。

obstructed.jsの使い方

テスト用のコードです。下の処理にて100ms、処理を指定しています。

const obstructedTimer = obstructed((time) => {
  logdown.warn(`obstructed by ~${time}ms`)
  clearInterval(obstructedTimer)
}, {threshold: 10})

setTimeout(() => {
  logdown.log('Blocking main thread')
  var start = Date.now()
  msleep(100)
  logdown.log(`Releasing main thread. *${Date.now() - start}ms* blocked.`)
}, 500)

これを実行すると次のように結果が返ってきます。

$ node example/index.js 
Listening for obstructed main thread
Blocking main thread
Releasing main thread. 100ms blocked.
⚠  obstructed by ~99ms

obstructed.jsを使えばメインスレッドが停止したのを感知してログに残したりできます。どこで止まったのかは分からないのですが、それでもメインスレッドが止まるような処理があれば、何とか探して修正する必要があるでしょう。

obstructed.jsはnode/JavaScritp製のオープンソース・ソフトウェア(MIT License)です。

caiogondim/obstructed.js: Checks if the main thread is busy, executing a callback whenever it happens