【猿でもできる】Chrome拡張機能の作り方

## はじめに
この記事で作る拡張機能は入門レベルになっており、対象者は拡張機能を作ったことが無い・プログラミング初心者です。
簡単なので良いから、とりあえず拡張機能を作りたい！という方におすすめです。

## 今回作るChrome拡張機能
今回はChromeで開いているタブを一番左の1つを残して全て閉じる、という拡張機能を作ります。

拡張機能開発のはじめの一歩としておすすめです。

## 前提知識
この記事ではコードをコピペするだけでも拡張機能を1つ作成することができます。
プログラミング経験がある方には簡単な内容になっていると思います。

## 拡張機能とは
拡張機能とは、ブラウザ上で使える便利ツールです。言葉で説明するよりも実際に使ってみた方が理解しやすいので、実例を紹介します。
とても便利なのでぜひ使ってみてください。1つ目はPCでYoutubeなどの動画をバックグランド再生してくれます。
2つ目はサイト上でクリックしたら色を自動取得してくれる拡張機能です。

+ [Picture in Picture](https://chrome.google.com/webstore/detail/picture-in-picture-extens/hkgfoiooedgoejojocmhlaklaeopbecg)
+ [ColorZilla](https://chrome.google.com/webstore/detail/colorzilla/bhlhnicpbhignbdhedgjhgdocnmhomnp?hl=ja)

このように拡張機能とは、本来のアプリケーションの機能を更に充実させるためのものです。

概要を把握したところで、実際に拡張機能を作っていきましょう。

## Chrome拡張機能を作る流れ
全体像をつかむために流れを説明します。

### ①Chrome拡張機能のタイプを決める
最初は拡張機能のタイプを決めます。

今回はChromeの右上にあるアイコンをクリックしたタイミングで実行する拡張機能を作ります！

他のタイプについて詳しい説明はここではしませんが、興味のある方は[こちら](https://qiita.com/M_Kagawa/items/539d7597536ec90b1bc6#%E4%B8%BB%E3%81%AA%E6%8B%A1%E5%BC%B5%E3%81%AE%E7%A8%AE%E9%A1%9E)の記事をご覧ください。

### ②必須ファイルの作成
Chrome拡張機能を作る際は最低2つのファイルが必要になります。

+ manifest.json
+ jsファイル

の2つです。

ここから実際に手を動かして拡張機能を作っていきましょう。

### 【manifest.json】の中身
manifest.jsonは拡張機能の設定を行うファイルになります。これが無いと拡張機能は作れません。

それではまず、拡張機能用のフォルダを1つ作成してください。名前はなんでもOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358277/c663c704-0761-f7e8-256e-3ff16923468e.png)

そして、その中にmanifest.jsonとアイコン用の画像を作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358277/a2cf57bc-2d37-c811-e1ca-8dc3388ba104.png)

それでは、manifest.jsonの中身を書いていきます。

```manifest.json
{
  "name": "Sample Extension",
  "version": "1.0",
  "manifest_version": 3,
  "action": {
    "default_icon": {
      "16": "./extension.png"
    }
  },
  "background": {
    "service_worker": "./content.js"
  },
  "permissions": [
    "tabs"
  ]
}
```
中身を解説していきます。

#### version
`version`は拡張機能のバージョン設定になっています。
拡張機能は自動更新されるんですが、その際にこのバージョンが必要になります。
現在は、下記の形式がサポートされています。

+ "version": "1"
+ "version": "1.0"
+ "version": "2.10.2"
+ "version": "3.1.2.4567"

今回は1.0にしました。（バージョンの違いがよくわかっていません）正確な情報は[Google公式ページ](https://developer.chrome.com/docs/extensions/mv3/manifest/version/)を確認することをおすすめします。

#### manifest_version
これはmanifest.jsonの書き方についてのバージョンです。

現在はバージョン2とバージョン3がありますが、これから使う方は必ずバージョン3を使ってください。バージョン2は近い内にサポートが終了するようです。

バージョン2と3では書き方がかなり違うので、バージョン2で書かれた過去の記事などを参考にしないように気を付けてください。

#### action
ここでは拡張機能のアイコンファイルを指定しています。

default_iconの`extension.png`は拡張機能のアイコンになるので、自分で変更してください。

#### background
backgroundのservice_workerにプログラムを書いたjsファイルを指定います。

#### permission
permissionではChrome拡張機能を作る上で許可する動作を設定します。今回はChromeのタブを消すため、tabsを設定しておきます。

### 【content.js】の中身
ソースコードです。
```content.js
// 拡張機能アイコンがクリックされたら実行
chrome.action.onClicked.addListener(() => {

// 左端を残して全てのタブを消す
  function deleting(pages) {
    const len = pages.length - 1
    for(let i = len; i > 0; i--){
      chrome.tabs.remove(tabId[i].id)
    }
  }

// エラー起きてたらメッセージ出力
  function onError(error) {
    console.log(`エラーメッセージ： ${error}`);
  }

// currentWindow：アクティブウィンドウ上のみ実行
  const queries = chrome.tabs.query({currentWindow: true})
  queries.then(deleting, onError)
})

```
簡単に流れを説明します。

+ `chrome.action.onClicked.addListener`でアイコンがクリックされた時に中身のコードが実行される
+ chrome.tabs.queryで全てのタブを取得
+ deleting関数実行でタブが削除される

という流れです。

実際に使ってみましょう。

### ③Chromeにアップしてテスト
現在のフォルダの中身はこのようになっているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358277/4898a5df-e107-def8-8c91-b85c7a16a5a4.png)

それではChromeで使ってみましょう。
ここをクリックして、「拡張機能を管理」をクリックしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358277/d5767d1f-efcf-8b42-66a5-b59ed61bea40.png)

開いたら、パッケージ化されていない拡張機能を読み込むとあるので、そこをクリックしてください。

そして、フォルダをアップロードします。

ここまでいけば後は作った拡張機能をピンしてクリックすれば、実行されるはずです。
※タブが消えるので注意

実際に拡張機能を他の人でも使えるようにするためには、もう少し作業が必要です。今回は細かい設定などは全て省いて必須項目だけに絞って説明してきました。

公開する方法は[他の方の記事](https://belltree.life/chrome-extension-release/)を参考にしてみてください。


初めて自分の作った拡張機能が動いた瞬間はとても感動しました。この記事がみなさんの助けになっていれば嬉しいです。

[cti1650さん](https://zenn.dev/cti1650)の勉強会のおかげで拡張機能を作ることができました！本当に感謝です！

## 参考
+ https://qiita.com/k7a/items/26d7a22233ecdf48fed8#browser-action%E3%81%A8page-action
+ https://qiita.com/M_Kagawa/items/539d7597536ec90b1bc6#manifestjson
+ https://developer.chrome.com/docs/extensions/mv3/devguide/
+ https://zenn.dev/cti1650