最高のパフォーマンスを達成する

拡張機能は、補完的でカスタマイズされた機能を提供するために設計された、ブラウザへの追加機能です。ブラウジング エクスペリエンスを遅くしたり、損なったりする拡張機能は、ユーザーにとって問題であり、Chrome 拡張機能の目的にも反します。一般的なコーディングの習慣に加えて、デベロッパーは以下のプラクティスに沿って、拡張機能が最高のパフォーマンスで実行されるようにする必要があります。

可能な限りすべてを遅延させる

リソースは必要になるまで読み込まないようにします。拡張機能の起動関数には、拡張機能を開くために必要なものだけを含めます。ユーザーがボタンをクリックした場合にのみ必要なものや、ユーザーがログインした場合にのみ機能する機能を、ユーザーがログインする前に読み込まないでください。

重要なイベントを管理する

効率的なバックグラウンド スクリプトには、拡張機能にとって重要な登録済みイベントが含まれています。リスナーがトリガーされるまで休止状態になり、トリガーされると対応する処理を行い、休止状態に戻ります。不要なスクリプトを実行し続けると、システム リソースが消耗します。

可能であれば、バックグラウンド スクリプトはマニフェストに登録し、永続性を false に設定する必要があります。

{
  "name": "High Performance Extension",
  "description" : "Sleepy Background Script",
  "version": "1.0",
  ...
  "background": {
   "scripts": ["background.js"],
   "persistent": false
  },
  ...
}

バックグラウンド スクリプトを永続的にアクティブにしておく必要があるのは、拡張機能が chrome.webRequest API を使用してネットワーク リクエストをブロックまたは変更する場合のみです。webRequest API は、非永続的なバックグラウンド ページと互換性がありません。

{
  "name": "High Performance Extension",
  "description" : "Persistent Background Script",
  "version": "1.0",
  ...
  "background": {
    "scripts": ["background.js"],
    "persistent": true
  },
  "permissions": [
    "webRequest",
    "webRequestBlocking",
    "https://<distracting social media site>.com/*"
  ],
 ...
}
chrome.webRequest.onBeforeRequest.addListener(
  function(details) {
    return {redirectUrl: "/"};
  },
  {urls: ["https://social.media.distraction.com/*"]},
  ["blocking"]
);

コンテンツ スクリプトを含む

コンテンツ スクリプトは、拡張機能の秘密エージェントとして機能し、拡張機能のコアに重いロジックを依存させながら、ウェブページをさりげなく読み取ったり変更したりします。関連性のないページでの侵入的なアクティビティを避けるため、明確なターゲットを設定する必要があります。理想的には、コンテンツ スクリプトは、意図的な動作を除き、ブラウジング エクスペリエンスで気づかれないようにする必要があります。

ターゲットを宣言する

不要な場所や不適切なタイミングでコンテンツ スクリプトを実行する拡張機能は、ブラウザの速度低下や機能エラーの原因となる可能性があります。これを回避するには、マニフェストで一致パターンを指定し、document_start ではなく document_idle でスクリプトを実行します。

{
  "name": "High Performance Extension",
  "description" : "Superfly Superlight Content Scripts",
  "version": "1.0",
  ...
  "content_scripts": [
    {
      "js": ["content_script.js"],
      "matches": ["/*"],
      "run_at": "document_idle"
    }
  ]
  ...
}

拡張機能がユーザーのアクションによってのみウェブページにアクセスする必要がある場合は、プログラムで挿入します。プログラマティックな挿入は、ユーザーが呼び出した場合にのみ実行されます。

chrome.browserAction.onClicked.addListener(function(tab) {
  chrome.tabs.executeScript({
    code: 'document.body.style.fontSize="100px"'
  });
});

コンテンツ スクリプトは必要な場合にのみ使用する

多くの拡張機能では、目的の機能を達成するためにコンテンツ スクリプトがまったく必要ない場合があります。declarativeContent API を使用すると、関連する条件が満たされたときに拡張機能が認識するためのルールが設定されます。これはコンテンツ スクリプトよりも効率的で、使用するコードも少なくなります。

HTML5 の <video> 要素を含むサイトにユーザーがアクセスしたときに、拡張機能でページ アクションをユーザーに表示する必要がある場合は、宣言型ルールを指定できます。

chrome.runtime.onInstalled.addListener(function() {
  chrome.declarativeContent.onPageChanged.removeRules(undefined, function() {
    chrome.declarativeContent.onPageChanged.addRules([
      {
        conditions: [
          new chrome.declarativeContent.PageStateMatcher({
            css: ["video"],
          })
        ],
        actions: [ new chrome.declarativeContent.ShowPageAction() ]
      }
    ]);
  });
});

コードの効率性を評価する

ウェブサイトのパフォーマンスに関する一般的なプラクティスは、拡張機能にも適用できます。たとえば、非同期プログラミングの手法を実装したり、コードを最小限かつコンパクトに保ったりします。

Lighthouse などのツールを使用して、拡張機能のパフォーマンスを評価し、ビジュアル拡張機能ページで改善できる領域を特定します。