1 主流方案及嘗試
現(xiàn)在瀏覽器插件中,大多采用直接調(diào)用遠(yuǎn)程代碼的方式進(jìn)行熱更新,由于安全策略逐步增強,越來越不支持熱更新了;chrome在新v3版本插件中直接給禁止了;對于v2版本則即將廢棄使用。
或者要翻墻到google應(yīng)用商店提交審核,才能熱更新。

?
2 當(dāng)前問題
1、由于安全策略逐步增強,越來越不支持熱更新了,之前可以直接調(diào)用遠(yuǎn)程資源的方法均被禁止了;
2、chrome插件開發(fā)中,v2版本是支持熱更新的,但明年v2版本將被廢棄到;
3、所有chrome插件都要盡快升級成v3版本,然而v3版本不支持熱更新。
4、需要要到翻墻到google應(yīng)用商店提交審核,等審核通過后,且用戶本身要至此翻墻才能進(jìn)行插件熱更新。
3 技術(shù)原理
chrome.runtime.getURL獲取js地址的方法是新版v3瀏覽器本身支持的方法,可以用它來獲取插件安裝包中的內(nèi)部靜態(tài)資源,來進(jìn)行加載。
本發(fā)明流程如下圖所示:

瀏覽器插件的新版均只允許加載本地資源,而限制外部資源的加載;本發(fā)明同樣遵循瀏覽器內(nèi)核要求,在serviceworker中加載插件中預(yù)制資源inject_base.js到頁面里,需要直接或間接用chrome.runtime.getURL方法加載inject_base.js資源,然后再從inject_base.js中加載遠(yuǎn)端inject.js資源即可,此處兩步過程可以擴(kuò)展到三步或更多步驟,但不可省略這兩個步驟。
inject.js中會有插件的核心功能資源,當(dāng)需要熱更新插件功能時,直接更新外部資源inject.js即可。
4 方案實施
在遵循瀏覽器內(nèi)核安全控制要求下,我們可以如下操作:
1) 先在serviceworker中通過chrome.runtime.getURL獲取url地址的方法動態(tài)加載預(yù)制資源inject_base.js;此處若用chrome.scripting.executeScript方法動態(tài)加載預(yù)制資源,則需先加載一個橋接資源inject_base_bridge.js,然后再在inject_base_bridge.js中用chrome.runtime.getURL方法動態(tài)加載遠(yuǎn)端indect_base.js,然后進(jìn)行第二步;
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]) {
// 注入插件預(yù)制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中加載遠(yuǎn)端inject.js資源即可;當(dāng)發(fā)布新功能時,直接發(fā)布遠(yuǎn)端的新版inject.js即可直接熱更新插件功能。
具體邏輯如下圖所示:

onMessage監(jiān)聽來動態(tài)使用擦灰姑娘如方法,確保后續(xù)js資源在每個頁面中都成功加載;需要從content_scripts中設(shè)置發(fā)送腳本輸入的消息通知:
chrome.runtime.sendMessage(chrome.runtime.id, message, callback)
這樣就可以隨時愉快的更新插件發(fā)布新功能了。
5 方案總結(jié)
該方案目前所打的包,在用戶直接下載、解壓、使用時比較合適;大多在未發(fā)布到chrome應(yīng)用商店時使用較為便捷。若要在chrome官方應(yīng)用商店發(fā)布,則需改造。待后續(xù)總結(jié)整理...

審核編輯 黃宇
-
JS
+關(guān)注
關(guān)注
0文章
79瀏覽量
18914 -
瀏覽器
+關(guān)注
關(guān)注
1文章
1043瀏覽量
37007 -
Chrome
+關(guān)注
關(guān)注
0文章
346瀏覽量
19073
發(fā)布評論請先 登錄
蘋果iTunes 更新至11.0.4版本
把老版本AD升級到最新版本AD19的方法
使用新版本IAR編譯老版本的STM32工程
如何使用更新版本的MbedTLS?
在SDK構(gòu)建過程中如何將其更新到最新版本或選擇替代版本?
FilterPro v3.0設(shè)計工具的最新版本
SteamVR獲新版本更新 已全面支持OculusRiftSVR頭顯
谷歌Gboard鍵盤安卓9.1.4版本更新
谷歌將暫時停止Chrome和Chrome OS的版本更新
蘋果正式發(fā)布了新版本的iWork套件
榮耀V40推送4.0.0.132新版本更新
FreeRTOS歷史版本更新記錄
chrome插件新版本(v3版本)中的熱更新,即加載更新遠(yuǎn)程js的方法探索
評論