【问题标题】:Override Javascript file in chrome在 chrome 中覆盖 Javascript 文件
【发布时间】:2016-06-05 10:28:15
【问题描述】:

我想用我自己版本的 chrome 中类似的 javascript 文件覆盖一个 javascript 文件。

让我解释一下:

  1. 假设一个网站“http://example.com”调用“http://example.com/script/somescript.js”。

  2. 我想做的是用位于“http://localhost/script/somescript.js”的我自己的版本覆盖文件“http://example.com/script/somescript.js”。

  3. 我需要有效地修改原始 Javascript 文件中的一个函数。

【问题讨论】:

    标签: javascript google-chrome


    【解决方案1】:

    Chrome 中有用于这些目的的插件和工具:

    1. Chrome's DevTools, tab Local Overrides(从 Chrome 65 开始支持)
    2. Requestly
    3. Resource Override
    4. 您可能还想使用Tamper,这是一个基于 mitmproxy 的 devtools 扩展程序,可让您在本地编辑远程文件并将它们直接提供给 Chrome。 (但是安装使用比较头疼)

    选择对你来说更容易使用的那个。

    【讨论】:

    • 由于某种原因,拦截对我不起作用,但我正在寻找资源覆盖,谢谢 :-)
    • @wenn32 如果您还有 Firefox 的用例,Requestly 可以提供帮助。它可在 Chrome 和 Firefox 上使用。结帐requestly.in
    • 拦截似乎对我不起作用。使用 Requestly 和 Resource Override,您要调试的文件会从 devtools 的“源”视图中消失,从而难以通过调试器运行。
    • @mcv 在请求中,您重定向的文件在开发工具中不可见,但您重定向到的文件将在开发工具中可见。您可以在 chrome 开发工具中检查新文件/url 以对其进行调试。
    • 有什么方法可以覆盖每次使用具有固定字符数的新名称提供的 js 文件吗?
    【解决方案2】:

    您可以通过添加(或在控制台中执行)此脚本将文件加载到页面中。

    window.onload = function () {
      var script = document.createElement('script');
      script.src = '//localhost/your/script';
      script.onload = function() {
        console.log('your script have been loaded');
      }
      document.body.appendChild(script);
    }
    

    如果您要覆盖的文件包含全局函数/变量将被文件中的新版本覆盖,或者如果您要覆盖的元素是命名空间,只需遵循路径(例如My.namespace.method = myNewMethod

    【讨论】:

      【解决方案3】:

      您可以自己创建一个 chrome 扩展。如果您使用像 yeoman chrome extension 这样的工具,这非常简单,只需几分钟。创建一个新目录并运行生成器

      yo chrome-extension
      

      输入扩展名和简短描述。选择Page Action 并且您要使用Content Scripts。您可以忽略其他选项 - 关注 this excellent guide if you come in doubt,但这真的很简单。

      ? What would you like to call this extension? insert-script
      ? How would you like to describe this extension? replace a function with another function
      ? Would you like to use UI Action? Page Action
      ? Would you like more UI Features? Content Scripts
      ? Would you like to set permissions? 
      

      ..等等。现在你有了这样的目录结构

      app
        bower_components
        images
        _locales
        scripts.babel
            background.js
            chromereload.js
            contentscript.js
      

      不能用另一个脚本替换现有的已加载远程脚本,因为该脚本已加载到 DOM 中。但是您可以在正文末尾插入一个新脚本,该脚本会覆盖您要替换的函数。函数是变量,如果您在文档中添加一个与现有函数同名的新函数,则将执行新函数而不是旧函数,就像您声明一个与现有变量同名的新变量一样。现在打开并编辑contentscript.js

      'use strict';
      
      console.log('\'Allo \'Allo! Content script');
      

      代码可能是这样的

      'use strict';
      
      var code = `
          function foo() {
              alert('foo');
          }
      `;
      
      var script = document.createElement('script');
      script.textContent = code;
      document.body.appendChild(script);
      

      注意template literal。我们需要将代码作为字符串插入,但使用反引号使其更具可读性。将foo() 替换为您要覆盖的函数。

      无需部署或捆绑。您可以立即从运行生成器的路径安装扩展程序

      1. chrome://extensions
      2. 检查开发者模式
      3. 点击上传解压后的扩展
      4. 从你的路径中选择manifest.json
      5. 之后,当您对contentscript.js 进行更改时,您只需在扩展页面上点击重新加载即可。

      【讨论】:

      • 会将您的答案加入书签,以防万一我创建了 chrome 插件。谢谢你这么精彩的解释:-)。
      • 你确定吗?当我使用“资源覆盖”扩展名覆盖有问题的远程脚本时,控制台中没有错误。但是,如果事情如您所说,原始脚本将首先运行(它具有直接的逻辑,并且没有在“onload”或“ondomready”上设置任何内容)并生成错误,对吗?
      【解决方案4】:

      您可以使用简单的 chrome 扩展程序(如 Requestly)轻松完成此操作。步骤如下:

      1. 创建规则
      2. 选择重定向规则
      3. 输入源 URL 等于 - http://example.com/script/somescript.js
      4. 输入目的地 - http://localhost/script/somescript.js

      它应该看起来像这样:

      您还可以根据您的用例选择“包含/匹配”运算符。

      【讨论】:

      • 很棒的工具,当我需要测试 js/css 文件的替代版本时很有用。
      • 感谢@MatteoConta。 Requestly 还包含许多其他功能,例如脚本注入、用户代理修改、文件库、查询参数修改等。请检查一下。
      【解决方案5】:

      在 Chrome 65 中,这变得微不足道。

      Using local overrides – Chrome 65

      这是什么? 这是一项新功能,允许我们使用跨会话持久保存的本地副本覆盖网站代码/css。一旦你覆盖了一个文件,它就会一直存在,直到你删除覆盖。

      如何设置?

      1. 打开来源面板。
      2. 打开覆盖选项卡。 Open overrides tab
      3. 点击设置覆盖。
      4. 选择要将更改保存到的目录。
      5. 在视口顶部,单击“允许”以授予 DevTools 对该目录的读写权限。
      6. 进行更改。 添加文件夹后,您可以切换到网络选项卡并右键单击任何文件并选择“保存以覆盖”。我已经覆盖了 scripts.js,所以它显示为“蓝点”。

      【讨论】:

      • 不过,这些覆盖仅适用于 devtools 处于活动状态。
      • 任何想法,如何为 chrome 扩展的脚本进行本地覆盖?
      【解决方案6】:

      根据上面 dharam 的回答,资源覆盖有效。

      对于无法访问 Chrome 商店的人,您可以在此处下载源代码:

      https://github.com/kylepaulsen/ResourceOverride

      在 Chrome 中,进入 chrome://extensions/ ,启用开发者模式,然后将提取的源根目录(包含文件 manifest.json)加载到 Chrome 中。

      在 Windows 10 上针对 Chrome 73.0.3683.86 进行了测试。我之前无法在 StackOverflow 上发布任何内容,因为 https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js 被阻止。然后在 ResourceOverride 的设置中,我将其映射到 https://localhost/jquery-1.12.4.min.js,它终于可以工作了。

      我运行一个启用 SSL 并启用 localhost 证书的 ASP.NET Core 2.1 项目,以从本地磁盘提供 jquery-1.12.4.min.js。

      在launchSettings.json中有

      "applicationUrl": "https://localhost:443;http://localhost:80",
      

      在 Kestral 配置文件(不是 IIS 配置文件)中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-16
        • 1970-01-01
        • 2018-08-29
        • 2016-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多