Chrome瀏覽器擴展開發系列之三:Google Chrome瀏覽器擴展的架構

1) 不可視的background頁面javascript

Google Chrome擴展每每包含一個不可見的background頁面,Google Chrome擴展的主要業務邏輯都位於此。有兩種類型的background 頁面,一種是persistent background pages,另外一種是event pages。Persistent background pages持續運行,隨時可訪問。而Event pages是事件驅動運行的,只有在事件發生的時候才能夠訪問。java

Persistent background pages默認加載入內存,持續運行在後臺。在manifest.json文中註冊Persistent background page以下:chrome

{json

"background": {跨域

"scripts": [myBackgroundPage.js],數組

"persistent": true瀏覽器

]服務器

}併發

Event pages默認是不加載的,只在事件發生時加載並運行。觸發加載Event pages的場景以下:異步

· Google Chrome擴展第一次被安裝或升級到新版本

· 發生了Event pages監聽的事件

· content script或其餘Google Chrome擴展發出了一個message

· Google Chrome擴展中的其餘頁面調用了chrome.runtime.getBackgroundPage()方法

Google Chrome擴展經過chrome.runtime.onInstalled.addListener(onInit)要求監聽onInstalled事件,Chrome瀏覽器跟蹤當前發生的全部事件。一旦被監聽的事件發生,Chrome瀏覽器就會加載Event pages。

若是Google Chrome擴展經過removeListener取消了對某事件的監聽,則該事件發生時Chrome瀏覽器也不會加載Event pages。

當事件再也不被監聽器引用後卸載以釋放內存併發出chrome.runtime.onSuspend事件。

在manifest.json文中註冊Event page以下:

{

"background": {

"scripts": [myEventPage.js],

"persistent": false

]

}

2) 可視頁面

Google Chrome擴展能夠徹底運行在後臺,也能夠爲用戶提供可視界面。Google Chrome擴展最經常使用的可視界面爲以下兩種形式(二者是互斥的):

· browser actions,這樣的Google Chrome擴展能夠適用於任何頁面。圖標每每位於瀏覽器地址欄外右側。點擊圖標將彈出窗口。

· page actions,這樣的Google Chrome擴展只能做用於某一頁面,當打開該頁面時觸發該Google Chrome擴展,關閉頁面則Google Chrome擴展也隨之消失。圖標每每位於瀏覽器地址欄內右端。

此外,Google Chrome擴展還支持其餘的可視界面:

· context menu,右鍵菜單

· options 頁面,Google Chrome擴展能夠有一個options 頁面,支持用戶定製Chrome擴展的運行參數。

· override頁面,Google Chrome擴展中的override頁面能夠替換瀏覽器中打開的默認頁面,如標籤管理器頁面chrome://bookmarks、瀏覽歷史記錄頁面chrome://history或新建Tab頁面chrome://newtab。不過,一個Google Chrome擴展只能替換一個默認頁面。

· 經過chrome.tabs.create()或window.open()打開的頁面

3) Google Chrome擴展與Web頁面/服務器之間的交互

· 經過content scripts,能夠實現Google Chrome擴展與用戶打開的Web頁面之間的交互。

· 經過跨域的 XMLHttpRequest,能夠實現Google Chrome擴展與其餘服務器之間的交互。

content scripts是一組JavaScript文件,運行在瀏覽器當前打開的頁面的上下文中,能夠讀取並修改當前打開的頁面DOM結構。事實上,content scripts能夠被看做是當前打開的頁面的組成部分。

4) 使用chrome.* API

Google Chrome擴展除了使用javascript的通用標準API以外,還可使用Chrome瀏覽器專有的API(稱爲chrome.* API).

不過,大多數chrome.* API都是異步調用,調用以後當即返回而不等待調用結果,因此對chrome.* API的調用每每都須要一個回調函數做爲參數以處理調用結果。

固然,也有少許chrome.* API是同步調用。這樣的chrome.* API每每都有一個返回類型,也無需回調函數做爲參數。

5) Google Chrome擴展中的頁面之間的數據通訊

Google Chrome擴展中的不一樣頁面之間每每要通訊,以調用彼此方法共享數據。因爲一個Google Chrome擴展中的全部頁面都運行於同一個進程中的同一個線程,因此各個頁面能夠經過必定的方法直接調用。

如經過chrome.extension.getViews()得到全部可視頁面的window對象的數組,經過chrome.extension.getBackgroundPage()得到不可視的background頁面的window對象。經過頁面的window對象就能夠對頁面的DOM進行任何操做。

相關文章
相關標籤/搜索