犯人の解明: 孤立したスクリプトと拡張機能の更新
Chrome 拡張機能を誤ってリロードすると、「ランタイムがチェックされていません」という厄介なエラーが発生する可能性があります。 .lastError: 応答を受信する前にメッセージ ポートが閉じました。」このエラーは、孤立したスクリプトの作成によって発生し、ポップアップ ページとコンテンツ ページ間の通信が中断されます。
孤立したスクリプトの概念を理解する
孤立したスクリプトは幽霊のような残骸です拡張機能が更新または再ロードされた後でも残り続ける、以前にロードされた拡張機能。このゴースト スクリプトは、新しいコンテンツ スクリプト宛てのメッセージを傍受し、通信の中断を引き起こします。
孤立したスクリプトの根絶
このスペクトル スクリプトを追放するには、まず、それがまだ反応します。そうであれば、ウィンドウ オブジェクトを介して新しいコンテンツ スクリプトからメッセージをディスパッチできます。このメッセージを受信すると、孤立したスクリプトはすべてのイベント リスナーの登録を解除し、ガベージ コレクションの準備をする必要があります。
再読み込み時にコンテンツ スクリプトを補充
この問題の再発を防ぐために、次のようにします。ポップアップ ページからメッセージを送信する前に、使用可能なコンテンツ スクリプトの存在を確認できます。存在しない場合は、コンテンツ スクリプトを再度挿入できます。
コンテンツ スクリプトのサンプル コード
前述のソリューションを実装するには、この修正された content.js スクリプトを組み込みます。
<code class="javascript">var orphanMessageId = chrome.runtime.id + 'orphanCheck'; window.dispatchEvent(new Event(orphanMessageId)); window.addEventListener(orphanMessageId, unregisterOrphan); // ... (register named functions for event listeners) window.running = true; function unregisterOrphan() { // ... (deregister listeners and nullify variables) } function onMessage(msg, sender, sendResponse) { // ... (handle message) } function onMouseMove(event) { // ... (DOM event handler) }</code>
ポップアップ ページの検証
メッセージ送信前にコンテンツ スクリプトが確実に挿入されるようにするには、次のスニペットを使用して Popup.js スクリプトを拡張します。
<code class="javascript">async function sendMessage(data) { // ... (fetch active tab) if (await ensureContentScript(tab.id)) { return await chrome.tabs.sendMessage(tab.id, data); } } async function ensureContentScript(tabId) { // ... (check for existing content script) if (!result) { await chrome.scripting.executeScript({ // ... (inject content script) }); } return true; }</code>
これらの対策を実装することで、孤立したスクリプトを排除し、拡張機能のポップアップ ページとコンテンツ ページ間のシームレスな通信を維持できます。
以上がChrome 拡張機能で「Unchecked runtime.lastError: The Message Port Closed...」エラーを防ぐ方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。