P粉0345716232023-08-25 17:51:37
chrome.webRequest API とは異なり、chrome.webNavigation API は完璧に機能します。chrome.webNavigation API は Service Worker を起動できるため、これで、chrome.webRequest API API を chrome.webNavigation に組み込むことができます。
リーリーP粉3863180862023-08-25 00:41:03
###目次###
######解決:###
• エクスプロイトAPI
•ネイティブメッセージング
API
•
WebSocket
API
•
chrome
メッセージング API
• 専用タブ
######知らせ###
定義上、Service Worker (SW) は永続化できず、ブラウザは一定時間 (Chrome では 5 分) が経過すると、すべてのアクティビティ/リクエストを強制的に終了する必要があります。非アクティブ タイマー (つまり、そのようなアクティビティが行われていないとき) はさらに短く、30 秒です。
適切であると考えています (チームは特定の側面を緩和することがあります。たとえば、Chrome 114 は各メッセージの後に chrome.runtime ポートを拡張します)。ただし、これは観察結果が拡張機能ではない場合にのみ適用されます。 1 日に数回しか実行されない頻繁なイベントにより、実行間のブラウザのメモリ フットプリントが削減されます (例: URL を使用した webRequest/webNavigation イベント > めったにアクセスしないサイトのフィルタリング)。これらの拡張機能は、状態を維持するために再設計できます (
Example
問題 1: Chrome 106 以前では、webRequest イベントのソフトウェアが起動されません。 他の回答に示されているように、
chrome.webNavigation問題 2: スタッフがイベントのためにランダムに起きなくなる。 p>
解決策は、chrome.runtime.reload() を呼び出すことです。
Chrome 109 以前では、既に実行されているバックグラウンド スクリプトからの新しい chrome API イベント
のソフトウェア ライフサイクルを延長できません。これは、30 秒の非アクティブ タイムアウトの最後の数ミリ秒以内にイベントが発生した場合、コードは何も非同期で確実に実行できないことを意味します。これは、ユーザーが拡張機能が信頼できないと考えることを意味します。 質問 4: 拡張機能がリモート接続を維持するか、状態 (変数) の再構築に時間がかかる場合、または次のようなイベントが頻繁に発生する場合、パフォーマンスは MV2 よりも悪くなります。
chrome.webNavigation 範囲がまれな URL に限定されない場合、
chrome.webRequest 範囲がまれな URL またはタイプに限定されない場合、
新しいイベントのために SW を起動することは、基本的に新しいタブを開くことに似ています。環境の作成には約 50 ミリ秒、SW スクリプト全体の実行にはおそらく 100 ミリ秒 (コードの量によっては 1000 ミリ秒)、ファイルの読み取りにはおそらく 1 ミリ秒 (またはデータによっては 1000 ミリ秒) かかります。保管時の状態と再構築/ハイドレート。複雑さ)。ほとんど空のスクリプトを使用した場合でも、少なくとも 50 ミリ秒かかります。これは、わずか 1 ミリ秒しかかからないイベント リスナーを呼び出すのにかなりのオーバーヘッドです。
SW は 1 日に何百回も再起動される可能性があります。このようなイベントは、タブをクリックしてから何かを書き込むなど、自然なギャップのあるユーザー アクションに応じて生成され、その間にソフトウェアが終了し、新しいイベントが発生した場合に再起動されるためです。 CPU、ディスク、バッテリーを消費し、一般にスケーリングの応答に頻繁に認識可能な遅れが生じます。
Chrome 110 にはバグが導入されました。非同期 chrome
API を呼び出すと、ワーカー スレッドがさらに 30 秒間実行されます。このバグはまだ修正されていません。
//Background.js
リーリーKevin Augusto による寄稿。
Chrome 109 以降では、リーリー
リーリー
リーリー
リーリー
ホストタイムの「永続的」サービス ワーカー スレッド
chrome.runtime.connectNative を渡すだけです。クラッシュまたはユーザーの操作によりホスト プロセスが終了した場合、ポートは閉じられ、ソフトウェアは通常どおり終了します。ポートの onDisconnect イベントをリッスンすることで、chrome.runtime.connectNative が再度呼び出されないようにすることができます。
WebSocket がアクティブな間、「永続的な」Service Worker スレッドを実行します接続可能なタブが存在する間は「永続的」サービスワーカー
または
*://*/*)。これにより、ほとんどの拡張機能がウェブ ストアのキューに入れられ、遅いレビューが行われます。
警告! sendMessage を使用する場合は、sendMessage の回避策 (下記) を実装することもできます。
リーリー
リーリー
リーリー
警告!さらに多くのポートを Service Worker に接続する場合は、5 分が経過する前 (たとえば、295 秒以内) に各ポートを再接続する必要があります。これは Chrome バージョン 104 よりも前のバージョンでは重要であり、追加の接続ポートがどれほど多くても SW が強制終了されてしまいます。 Chrome 104 以降では、このバグは修正されていますが、5 分間のライフサイクルは変わっていないため、引き続き再接続する必要があります。そのため、最も簡単な解決策は、Chrome 接続のすべてのバージョンで同じ方法で (たとえば 295 秒ごとに) 再接続することです。
バックエンド スクリプトの例:
リーリーコンテンツ スクリプトなどのクライアント スクリプトの例:
リーリーソフトウェアを使用する代わりに、拡張ページを内部に含む新しいタブを開くと、このページが「表示される背景ページ」として機能します。つまり、ソフトウェアが行う必要があるのはこのタブを開くことだけです。アクションポップアップから開くこともできます。
リーリー これは ManifestV2 の永続的な背景ページと同じ機能を持ちますが、a) 表示されますが、b) chrome.extension.getBackgroundPage
(chrome で置き換えることができます) 経由ではアクセスできません。 .拡張子 .getViews)。
欠点:
info/logs/charts/dashboard をページに追加することでユーザーが使いやすくすることができます。また、タブが誤って閉じられるのを防ぐために beforeunload
リスナーを追加することもできます。 p>
永続的なサービス ワーカーなどは存在せず、これらの回避策にはワーカーが終了できるように前述した制限があるため、状態 (変数) を保存/復元する必要があります。ストレージ内の状態を維持できます (Example)。
状態/変数の管理を簡素化するためだけにワーカー スレッドを永続化しないでください。これは、状態の再構築に非常にコストがかかる場合、またはこの回答の冒頭にリストされている頻繁なイベントに巻き込まれた場合に、ワーカー スレッドの再起動によって悪化したパフォーマンスを復元するためにのみ行われます。