【问题标题】:How to replace Javascript of production website with local Javascript?如何用本地 Javascript 替换生产网站的 Javascript?
【发布时间】:2011-04-25 14:08:27
【问题描述】:

在我的生产网站上,我已经编译了 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”执行的解决方案。

有什么想法吗?

【问题讨论】:

    标签: javascript debugging


    【解决方案1】:

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

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

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

    static.example.com 127.0.0.1
    

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

    另一种解决方案是使用(本地)代理服务器(如 Privoxy)将http://example.com/js/ 重定向到http://localhost/js/

    【讨论】:

    • 如果 IT 部门没有出于“安全”原因在工作场所从地狱锁定此文件的编辑权限就好了。 >:)
    • 好主意。我去做。但是这个解决方案仍然涉及将所有 JS 代码放在一个文件中。将它们全部分开会是完美的。
    【解决方案2】:

    我的做法:

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

    不用替换js文件,你可以替换html文件,改变页面上的js链接。

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

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

    【讨论】:

    • 应该可以。但我会寻找其他更容易编写脚本和免费的代理解决方案。谁能推荐一个适合 linux/osx 的好软件?
    • 更新:我给自己写了一个小代理,它从我的生产服务器转发所有内容,字符串替换了特定的
    • 伙计.. 我欠你一杯啤酒!
    【解决方案3】:

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

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

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

    祝你好运!

    【讨论】:

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

    虽然 epascarello 的解决方案有效,但对于缩小文件的调试,还有一个更快的解决方案。考虑使用JavaScript source maps。现代 Firefox 和 Chrome 支持它们。

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

    【讨论】:

    • 只是一个简短的评论,因为我不清楚:缩小的版本是解析和执行的,而不是未缩小的版本。
    • @DanielSokolowski 是的,你是对的。浏览器执行缩小版本,但在 DEV 工具中显示原始版本(未缩小),因此您可以执行逐步执行并观察变量。
    【解决方案5】:

    要添加 NEW 文件,您可以使用其他帖子中的内容:

    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);
    

    【讨论】:

    • 有趣的尝试。当我运行此代码时,它没有达到第 3 阶段。关于为什么的任何想法?
    • 它达到第 2 阶段了吗?
    • 感谢您的回复!是的,确实如此。我实际上已经在这个问题上创建了一个线程stackoverflow.com/q/43444796/6130540
    • 如何用我在同一个脚本中放入变量的js替换?
    【解决方案6】:

    在您的 URL 中添加一些内容以区分您的开发和产品上下文; 例子 : http://url_of_prod.com

    http://url_of_dev.com?debug=true

    然后,使用一些 javascript 检查 GET 变量调试是否打开或检查 URL
    if (window.location.host.indexOf('url_of_dev') > -1) ...

    然后使用加载函数加载或不加载您的文件,如下例所示: http://www.softpeople.fr/replaceswitch-dev-local-production-website-javascript-during-debug/

    【讨论】:

      【解决方案7】:

      无需使用任何低于 chrome 的 Web 代理功能,即可对 js 和 css 文件应用本地覆盖 https://developer.chrome.com/blog/new-in-devtools-65/#overrides

      【讨论】:

        猜你喜欢
        • 2020-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多