RM新时代网站-首页

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-06-14 10:19 ? 次閱讀

1 主流方案及嘗試

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

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

wKgaomZrqKeASJSlAAP54WDuE2g646.png

?

2 當前問題

1、由于安全策略逐步增強,越來越不支持熱更新了,之前可以直接調用遠程資源的方法均被禁止了;

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

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

4、需要要到翻墻到google應用商店提交審核,等審核通過后,且用戶本身要至此翻墻才能進行插件熱更新。

3 技術原理

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

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

wKgZomZrqKmAY8Z8AAVsKuZVn7g621.png

瀏覽器插件的新版均只允許加載本地資源,而限制外部資源的加載;本發(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即可直接熱更新插件功能。

具體邏輯如下圖所示:

wKgaomZrqKuAM_RnAAS9wShQE7c795.png

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ù)總結整理...

wKgZomZrqK2AIF8QAAkGnESj91s967.png




審核編輯 黃宇

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

    關注

    0

    文章

    78

    瀏覽量

    18096
  • 瀏覽器
    +關注

    關注

    1

    文章

    1022

    瀏覽量

    35328
  • Chrome
    +關注

    關注

    0

    文章

    342

    瀏覽量

    18014
收藏 人收藏

    評論

    相關推薦

    蘋果iTunes 更新至11.0.4版本

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

    把老版本AD升級到最新版本AD19的方法

    `目前Altium Designer 最高版本是19,大家想體驗最新版本的各項功能嗎?可以按下列方法進行升級!【備注:以下內容來自網絡,版權歸原作者所有。如有侵權或異議,請讓網刪除
    發(fā)表于 12-11 19:18

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

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

    如何使用更新版本的MbedTLS?

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

    在SDK構建過程如何將其更新到最新版本或選擇替代版本?

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

    FilterPro v3.0設計工具的最新版本

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

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

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

    谷歌Gboard鍵盤安卓9.1.4版本更新

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

    谷歌將暫時停止ChromeChrome OS的版本更新

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

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

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

    榮耀V40推送4.0.0.132新版本更新

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

    FreeRTOS歷史版本更新記錄

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

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

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

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

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

    實戰(zhàn)經驗 | TouchGFX從舊版本更新新版本方法

    關鍵詞:TouchGFX,版本升級 目錄預覽 1、引言 2、TouchGFX軟件升級安裝 3、工程項目由舊版本遷移到新版本TouchGFX 4、軟件升級遇到的常見問題 01 引言 隨著
    的頭像 發(fā)表于 11-01 17:15 ?1111次閱讀
    RM新时代网站-首页