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

京东云开发者
• 阅读 506

1 主流方案及尝试

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

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



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





2 当前问题

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

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

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

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

3 技术原理

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

本发明流程如下图所示:



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



浏览器插件的新版均只允许加载本地资源,而限制外部资源的加载;本发明同样遵循浏览器内核要求,在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即可直接热更新插件功能。

具体逻辑如下图所示:



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



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

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

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

5 方案总结

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



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

作者:京东科技 贾玉龙

来源:京东云开发者社区

点赞
收藏
评论区
推荐文章
Karen110 Karen110
3年前
【前端自动化】如何使用Node.js实现热重载页面
前言前不久我结合browsersyncgulpgulpnodemon实现了一款生产环境热更新(我之前理解有点偏差,应该定义为热更新,不是热重载)的项目脚手架,那么,今天我们将使用Node.js实现一个热重载页面。那么,我今天就总结一下吧,以防止大家也跟我一样。热重载所谓热重载就是页面每次改动,不需要手动去刷新,可自动刷新。热更新浏览器的无刷新更新,允许在
想天浏览器 想天浏览器
2年前
想天浏览器3.2正式版推送更新
快来看更新!经过我们一个多月的努力开发,想天浏览器3.2正式版推送更新啦。    图片下方是本次更新的主要内容↓↓浅色模式3.2改进的深色模式新增内容1.兼容插件机制插件的crx形式安装插件的解压包形式安装插件的工具栏展示与否设置插件的启用禁用chrome商店安装到想天浏览器,同时支持下载
Wesley13 Wesley13
3年前
unity热更(一)
Agenda•  什么是热更新•  为何要热更新•  如何在iOS 上对Unity 应用进行热更新•  支持UnityiOS 热更新的各种Lua 插件的对比什么是热更新• 广义定义• 无需关闭服务器,不停机状态下修复漏洞,更新资源等,重点是更新逻辑代码。• 狭义定义(iOS热更新)• 无需将代码重新打包提交至Ap
Stella981 Stella981
3年前
H5 App实现热更新,不需要重新安装app
直接上代码吧,你竟然搜到了我的文章就应该知道了,为什么要热更新//app热更新下载//假定字符串的每节数都在5位以下functiontoNum(a){//也可以这样写varca.split(/\./);varca.split('.');varnum_place""
Stella981 Stella981
3年前
Chrome 87 新特性解读,多年来 Chrome 性能最大提升!
今天Chrome更新了87最新版,这是今年最后一次Chrome更新了,这个版本是多年来Chrome性能获得最大提升的一次,开发者工具也进行了大幅度更新。有用户认为,原本Chrome的性能问题诟病已久,然而在新Edge出来了以后,性能突然就提升了,这显然是谷歌方面受到了Edge市场份额暴增带来的压力。另外,在Mac上的
Stella981 Stella981
3年前
CodePush中的staging deployment如何设置
我们集成reactnative的热更新主要是用来做一些小修复,直接用了微软的CodePush。CodePush默认的deployment分为Staging和Production,一个可以用来测试,一个用来为部署生产更新。本文记录了关键步骤和一些问题的解决方法。我们项目reactnative的版本是0.47.2参考文档CodePush(https:
Stella981 Stella981
3年前
Spring Boot(十三):实现热部署
一、前言在实际开发过程中,每次修改代码就得将项目重启,重新部署,对于一些大型应用来说,重启时间需要花费大量的时间成本。对于一个后端开发者来说,重启过程确实很难受。在java开发领域,热部署一直是一个难以解决的问题,目前的java虚拟机只能实现方法体的热部署,对于整个类的结构修改,仍然需要重启虚拟机,对类重新加载才能完成更新操作。!(htt
Flutter热更新技术探索 | 京东云技术团队
APP发布到市场后,难免会遇到严重的BUG阻碍用户使用,因此有在不发布新版本APP的情况下使用热更新技术立即修复BUG需求。原生APP(例如:Android&IOS)的热更新需求已经比较成熟,但Flutter技术栈目前还缺少类似的技术方案,因此Flutter研发团队,也需要类似的热更新技术。
Spring Loaded代码热更新实践和原理分析 | 京东云技术团队
本文将深入探讨如何利用SpringLoaded热更新技术提高开发效率,减少编译和重启时间。分析SpringLoaded的热更新原理,以及实际应用过程中所需的操作和注意事项。
京东云开发者 京东云开发者
10个月前
热更新适配ibatis原理浅析
一、热更新解决了什么问题?在研发过程中,每个研发同学在联调、自测阶段中总会频繁的去执行编译、构建、打包的动作,遇到比较大的项目,执行一套流程下来,往往需要310分钟左右,极大的降低了研发的速度,基于以上痛点,我们基于JAVAAgent技术开发出一套插件【藏