0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

chrome插件新版本(v3版本)中的熱更新,即加載更新遠(yuǎn)程js的方法探索

京東云 ? 來(lái)源:jf_75140285 ? 作者:jf_75140285 ? 2024-06-14 10:19 ? 次閱讀

1 主流方案及嘗試

現(xiàn)在瀏覽器插件中,大多采用直接調(diào)用遠(yuǎn)程代碼的方式進(jìn)行熱更新,由于安全策略逐步增強(qiáng),越來(lái)越不支持熱更新了;chrome在新v3版本插件中直接給禁止了;對(duì)于v2版本則即將廢棄使用。

或者要翻墻到google應(yīng)用商店提交審核,才能熱更新。

wKgaomZrqKeASJSlAAP54WDuE2g646.png

?

2 當(dāng)前問(wèn)題

1、由于安全策略逐步增強(qiáng),越來(lái)越不支持熱更新了,之前可以直接調(diào)用遠(yuǎn)程資源的方法均被禁止了;

2、chrome插件開(kāi)發(fā)中,v2版本是支持熱更新的,但明年v2版本將被廢棄到;

3、所有chrome插件都要盡快升級(jí)成v3版本,然而v3版本不支持熱更新。

4、需要要到翻墻到google應(yīng)用商店提交審核,等審核通過(guò)后,且用戶本身要至此翻墻才能進(jìn)行插件熱更新。

3 技術(shù)原理

chrome.runtime.getURL獲取js地址的方法是新版v3瀏覽器本身支持的方法,可以用它來(lái)獲取插件安裝包中的內(nèi)部靜態(tài)資源,來(lái)進(jìn)行加載。

本發(fā)明流程如下圖所示:

wKgZomZrqKmAY8Z8AAVsKuZVn7g621.png

瀏覽器插件的新版均只允許加載本地資源,而限制外部資源的加載;本發(fā)明同樣遵循瀏覽器內(nèi)核要求,在serviceworker中加載插件中預(yù)制資源inject_base.js到頁(yè)面里,需要直接或間接用chrome.runtime.getURL方法加載inject_base.js資源,然后再?gòu)膇nject_base.js中加載遠(yuǎn)端inject.js資源即可,此處兩步過(guò)程可以擴(kuò)展到三步或更多步驟,但不可省略這兩個(gè)步驟。

inject.js中會(huì)有插件的核心功能資源,當(dāng)需要熱更新插件功能時(shí),直接更新外部資源inject.js即可。

4 方案實(shí)施

在遵循瀏覽器內(nèi)核安全控制要求下,我們可以如下操作:

1) 先在serviceworker中通過(guò)chrome.runtime.getURL獲取url地址的方法動(dòng)態(tài)加載預(yù)制資源inject_base.js;此處若用chrome.scripting.executeScript方法動(dòng)態(tài)加載預(yù)制資源,則需先加載一個(gè)橋接資源inject_base_bridge.js,然后再在inject_base_bridge.js中用chrome.runtime.getURL方法動(dòng)態(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");
	 // 重點(diǎn)是這句
	 script.src = chrome.runtime.getURL(injectPath);
	 document.body.appendChild(script);
}

該步驟中需要注意的是:不可以直接用chrome.runtime.getURL或chrome.scripting.executeScript這兩個(gè)方法,而是需要用onMessage監(jiān)聽(tīng)來(lái)動(dòng)態(tài)使用這兩個(gè)方法,否則后續(xù)js資源的加載則只在安裝或刷新時(shí)生效一次,而不能在每個(gè)頁(yè)面中都成功加載。

?

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)再?gòu)膇nject_base.js中加載遠(yuǎn)端inject.js資源即可;當(dāng)發(fā)布新功能時(shí),直接發(fā)布遠(yuǎn)端的新版inject.js即可直接熱更新插件功能。

具體邏輯如下圖所示:

wKgaomZrqKuAM_RnAAS9wShQE7c795.png

onMessage監(jiān)聽(tīng)來(lái)動(dòng)態(tài)使用擦灰姑娘如方法,確保后續(xù)js資源在每個(gè)頁(yè)面中都成功加載;需要從content_scripts中設(shè)置發(fā)送腳本輸入的消息通知:

chrome.runtime.sendMessage(chrome.runtime.id, message, callback)

這樣就可以隨時(shí)愉快的更新插件發(fā)布新功能了。

5 方案總結(jié)

該方案目前所打的包,在用戶直接下載、解壓、使用時(shí)比較合適;大多在未發(fā)布到chrome應(yīng)用商店時(shí)使用較為便捷。若要在chrome官方應(yīng)用商店發(fā)布,則需改造。待后續(xù)總結(jié)整理...

wKgZomZrqK2AIF8QAAkGnESj91s967.png




審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • JS
    JS
    +關(guān)注

    關(guān)注

    0

    文章

    78

    瀏覽量

    18053
  • 瀏覽器
    +關(guān)注

    關(guān)注

    1

    文章

    1009

    瀏覽量

    35226
  • Chrome
    +關(guān)注

    關(guān)注

    0

    文章

    340

    瀏覽量

    17965
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    蘋(píng)果iTunes 更新至11.0.4版本

    `今天,蘋(píng)果對(duì)旗下iTunes應(yīng) 用進(jìn)行了版 更新,11.0.4新版本修復(fù)了一些iTunes存在的已知bug。根據(jù)新版本
    發(fā)表于 06-07 08:55

    把老版本AD升級(jí)到最新版本AD19的方法

    `目前Altium Designer 最高版本是19,大家想體驗(yàn)最新版本的各項(xiàng)功能嗎?可以按下列方法進(jìn)行升級(jí)!【備注:以下內(nèi)容來(lái)自網(wǎng)絡(luò),版權(quán)歸原作者所有。如有侵權(quán)或異議,請(qǐng)讓網(wǎng)刪除
    發(fā)表于 12-11 19:18

    使用新版本IAR編譯老版本的STM32工程

    使用新版本IAR編譯老版本的STM32工程1、引言IAR作為STM32芯片的常用編譯器,其版本更新較快,特別是大版本
    發(fā)表于 08-24 06:08

    如何使用更新版本的MbedTLS?

    。ST在CubeMX更新版本需要多長(zhǎng)時(shí)間?我將如何使用更新版本的 MbedTLS?似乎我有兩個(gè)選擇。一種是使用 ST 版本構(gòu)建項(xiàng)目,然后使用新版本
    發(fā)表于 12-15 09:06

    在SDK構(gòu)建過(guò)程如何將其更新到最新版本或選擇替代版本

    我正在使用帶有為 MCUXpresso IDE 生成的 SDK 的 FRDM-K66F 板。我看到當(dāng)我生成 SDK 時(shí),CMSIS DSP 庫(kù)的包含版本V1.4.5 b。在 SDK 構(gòu)建過(guò)程如何將其
    發(fā)表于 04-14 07:10

    FilterPro v3.0設(shè)計(jì)工具的最新版本

    FilterPro v3.0設(shè)計(jì)工具的最新版本 TI推出其普及型 FilterProTM 設(shè)計(jì)工具的最新版本。該 FilterPro v3.0
    發(fā)表于 05-17 13:36 ?8149次閱讀

    SteamVR獲新版本更新 已全面支持OculusRiftSVR頭顯

    SteamVR平臺(tái)迎來(lái)新版本更新,宣布現(xiàn)在已經(jīng)全面支持最近發(fā)布的Oculus Rift S VR頭顯,此外該版本還修復(fù)了“眾多穩(wěn)定性問(wèn)題和錯(cuò)誤”。
    發(fā)表于 06-18 16:31 ?1925次閱讀

    谷歌Gboard鍵盤(pán)安卓9.1.4版本更新

    谷歌Gboard鍵盤(pán)安卓版現(xiàn)已更新9.1.4版本,新版本縮短了輸入延遲時(shí)間和啟動(dòng)時(shí)間。
    的頭像 發(fā)表于 03-09 14:31 ?2436次閱讀

    谷歌將暫時(shí)停止ChromeChrome OS的版本更新

    谷歌今日發(fā)公告稱,將暫時(shí)中斷 ChromeChrome OS 的版本更新,并優(yōu)先考慮安全和穩(wěn)定性。公告全文如下:“由于目前的工作日程已調(diào)整,我們正在暫停即將推出的
    的頭像 發(fā)表于 03-19 09:26 ?2201次閱讀

    蘋(píng)果正式發(fā)布了新版本的iWork套件

    近日,蘋(píng)果正式發(fā)布了新版本的iWork套件,目前三大App均更新至10.0版本,如果你在使用運(yùn)行iOS或者iPadOS的設(shè)備,不妨抓緊時(shí)間升級(jí)。
    的頭像 發(fā)表于 04-01 15:30 ?2366次閱讀

    榮耀V40推送4.0.0.132新版本更新

    2月24日,榮耀V40推送了4.0.0.132版本更新。此次更新優(yōu)化了相機(jī)和顯示體驗(yàn),增強(qiáng)了系統(tǒng)穩(wěn)定性,更新包大小為300MB。此次
    的頭像 發(fā)表于 02-25 13:43 ?3366次閱讀

    FreeRTOS歷史版本更新記錄

    前言:本文會(huì)不定期更新,一方面FreeRTOS發(fā)布新版本時(shí)會(huì)第一時(shí)間跟進(jìn);另一方面,會(huì)慢慢補(bǔ)上V8.0之后的版本更新內(nèi)容。
    發(fā)表于 01-26 17:28 ?0次下載
    FreeRTOS歷史<b class='flag-5'>版本</b><b class='flag-5'>更新</b>記錄

    谷歌發(fā)布Chrome新版本

    近日,谷歌正式發(fā)布Chrome 100,該瀏覽器今天剛剛發(fā)布了版本號(hào)為 100 的最新版本,目前,Mac、Windows、安卓和iOS平臺(tái)都已經(jīng)開(kāi)始同步推送更新
    的頭像 發(fā)表于 03-30 16:54 ?2364次閱讀

    瑞薩e2studio----更新FSP版本

    本篇文章主要介紹如何在瑞薩的FSP更新新版本之后,同步更新e2studio軟件的FSP版本
    的頭像 發(fā)表于 12-07 10:47 ?2199次閱讀
    瑞薩e2studio----<b class='flag-5'>更新</b>FSP<b class='flag-5'>版本</b>

    實(shí)戰(zhàn)經(jīng)驗(yàn) | TouchGFX從舊版本更新新版本方法

    關(guān)鍵詞:TouchGFX,版本升級(jí) 目錄預(yù)覽 1、引言 2、TouchGFX軟件升級(jí)安裝 3、工程項(xiàng)目由舊版本遷移到新版本TouchGFX 4、軟件升級(jí)遇到的常見(jiàn)問(wèn)題 01 引言 隨著
    的頭像 發(fā)表于 11-01 17:15 ?1024次閱讀