blog

クローム拡張開発

Chrome拡張機能は、Web技術の開発であり、ブラウザソフトウェアの機能を強化するために使用され、それは実際にはHTML、CSS、JS、画像やその他のリソースによって構成され、圧縮されたパッケージの...

Apr 13, 2020 · 4 min. read
シェア

By quguoliang {.text-intro}

# Chrome拡張機能開発 {.text-landing} ::: {.aligncenter}

クローム拡張機能とは

  • Chrome拡張機能とは、ブラウザの機能を拡張するためにウェブ技術を使って開発されたソフトウェアの一部です。 実際には、HTML、CSS、JS、イメージ、その他のリソースを圧縮したパッケージで、拡張子は.crxです。

  • Chromeの拡張機能は、このような360エクストリームブラウザなどのブラウザ上で実行することができます, 360セーフブラウザ, Sogouブラウザ, QQブラウザ, これに加えて、, Firefoxはまた、Chromeプラグインのいくつかのサポートを提供しています.

開発とデバッグ

Chromeのプラグインは、厳密なプロジェクト構造の要件を持っていない, 限り、あなたは、ディレクトリがmanifest.jsonがあることを確認しているようにすることができます, また、特別なIDEを必要としません, 普通のWeb開発ツールがすることができます.

あなたは、右上のメニューからプラグイン管理ページにアクセスすることができます -> その他のツール -> 拡張機能、またはアドレスバーに chrome://extensionsを入力して直接アクセスすることができます。

カーネル紹介

manifest

これはChromeプラグインにとって、プラグインに関連するすべての設定を行うための最も重要で不可欠なファイルで、ルートディレクトリに配置する必要があります。このうち、manifest_version、name、versionの3つは必須で、descriptionとiconは記入することを推奨します。
  • browser_action:右上隅のインジケータアイコンの設定。

  • background:背景常駐ページ、高権威

  • chrome_url_overrides: Chromeのデフォルトページを拡張機能が提供するものに置き換えます。

  • manifest.json 完整配置项アドレス

:::

content-scripts

{
	// ページに直接JSを注入する必要がある
	"content_scripts": 
	[
		{
			//"matches": ["http://*/*", "https://*/*"],
			// "<all_urls>" すべてのアドレスにマッチする
			"matches": ["<all_urls>"],
			// 複数のJSを逐次インジェクションする
			"js": ["js/jquery-1.8.3.js", "js/content-script.js"],
			// JSインジェクションは気軽にできるけど、CSSは気をつけないとグローバルスタイルに影響するから気をつけないとね。
			"css": ["css/custom.css"],
			// コード注入時、オプション値:"document_start", "document_end", or "document_idle",最後のものは、ページがアイドル状態であることを示す。_idle
			"run_at": "document_start"
		}
	],
}

::.

#### 背景
backgroundは常駐ページとして設定され、プラグイン内のどのタイプのページよりもライフサイクルが長いです。 ブラウザが開いたときに開き、ブラウザが閉じたときに閉じるので、常に実行する必要があるグローバルコードを最初からbackground内に置くのが一般的です。
バックグラウンドは非常に高いパーミッションを持っており、ほとんどすべてのChrome拡張APIを呼び出すことができ、無制限のクロスドメイン、つまり、相手側にCORSを設定させることなく、任意のウェブサイトにクロスドメインでアクセスすることができます。
{
	// 常に常駐するバックエンドJSまたはバックエンドページ。
	"background":
	{
		// 2JSを指定すると、バックグラウンドページが自動的に生成される。
		"page": "background.html"
		//"scripts": ["js/background.js"]
	},
}

:::

popup

ポップアップとは、browser_action または page_action アイコンをクリックすると開き、フォーカスがページから離れると閉じる小さなウィンドウのことで、一般的に一時的なインタラクションに使われます。
  • ポップアップは任意のHTMLコンテンツを含むことができ、そのサイズに適応します。
  • default_popupフィールドを通してポップアップページを指定するか、setPopup()メソッドを呼び出すことができます。
  • 宣言サイクルは短く、長く実行されるコードは可能な限り避けるべきです。
{
	"browser_action":
	{
		"default_icon": "img/icon.png",
		// アイコンホバー時のキャプション(オプション
		"default_title": "これはChromeプラグインのサンプルだ。,
		"default_popup": "popup.html"
	}
}

chrome提供するAPI

  • ブックマークコントロール
  • 閲覧履歴コントロール
  • ウィンドウコントロール
  • ラベルコントロール
  • ネットワークリクエストコントロール、各種イベントリスニング
  • ネイティブメニューのカスタマイズ
  • デスクトップ通知
  • 完璧な通信メカニズム
  • ...

コミュニケーション

その他

ローカルストレージ
通常の localStorage の代わりに chrome.storage を使用することをお勧めします。
  • chrome.storageはプラグイングローバル用で、バックグラウンドでデータを保存してもcontent-scriptで取得できます;
  • chrome.storage.syncは現在ログインしているユーザーに追従して自動的に同期することができます。このコンピュータで変更された設定は自動的に他のコンピュータに同期されます;
```html // データを読み込みます。最初のパラメータは読み込むキーを指定し、デフォルト値を設定します chrome.storage.sync.get({colour: 'red', age: 18}, function(items) { console.log(items.color, items.age); }); // データを保存 chrome.storage.sync.set({colour: 'blue'}, function() { console.log('保存に成功しました!'); }); ```

webRequest

webRequest ファミリーの API を使用すると、HTTP リクエストを変更したりカスタマイズしたりすることができます。
//manifest.json
{
	// 許可リクエスト
	"permissions":
	[
		"webRequest", // web 
		"webRequestBlocking", // ウェブリクエストをブロックする
		"storage", // プラグインのローカルストレージ
		"http://*/*", // executeScriptまたはinsertCSSでアクセスできるウェブサイト。
		"https://*/*" // executeScriptまたはinsertCSSでアクセスできるウェブサイト。
	],
}
// background.js
// イメージを表示するかどうか
var showImage;
chrome.storage.sync.get({showImage: true}, function(items) {
	showImage = items.showImage;
});
// webリクエストリスナー、最後のパラメーターはブロッキングを意味する。
chrome.webRequest.onBeforeRequest.addListener(details => {
	// cancel リクエストがキャンセルされたことを示す。
	if(!showImage && details.type == 'image') return {cancel: true};
	// シンプルなトーン検出
	// ほとんどのウェブサイトはメディアタイプではないし、アンチダウンロードなので、これはデモンストレーションのためだけで、本当の意味はない。
	if(details.type == 'media') {
		chrome.notifications.create(null, {
			type: 'basic',
			iconUrl: 'img/icon.png',
			title: 'トーンが検出された,
			message: 'トーンアドレス: ' + details.url,
		});
	}
}, {urls: ["<all_urls>"]}, ["blocking"]);

:::

Read next

HTMLのローカル・ストレージ・オブジェクト

クライアント側にデータを保存する2つのオブジェクトの違い日付制限のないストレージ現在のセッションのデータ(タグ)のみを保存するストレージ

Apr 13, 2020 · 1 min read