この記事はテックタッチアドベントカレンダー15日目の記事です。 14日目は kenyu による 開発組織におけるマネージャの責務を分解し、チーム運用してみる でした。
SET の @terunuma です。買い過ぎたパスタを有効活用しようと重曹(かん水の代用)で茹でたところ、ストレートな中華麺を生成することに成功しました。魚介系醤油のスープとの相性が抜群に良いです。
今年の12月9日(現地時間)に米Googleより「Google Chrome 88」ベータ版で“Manifest V3”が利用可能になったとの発表がありました。(ニュース: 窓の杜、記事: Chromium Blog)。
これに先駆けて、11月2日に「Overview of Manifest V3」が公開されています。この記事を日本語に翻訳したものを以下に記します。
弊社プロダクトでも主な提供方式の一つとして Chrome 拡張を採用しており、近いうちに Chrome ウェブストアで受け入れられる拡張のマニフェストの方式に追従する必要があります。プロダクトへの影響を認識しつつ計画的にマニフェストのアップデート移行を実施したいところです。
(実際に拡張の Manifest を V2 → V3 へ移行する際には「Migrating to Manifest V3」、「Manifest V3 migration checklist」が参考になります。コードや manifest.json の例が載っていて原文のままでも読みやすいです。)
Manifest V3の概要
Manifest V3(MV3)は、拡張プラットフォームのビジョンに向けた大きな前進です。MV3は、そのビジョンの3つの柱であるプライバシー、セキュリティ、パフォーマンスに焦点を当て、機能とウェブ性の基盤を維持および改善します。
この記事では、MV3によって導入された機能と主な変更点をまとめています。Manifest V2拡張機能をMV3に移行するためのヘルプ、またはこれらの変更によるアーキテクチャへの影響をよりよく理解するには、MV3移行ガイドも参照してください。
Manifest V3は Chrome 88 より利用可能となり、Chrome ウェブストアは 2021年1月よりMV3拡張を受け入れ開始します。
機能の概要
MV3を使用する拡張機能には、いくつかの新機能と機能変更があります。
- サービスワーカーがバックグラウンドページを置き換えます。
- ネットワークリクエストの変更は、新しい declarativeNetRequest APIで処理されるようになりました。
- リモートでホストされるコードは許可されなくなりました。拡張機能は、パッケージに含まれているJavaScriptのみを実行できます。
- 多くのメソッドに Promise のサポートが追加されましたが、代わりとしてのコールバックも引き続きサポートされています。(最終的には、すべての適切なメソッドでの Promise をサポートします。)
- 他のいくつかの比較的マイナーな機能変更もMV3で導入されています。
これらの各変更は、以下のセクションに要約されています。
主な機能
このセクションでは、MV3の最も重要で影響力のある機能を紹介します。
サービスワーカー
Manifest V3は、バックグラウンドページをサービスワーカーに置き換えます。
エンドユーザーのエクスペリエンスを向上させるために、拡張サービスワーカーはWebページと同様にイベントを通知して応答します。Webサービスワーカーの場合、このイベントは通常、キャッシュの管理、リソースのプリロード、およびオフラインWebページの有効化を意味します。拡張サービスワーカーはこれらすべてを実行できますが、拡張パッケージには、オフラインでアクセスできるリソースのバンドルがすでに含まれています。そのため、拡張サービスワーカーは、Chromeの拡張APIによって公開された関連するブラウザイベントへの対応に集中する傾向があります。
ネットワークリクエストの変更
拡張機能がネットワーク要求を変更する方法は、MV3で改定されています。新しい declarativeNetRequest APIは拡張機能がプライバシーを保護し、パフォーマンスの高い方法でネットワーク要求を変更およびブロックできるようにします。このAPIの実体は次の通りです。
- 拡張機能は、リクエストへ割り込みして手続き的に変更するのではなく、代わりに Chrome へリクエストを評価して変更するように依頼します。
- 拡張機能は、一連のルールを宣言します: 要求に一致するパターンと、一致したときに実行するアクションです。ブラウザは、これらのルールで定義されている通りにネットワークリクエストを変更します。
この宣言型アプローチを使用すると、永続的なホスト権限の必要性が大幅に減少します。
一部の拡張機能では、特定のユースケース(リクエストのリダイレクトなど)に対して引き続き幅広いホスト権限が必要になる場合があります。詳細については、条件付きアクセス許可とdeclarativeNetRequestを参照してください。
webRequest APIのブロックバージョンは、MV3では強制的にインストールされた拡張機能のみに制限されています。これは、webRequest のブロックに関するアプローチにある問題が原因です。
- プライバシー :拡張機能はユーザーに対して行われた各ネットワーク要求を読み取る必要があるため、ユーザーデータへの過度のアクセスが必要となります。
- パフォーマンス :複数のプロセスホップと C++/JS 境界にまたがるデータのシリアル化と逆シリアル化が負荷を高めます。
- 互換性 :すべてのリクエストを処理するためにService Workerを実行する必要があるため、イベントベースのバックグラウンド実行ではうまく機能しません。
これは、開発者がホスト権限を必要とせずに、コンテンツブロック機能などの多くの一般的なユースケースを実装できることを意味します。
リモートでホストされているコード
MV3の主なセキュリティの改善点は、拡張機能がJavaScriptやWasmファイルなどのリモートコードを読み込めないことです。これにより、Chromeウェブストアに申請された拡張機能の安全な動作をより確実かつ効率的にレビューできます。具体的には、すべてのロジックは拡張機能のパッケージに含まれている必要があります。
リモートコードの代わりに、リモート構成ファイルの使用をお勧めします。この変更を処理する方法の詳細については、移行ガイドを参照してください。
Promises
MV3はpromiseのファーストクラスのサポートを提供します。多くの一般的なAPIがpromiseをサポートしており、最終的にはすべての適切なメソッドでpromiseをサポートする予定です。
async / awaitだけでなくpromiseチェーンも使用できます。APIメソッドでコールバックを使用した場合は、promiseが返されなくなります。したがって、利用する準備が整うまでこの部分の移行を延期することも、すぐにpromiseの使用を開始することもできます。
イベントリスナーなどの一部のシナリオでは、引き続きコールバックが必要です。
その他の機能
MV3で導入されたその他の多くの変更があります。
- Action APIの統合:Browser Action APIとPage Action APIは、単一のAction APIに統合されています。
- Webアクセス可能なリソース :これらのリソースは、指定されたサイトおよび拡張機能でのみ使用できるようになりました。
- コンテンツセキュリティポリシー (CSP) :単一のオブジェクトで異なる実行コンテキストに個別のCSPを指定するようになり、特定のポリシーが許可されなくなりました。
- executeScript() の変更 :拡張機能は任意の文字列を実行できなくなり、スクリプトファイルと関数のみを実行できるようになりました。このメソッドは、Tabs APIから新しいScripting APIにも移行しています。
次の機能がまもなくMV3に追加されます。
- 動的コンテンツスクリプト :新しいScripting APIを使用すると、拡張機能は実行時にコンテンツスクリプトを登録および登録解除できます。
- 新しいファビコンAPI :この新しいJavaScript APIは、「chrome:// favicons」に代わるものであり、開発者にWebサイトのファビコンを取得する方法を提供します。
- タブグループ : Tabs APIは、Chromeのタブグループ機能をサポートするように拡張されます。
- インメモリストレージ : サービスワーカーの再起動時にメモリに値を格納するために使用できるStorage APIの新しいストレージ領域です。
これらおよびその他のMV3機能が利用可能になったら、発表内容を確認してください。
明日の記事は jigsaw の「Nuxtの管理画面をReactに移行する試行錯誤」です。お楽しみに!