一篇文章入門Chrome擴(kuò)展開發(fā)

Chrome擴(kuò)展是什么

Chrome extension看著像一個(gè)app,我們經(jīng)常會(huì)誤認(rèn)為它是一個(gè)exe或者是一個(gè)app。但是就本質(zhì)而言,Chrome extension是一個(gè)網(wǎng)頁(yè)。它由manifest.json配置文件以及一系列的html、css、js、圖片等組成。所以對(duì)于一個(gè)前端開發(fā)而言,寫一個(gè)Chrome擴(kuò)展是一個(gè)不算太難的事情。

一個(gè)擴(kuò)展的基礎(chǔ)組成

Chrome擴(kuò)展都包含一個(gè)Manifest文件——manifest.json,這個(gè)文件可以告訴Chrome關(guān)于這個(gè)擴(kuò)展的相關(guān)信息,它是整個(gè)擴(kuò)展的入口,也是Chrome擴(kuò)展必不可少的部分。

Chrome擴(kuò)展的Manifest必須包含name(名稱)、version(版本)和manifest_version屬性,目前來(lái)說(shuō)manifest_version屬性值只能為數(shù)字2。

其他常用的可選屬性還有browser_action、page_actionbackground、permissionsoptions_page、content_scripts

官方有給出一份完整的Manifest.json的屬性列表。

以下是一份從官方復(fù)制過(guò)來(lái)的manifest.json文件,我對(duì)它進(jìn)行了一下簡(jiǎn)略處理,可以先感受一下,從這里可以大致的看到一個(gè)擴(kuò)展書寫的規(guī)則。

 {
  // Required
  "manifest_version": 2,
  "name": "My Extension",
  "version": "versionString",
 ?
  // Recommended
  "default_locale": "en",
  "description": "A plain text description",
  "icons": {...},
 ?
  // Pick one (or none)
  "browser_action": {...},
  "page_action": {...},
 ?
  // Optional
  "action": ...,
  "author": ...,
  "automation": ...,
  "background": {
  // Recommended
  "persistent": false,
  // Optional
  "service_worker":
  },
  "homepage_url": "http://path/to/homepage",
  "permissions": ["tabs"]
 }

我們來(lái)看一下其中一些配置項(xiàng)的意義。

首先是必填的幾個(gè)屬性

  • name:名稱

  • version:版本

  • manifest_version:只能為2

其次是幾個(gè)我認(rèn)為有必要說(shuō)明一下的:

  • icon:擴(kuò)展程序的圖標(biāo),可以有一個(gè)或多個(gè)。使用的地方有很多,比如用在extensions的管理界面,安裝extension程序的時(shí)候等等。

  • browser_actionpage_action

 "browser_action": {
      "default_icon": {
        "19": "images/icon19.png",
        "38": "images/icon38.png"
      },
      "default_title": "我的時(shí)鐘",
      "default_popup": "popup.html"
}

brower_actionpage_action的功能類似,都是用來(lái)處理擴(kuò)展在瀏覽器工具欄上的表現(xiàn)行為。 brower_action擴(kuò)展可以適用于任何頁(yè)面。page_action擴(kuò)展只能作用于某一頁(yè)面,當(dāng)打開該頁(yè)面時(shí)觸發(fā)該Google Chrome擴(kuò)展,關(guān)閉頁(yè)面則Google Chrome擴(kuò)展也隨之消失。

browser_action指定擴(kuò)展的圖標(biāo)放在Chrome的工具欄中,browser_action中的default_icon屬性定義了相應(yīng)圖標(biāo)文件的位置,default_title定義了當(dāng)用戶鼠標(biāo)懸停于擴(kuò)展圖標(biāo)上所顯示的文字,default_popup則定義了當(dāng)用戶單擊擴(kuò)展圖標(biāo)時(shí)所顯示頁(yè)面的文件位置。

  • content_scripts
 "content_scripts": [
      {
      "matches": ["*://www.google.com/"],
      "js": ["js/...js"]
      }
]

如果你想要你的擴(kuò)展可以操作用戶頁(yè)面,就需要用到這個(gè)屬性。這個(gè)屬性可以指定將哪些腳本何時(shí)注入到哪些頁(yè)面中,當(dāng)用戶訪問(wèn)這些頁(yè)面后,相應(yīng)腳本即可自動(dòng)運(yùn)行,從而對(duì)頁(yè)面DOM進(jìn)行操作。切這個(gè)屬性只與頁(yè)面共享DOM,而不與頁(yè)面中的js共享命名空間。

content_scripts屬性值為數(shù)組類型,數(shù)組的每個(gè)元素可以包含matches、exclude_matchescss、jsrun_at、all_frames、include_globsexclude_globs等屬性
-- matches定義了哪些頁(yè)面會(huì)被注入腳本
-- exclude_matches定義了哪些頁(yè)面不會(huì)被注入腳本
-- css和js定義了需要被注入頁(yè)面的js和css
-- run_at定義了何時(shí)被注入

  • permissions
    由于瀏覽器受限于同源策略,但是如果extension也需要受限的話,功能實(shí)現(xiàn)會(huì)大打折扣,所以chrome是允許extensions不受同源策略影響的,只不過(guò)需要進(jìn)行一些額外的操作。
 {
      ...
      "permissions": [
        "third party url"
      ]
 }

比如說(shuō),你需要獲取到一個(gè)第三方頁(yè)面的數(shù)據(jù),就需要在permissions中進(jìn)行聲明。再比如說(shuō),在background里使用一些高級(jí)的chrome api(downloads,webRequest,proxy,system等),這些api也是需要授權(quán)才能使用的。如果對(duì)高級(jí)api用法感興趣可以在官方文檔中查詢。

  • background

如果你的擴(kuò)展需要常駐后臺(tái),比如實(shí)現(xiàn)一些實(shí)時(shí)推送的功能。那就需要用到這個(gè)屬性。background可以包含三種屬性,分別是scriptspagepersistent。通常來(lái)說(shuō),我們只需要使用到scripts。如果指定了scripts`屬性,則Chrome會(huì)在擴(kuò)展啟動(dòng)時(shí)自動(dòng)創(chuàng)建一個(gè)包含所有指定腳本的頁(yè)面。persistent屬性描述了常駐后臺(tái)的方式,可選值為true和false。

更多屬性大家可以參照上方鏈接中給出的官方文檔說(shuō)明,發(fā)掘一下還是可以創(chuàng)造出很多有意思的功能的。

數(shù)據(jù)存儲(chǔ)

我們寫一個(gè)程序不可避免都是需要用到數(shù)據(jù)存儲(chǔ)的,對(duì)于Chrome擴(kuò)展也是這樣。

通常來(lái)說(shuō),Chrome擴(kuò)展用到的存儲(chǔ)方式有三種,localStorage,Chrome提供的存儲(chǔ)API,web SQL Database。

localStorage的使用眾所周知,這邊就不贅述。

Chrome提供的存儲(chǔ)API是對(duì)localStorage的改進(jìn),它與localStorage相比有以下區(qū)別:

  • 如果儲(chǔ)存區(qū)域指定為sync,數(shù)據(jù)可以自動(dòng)同步到用戶當(dāng)前在Chrome上登陸的Google賬戶,如果沒(méi)有網(wǎng)絡(luò)連接的話,sync儲(chǔ)存的數(shù)據(jù)的讀寫與local一致;

  • content_scripts可以直接讀取數(shù)據(jù),而不必通過(guò)background頁(yè)面,區(qū)別于localStorage需要受限于域名;

  • 在隱身模式下仍然可以讀出之前存儲(chǔ)的數(shù)據(jù);

  • 讀寫速度更快;

  • 用戶數(shù)據(jù)可以以對(duì)象的類型保存。

值得注意的是,使用Chrome存儲(chǔ)API必須要在Manifest的permissions中聲明,之后才有權(quán)限調(diào)用。

chrome.storage.StorageArea提供了5個(gè)方法,分別是getgetBytesInUse、setremoveclear。

get用于讀取數(shù)據(jù),set用于寫入數(shù)據(jù),remove用于刪除數(shù)據(jù),clear用于清空數(shù)據(jù),getBytesInUse方法為獲取一個(gè)數(shù)據(jù)或多個(gè)數(shù)據(jù)所占用的總空間,返回結(jié)果的單位是字節(jié)。

擴(kuò)展頁(yè)面間通信

對(duì)于頁(yè)面間的通信,chrome提供了4個(gè)頁(yè)面之間通信的接口。

  • runtime.sendMessage

  • runtime.onMessage

  • runime.connect,更高級(jí)用法,參考官方文檔

  • runtime.onConnect,更高級(jí)用法,參考官方文檔

這一節(jié)主要說(shuō)一下sengMessage和onMessage。

一般而言,chrome提供的API是不允許在content_scripts中運(yùn)行的,但是runtime.sendMessageruntime.onMessage可以。所以擴(kuò)展的其他頁(yè)面也可以同content_scripts相互通信。

用法如下:

 chrome.runtime.sendMessage(extensionId, message, options, callback)</pre>
  • extensionId為所發(fā)送消息的目標(biāo)擴(kuò)展,如果不指定這個(gè)值,則默認(rèn)為發(fā)起此消息的擴(kuò)展本身;

  • message為要發(fā)送的內(nèi)容,類型隨意,內(nèi)容隨意;

  • options是一個(gè)可選參數(shù),屬性的值決定擴(kuò)展發(fā)起此消息時(shí)是否要將TLS通道ID發(fā)送給監(jiān)聽此消息的外部擴(kuò)展。tls參考文檔

  • callback回調(diào)函數(shù),用于接收返回結(jié)果;

chrome.runtime.onMessage.addListener(callback)

此處的callback為必選參數(shù),為回調(diào)函數(shù)。callback接收到的參數(shù)有三個(gè),分別是message、sendersendResponse,即消息內(nèi)容、消息發(fā)送者相關(guān)信息和相應(yīng)函數(shù)。

chrome擴(kuò)展推薦

最后推薦幾個(gè)我自己常用的擴(kuò)展。

  • 草料二維碼,非常方便將url轉(zhuǎn)化成二維碼
  • 1px,用于和前端頁(yè)面和設(shè)計(jì)稿進(jìn)行還原度對(duì)比
  • charset,方便修改當(dāng)前頁(yè)面的charset
  • Momentum,chrome新開頁(yè)自定義dashboard

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容