如何用本地 Javascript 替换生产网站的 Javascript?

IT技术 javascript debugging
2021-03-21 17:33:05

在我的生产网站上,我已经编译了 Javascript。

<script src="/js/mycode.min.js"></script>

如果我可以让我的浏览器将其替换为

<script src="http://localhost/js/mycode1.js"></script>
<script src="http://localhost/js/mycode2.js"></script>
...

我知道我可以使用 Greasemonkey 用户脚本之类的东西来操作 DOM,但我无法想出一个解决方案来阻止“mycode.min.js”的执行。

有任何想法吗?

6个回答

我这样做的方式:

  1. 如果您使用的是 Windows ,请下载并安装Fiddler
  2. 启用它以捕获 http 流量 [IE/Chrome 默认情况下会这样做,Firefox - 通过它安装的插件启用它]
  3. 加载有问题的页面。
  4. 在左侧的http流量列表中找到要替换的文件,点击。
  5. 右侧有一个 AutoResponder 选项卡。点击它。
  6. 单击复选框以“启用自动响应”
  7. 单击添加...按钮
  8. 在右侧的第二个下拉菜单中,选择“查找文件”选项
  9. 在对话框中找到该文件,然后单击保存
  10. 重复步骤 4-9,直到替换所有要替换的文件
  11. 刷新浏览器窗口,你的新 js 文件正在运行

除了替换js文件,还可以替换html文件,更改页面上的js链接。

如果您使用的是 mac/linux,则可以安装Charles(非免费,有试用) 步骤类似,但不一样。

如果你使用Google Closure来压缩文件,你可以安装他们的插件来做源映射

伙计……我欠你一瓶啤酒!
2021-04-25 17:33:05
应该管用。但我会寻找其他更容易编写脚本且免费的代理解决方案。任何人都可以为 linux/osx 推荐一个好的吗?
2021-05-06 17:33:05
更新:我给自己写了一个小代理,它从我的生产服务器转发所有内容,字符串替换特定的 <script>-tag。效果很好,谢谢你的想法。
2021-05-21 17:33:05

http://static.example.com对静态文件(例如 .js 文件)使用子域并更改主机文件怎么样?

<script type="text/javascript" src="http://static.example.com/js/mycode.min.js"></script>

将以下行添加到主机文件(/etc/hosts对于 Linux,C:\WINDOWS\System32\drivers\etc\host):

static.example.com 127.0.0.1

当然,您必须使用来自http://static.example.com/on的文件运行服务器127.0.0.1

另一种解决方案是使用像 Privoxy 这样的(本地)代理服务器来重定向http://example.com/js/http://localhost/js/.

好主意。我去做。但是这个解决方案仍然涉及将所有 JS 代码放在一个文件中。将它们全部分开将是完美的。
2021-04-24 17:33:05
如果 IT 部门出于“安全”原因没有在地狱中锁定对该文件的编辑访问权限。>:)
2021-05-16 17:33:05

要添加文件,您可以使用类似于另一篇文章的内容:

document.body.appendChild(document.createElement("script").src = "http://example.com/addThisJSFile.js");

这个 tampermonkey 脚本可以域中的自定义文件替换网页上的任何 JS 文件:

// ==UserScript==
// @name         ReplaceJS
// @namespace    http://example.com/
// @version      1.0.0
// @description  Replace javascript files on any webpage!
// @author       Mr.Sonic Master
// @match        *
// @run-at       document-start
// ==/UserScript==

var newJSFile = "http://example.com/newJSFile.js"; //The JS file to load in replacment od old JS file

var oldJSFile = "oldJSFile.replaceThis.js"; //The old JS file as it is named in inspect element (make sure its spelled EXACTLY the same)

var pattern = new RegExp(oldJSFile, "i"); //Create the RegExp pattern with the /i switch to make it case-insensitive

function injectScript(originalPage) { //Function injectScript replaces the file
    console.log('Replace stage 2: Replace text matching', oldJSFile, 'with', newJSFile);
    var moddedPage = originalPage.replace(pattern, newJSFile); //Modify the HTML code that we got, replacing the old JS file with the new one
    document.open();
    console.log('Replace stage 3: Write new HTML to page...');
    document.write(moddedPage); //Write to the page the new HTML code
    document.close();
}

setTimeout(function() { //Wait a bit for the page's HTML to load...
    console.log('Replace stage 1: target HTML');
    injectScript(document.documentElement.outerHTML); //Run function injectScript with the page's HTML as oldPage in the function
}, 1111);
是否达到第 2 阶段?
2021-05-08 17:33:05
谢谢你的回复!是的,确实如此。我实际上已经在这个问题上创建了一个线程stackoverflow.com/q/43444796/6130540
2021-05-10 17:33:05
有趣的尝试。当我运行这段代码时,它没有达到第 3 阶段。关于为什么的任何想法?
2021-05-13 17:33:05
如何用我在同一个脚本中放入变量的 js 替换?
2021-05-21 17:33:05

假设你的脚本只是生产文件的原始版本,你可以打开你最喜欢的调试器或 JS 控制台并导入你的脚本:

document.body.appendChild(document.createElement("script")).src = 
    "http://localhost/js/mycode1.js";

这样做将覆盖最初定义的函数和变量。您必须手动重新运行window.onload. 如果您有立即运行或加载时在页面上发生很大变化的脚本,您可能需要做一些工作才能将其恢复到原始状态。

祝你好运!

如果原始代码操作页面或添加事件处理程序,这不是一个很好的解决方案。你最终会导致更多的问题。
2021-04-25 17:33:05
当然......我在回答中说了这么多。但是,如果您要做的只是调试代码,只需用这种技术替换函数就足以在代码中设置断点并进行调试。
2021-04-30 17:33:05

尽管 epascarello 的解决方案有效,但对于缩小文件的调试有一个更快的解决方案。考虑使用JavaScript 源映射现代 Firefox 和 Chrome 支持它们。

源地图的想法是说浏览器在哪里可以找到未缩小的版本。当您在浏览器开发人员工具中开始调试时 - 浏览器会加载脚本的未缩小版本,并在调试器中向您显示易于阅读的 JavaScript(或您编译为 JavaScript 的任何代码)代码。

@DanielSokolowski 是的,你是对的。浏览器执行缩小版本,但在 DEV 工具中向您显示原始版本(未缩小),因此您可以逐步执行并观察变量。
2021-04-29 17:33:05
只是一个简短的评论,因为我不清楚:缩小版是解析和执行的,而不是未缩小版。
2021-05-12 17:33:05