1 主流方案及嘗試
現(xiàn)在瀏覽器插件中,大多采用直接調用遠程代碼的方式進行熱更新,由于安全策略逐步增強,越來越不支持熱更新了;chrome在新v3版本插件中直接給禁止了;對于v2版本則即將廢棄使用。
或者要翻墻到google應用商店提交審核,才能熱更新。
?
2 當前問題
1、由于安全策略逐步增強,越來越不支持熱更新了,之前可以直接調用遠程資源的方法均被禁止了;
2、chrome插件開發(fā)中,v2版本是支持熱更新的,但明年v2版本將被廢棄到;
3、所有chrome插件都要盡快升級成v3版本,然而v3版本不支持熱更新。
4、需要要到翻墻到google應用商店提交審核,等審核通過后,且用戶本身要至此翻墻才能進行插件熱更新。
3 技術原理
chrome.runtime.getURL獲取js地址的方法是新版v3瀏覽器本身支持的方法,可以用它來獲取插件安裝包中的內部靜態(tài)資源,來進行加載。
本發(fā)明流程如下圖所示:
瀏覽器插件的新版均只允許加載本地資源,而限制外部資源的加載;本發(fā)明同樣遵循瀏覽器內核要求,在serviceworker中加載插件中預制資源inject_base.js到頁面里,需要直接或間接用chrome.runtime.getURL方法加載inject_base.js資源,然后再從inject_base.js中加載遠端inject.js資源即可,此處兩步過程可以擴展到三步或更多步驟,但不可省略這兩個步驟。
inject.js中會有插件的核心功能資源,當需要熱更新插件功能時,直接更新外部資源inject.js即可。
4 方案實施
在遵循瀏覽器內核安全控制要求下,我們可以如下操作:
1) 先在serviceworker中通過chrome.runtime.getURL獲取url地址的方法動態(tài)加載預制資源inject_base.js;此處若用chrome.scripting.executeScript方法動態(tài)加載預制資源,則需先加載一個橋接資源inject_base_bridge.js,然后再在inject_base_bridge.js中用chrome.runtime.getURL方法動態(tài)加載遠端indect_base.js,然后進行第二步;
function inject(){ const injectPath = "js/inject.js"; const script = document.createElement("script"); script.setAttribute("type", "text/javascript"); // 重點是這句 script.src = chrome.runtime.getURL(injectPath); document.body.appendChild(script); }
該步驟中需要注意的是:不可以直接用chrome.runtime.getURL或chrome.scripting.executeScript這兩個方法,而是需要用onMessage監(jiān)聽來動態(tài)使用這兩個方法,否則后續(xù)js資源的加載則只在安裝或刷新時生效一次,而不能在每個頁面中都成功加載。
?
function injectJsCode(srcList=["js/inject_base.js"]) { chrome.tabs.query( { active: true, currentWindow: true, }, (tabs) => { if (tabs[0]) { // 注入插件預制js let _injectJsList = srcList; chrome.scripting.executeScript({ target: { tabId: tabs[0].id }, files: _injectJsList, }); } } ); } chrome.runtime.onMessage.addListener(function (message, sender, sendResponse) { switch (message.type) { case "inject-code": injectJsCode(); return true; } });
2)再從inject_base.js中加載遠端inject.js資源即可;當發(fā)布新功能時,直接發(fā)布遠端的新版inject.js即可直接熱更新插件功能。
具體邏輯如下圖所示:
onMessage監(jiān)聽來動態(tài)使用擦灰姑娘如方法,確保后續(xù)js資源在每個頁面中都成功加載;需要從content_scripts中設置發(fā)送腳本輸入的消息通知:
chrome.runtime.sendMessage(chrome.runtime.id, message, callback)
這樣就可以隨時愉快的更新插件發(fā)布新功能了。
5 方案總結
該方案目前所打的包,在用戶直接下載、解壓、使用時比較合適;大多在未發(fā)布到chrome應用商店時使用較為便捷。若要在chrome官方應用商店發(fā)布,則需改造。待后續(xù)總結整理...
審核編輯 黃宇
-
JS
+關注
關注
0文章
78瀏覽量
18096 -
瀏覽器
+關注
關注
1文章
1022瀏覽量
35328 -
Chrome
+關注
關注
0文章
342瀏覽量
18014
發(fā)布評論請先 登錄
相關推薦
評論