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


1) 不可視的background頁面

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

Persistent background pages默認加載入內存,持續運行在后台。在manifest.json文中注冊Persistent background page如下:

{

"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進行任何操作。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM