0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

chrome插件新版本(v3版本)中的热更新,即加载更新远程js的方法探索

京东云 来源:jf_75140285 作者:jf_75140285 2024-06-14 10:19 次阅读

1 主流方案及尝试

现在浏览器插件中,大多采用直接调用远程代码的方式进行热更新,由于安全策略逐步增强,越来越不支持热更新了;chrome在新v3版本插件中直接给禁止了;对于v2版本则即将废弃使用。

或者要翻墙到google应用商店提交审核,才能热更新。

wKgaomZrqKeASJSlAAP54WDuE2g646.png



2 当前问题

1、由于安全策略逐步增强,越来越不支持热更新了,之前可以直接调用远程资源的方法均被禁止了;

2、chrome插件开发中,v2版本是支持热更新的,但明年v2版本将被废弃到;

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

4、需要要到翻墙到google应用商店提交审核,等审核通过后,且用户本身要至此翻墙才能进行插件热更新。

3 威廉希尔官方网站 原理

chrome.runtime.getURL获取js地址的方法是新版v3浏览器本身支持的方法,可以用它来获取插件安装包中的内部静态资源,来进行加载。

本发明流程如下图所示:

wKgZomZrqKmAY8Z8AAVsKuZVn7g621.png

浏览器插件的新版均只允许加载本地资源,而限制外部资源的加载;本发明同样遵循浏览器内核要求,在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地址的方法动态加载预制资源inject_base.js;此处若用chrome.scripting.executeScript方法动态加载预制资源,则需先加载一个桥接资源inject_base_bridge.js,然后再在inject_base_bridge.js中用chrome.runtime.getURL方法动态加载远端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监听来动态使用这两个方法,否则后续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资源即可;当发布新功能时,直接发布远端的新版inject.js即可直接热更新插件功能。

具体逻辑如下图所示:

wKgaomZrqKuAM_RnAAS9wShQE7c795.png

onMessage监听来动态使用擦灰姑娘如方法,确保后续js资源在每个页面中都成功加载;需要从content_scripts中设置发送脚本输入的消息通知:

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

这样就可以随时愉快的更新插件发布新功能了。

5 方案总结

该方案目前所打的包,在用户直接下载、解压、使用时比较合适;大多在未发布到chrome应用商店时使用较为便捷。若要在chrome官方应用商店发布,则需改造。待后续总结整理...

wKgZomZrqK2AIF8QAAkGnESj91s967.png




审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JS
    JS
    +关注

    关注

    0

    文章

    74

    浏览量

    17928
  • 浏览器
    +关注

    关注

    1

    文章

    1004

    浏览量

    34770
  • Chrome
    +关注

    关注

    0

    文章

    338

    浏览量

    17924
收藏 人收藏

    评论

    相关推荐

    苹果iTunes 更新至11.0.4版本

    `今天,苹果对旗下iTunes应 用进行了版 更新,11.0.4新版本修复了一些iTunes存在的已知bug。根据新版本
    发表于 06-07 08:55

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

    `目前Altium Designer 最高版本是19,大家想体验最新版本的各项功能吗?可以按下列方法进行升级!【备注:以下内容来自网络,版权归原作者所有。如有侵权或异议,请让网删除
    发表于 12-11 19:18

    使用新版本IAR编译老版本的STM32工程

    使用新版本IAR编译老版本的STM32工程1、引言IAR作为STM32芯片的常用编译器,其版本更新较快,特别是大版本
    发表于 08-24 06:08

    如何使用更新版本的MbedTLS?

    。ST在CubeMX更新版本需要多长时间?我将如何使用更新版本的 MbedTLS?似乎我有两个选择。一种是使用 ST 版本构建项目,然后使用新版本
    发表于 12-15 09:06

    在SDK构建过程如何将其更新到最新版本或选择替代版本

    我正在使用带有为 MCUXpresso IDE 生成的 SDK 的 FRDM-K66F 板。我看到当我生成 SDK 时,CMSIS DSP 库的包含版本V1.4.5 b。在 SDK 构建过程如何将其
    发表于 04-14 07:10

    FilterPro v3.0设计工具的最新版本

    FilterPro v3.0设计工具的最新版本 TI推出其普及型 FilterProTM 设计工具的最新版本。该 FilterPro v3.0
    发表于 05-17 13:36 8101次阅读

    SteamVR获新版本更新 已全面支持OculusRiftSVR头显

    SteamVR平台迎来新版本更新,宣布现在已经全面支持最近发布的Oculus Rift S VR头显,此外该版本还修复了“众多稳定性问题和错误”。
    发表于 06-18 16:31 1854次阅读

    谷歌Gboard键盘安卓9.1.4版本更新

    谷歌Gboard键盘安卓版现已更新9.1.4版本新版本缩短了输入延迟时间和启动时间。
    的头像 发表于 03-09 14:31 2298次阅读

    谷歌将暂时停止ChromeChrome OS的版本更新

    谷歌今日发公告称,将暂时中断 ChromeChrome OS 的版本更新,并优先考虑安全和稳定性。公告全文如下:“由于目前的工作日程已调整,我们正在暂停即将推出的
    的头像 发表于 03-19 09:26 2092次阅读

    苹果正式发布了新版本的iWork套件

    近日,苹果正式发布了新版本的iWork套件,目前三大App均更新至10.0版本,如果你在使用运行iOS或者iPadOS的设备,不妨抓紧时间升级。
    的头像 发表于 04-01 15:30 2257次阅读

    荣耀V40推送4.0.0.132新版本更新

    2月24日,荣耀V40推送了4.0.0.132版本更新。此次更新优化了相机和显示体验,增强了系统稳定性,更新包大小为300MB。此次
    的头像 发表于 02-25 13:43 3205次阅读

    FreeRTOS历史版本更新记录

    前言:本文会不定期更新,一方面FreeRTOS发布新版本时会第一时间跟进;另一方面,会慢慢补上V8.0之后的版本更新内容。
    发表于 01-26 17:28 0次下载
    FreeRTOS历史<b class='flag-5'>版本</b><b class='flag-5'>更新</b>记录

    谷歌发布Chrome新版本

    近日,谷歌正式发布Chrome 100,该浏览器今天刚刚发布了版本号为 100 的最新版本,目前,Mac、Windows、安卓和iOS平台都已经开始同步推送更新
    的头像 发表于 03-30 16:54 2218次阅读

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

    本篇文章主要介绍如何在瑞萨的FSP更新新版本之后,同步更新e2studio软件的FSP版本
    的头像 发表于 12-07 10:47 1764次阅读
    瑞萨e2studio----<b class='flag-5'>更新</b>FSP<b class='flag-5'>版本</b>

    实战经验 | TouchGFX从旧版本更新新版本方法

    关键词:TouchGFX,版本升级 目录预览 1、引言 2、TouchGFX软件升级安装 3、工程项目由旧版本迁移到新版本TouchGFX 4、软件升级遇到的常见问题 01 引言 随着
    的头像 发表于 11-01 17:15 603次阅读