2016-05-04 22 views
3

替わる質問タイトル:イベントページがアンロードされないようにするにはどうすればよいですか?オンデマンドで永続的なバックグラウンドページを作成するには? (Google Chrome拡張機能)

タイマーのように動作する拡張機能を構築したいと思います。起動時に秒数をカウントダウンする必要がありますが、非アクティブで何もしないでください。

chrome.alarms APIは面白いですが、十分な精度や細かさがありません。たった1分に1回しか発火せず、遅く発火する可能性があります。それより頻繁に実行するものが必要な場合は、このAPIを使用できません。

次に、次の自然な解決策は、background pageを使用し、そこにsetTimeoutまたはsetIntervalを使用することです。しかし、バックグラウンドページは永続的であり、アイドル状態であってもリソース(例えば、メモリ)を占有する。だから彼らは理想的ではありません。

最も良い解決策は、タイマーを実行するevent pageのようです。しかし、ドキュメントは言う:

それがロードされると、イベントページは、(例えば、拡張APIを呼び出すか、ネットワーク要求を発行する)有効であるとして実行されているままになります。

[...]

イベントページが短時間(数秒)アイドル状態になっていたら、runtime.onSuspendイベントが送出されます。イベントページは強制的にアンロードされる前にこのイベントを処理するのに数秒間あります。

[...]

あなたの拡張子がwindow.setTimeout()またはwindow.setInterval()を使用している場合は、代わりに、アラームのAPIを使用するように切り替えます。イベントページがシャットダウンされると、DOMベースのタイマーは尊重されません。

残念ながら、アクティブなsetIntervalを持つことは、イベントページをアクティブにすると考えるには不十分です。事実、私のテストでは、10秒までの間隔でイベントページを実行するのに十分な時間がありますが、10秒または15秒を超える間隔は離れすぎてイベントページがアンロードされます。私はこれをmy crx-reload-tab projectでテストしました。私は私が何をしたいと考えてい


は妥協点です:

  • 私はロードし、需要にアンロードすることができた背景ページをしたいです。 (常にロードされ続けるものの代わりに)
  • 私がと言う限り、永続的なメモリにとどまるイベントページが必要です。それ以外の場合はアンロードできます。 (ブラウザによって自動的にアンロードされるものの代わりに)

可能ですか?どうしたらいいですか?

答えて

2

バックグラウンドページはオンデマンドでアンロードできず、Chromeはイベントページのライフサイクルを決定します(これを防ぐにはonSuspendに何もできません)。


あなたの懸念がタイマーである場合は、基本的に「スパース」ビジー待機のための短いタイマーにタイマーを分割され、this answerから私の解決策を試みることができます。イベントページをロードしたままにするだけで十分です。頻繁に行う必要がない場合は実行可能なソリューションです。あなたはメッセージパッシングを使用している場合は、未使用のメッセージポートを閉じてください

:一般的に


、ロードされたイベントページを維持するいくつかのものがあります。すべてのメッセージポートが閉じられるまで、イベントページはシャットダウンしません。

コンテンツスクリプトなどに開かれたままにしておく他のコンテキストがある場合は、これを悪用することができます。詳細はLong-lived connections docsを参照してください。


実際には、正確で細かいサブタイトルのタイマーが頻繁に必要な場合、イベントページは悪い解決策です。あなたのリソースを使用することによる利益は、それを正当化しないかもしれません。

+1

「ポート」を開いたままにしようとしましたが、他のコンテキストが開いていないことを覚えています。そのため、イベントページをアクティブに保つだけでは不十分です。私たちはどちらも、イベントページをアクティブに保つために短いタイムアウト/間隔を保つという回避策/解決策に同意したようです。 A *希薄なビジー待機ループ*、あなたがそれを呼んだとき。ありがとう! –

0

私はこの機能を使用します。

function _doNotSleep() { 
    if (isActive) { 
     setTimeout(() => { 
      fetch(chrome.runtime.getURL('manifest.json')); 
      _doNotSleep(); 
     }, 2000); 
    } 
} 

しかし、そのようなアプローチの問題は、デベロッパーツールのネットワークタブは、このHTTPスタブで汚染ということです。