如何在浏览器的调试器本身中调试动态加载的 JavaScript(使用 jQuery)?

IT技术 javascript debugging dynamic loaded
2021-03-01 18:01:30

动态添加的脚本未显示在浏览器的调试器的脚本部分中。

解释:

我需要使用并且已经使用过

if( someCondition == true ){
   $.getScript("myScirpt.js", function() {
       alert('Load Complete');
       myFunction();
   });
}

这样 myScript.js 可以在满足某些条件时动态加载......并且只有在加载整个脚本后才能调用 myFunction......

但是浏览器没有在调试器的脚本部分显示动态加载的 myScript.js。

是否有另一种方式可以实现所有目标,这将使人们能够在浏览器本身中调试动态加载的脚本?

5个回答

您可以为动态加载的脚本命名,以便它在 Chrome/Firefox JavaScript 调试器中显示。为此,请在脚本末尾添加注释:

//# sourceURL=filename.js

然后,该文件将在“来源”选项卡中显示为filename.js. 根据我的经验,您可以在名称中使用 's 但如果使用 /'s 我会得到奇怪的行为。

由于如果未指定域filename.js会出现在名为“(no domain)”的文件夹中,因此可以方便地指定域以提高调试体验,例如查看“自定义”文件夹可以使用:

//# sourceURL=browsertools://custom/filename.js

一个完整的例子如下:

window.helloWorld = function helloWorld()
{
  console.log('Hello World!');
}
//# sourceURL=browsertools://custom/helloWorld.js

有关更多信息,请参阅: //@sourceurl 的动态 JavaScript 弃用中的断点

Afaik,大多数 JavaScript 压缩器从生产阶段删除这些行,使其对生产错误诊断无用。
2021-04-27 18:01:30
另一件需要注意的事情是评论风格。您提供的“弃用//@sourceURL”链接同时提到了“//# sourceURL=”和“/*# sourceURL=”。那是因为这也可以用于 CSS,您必须使用块注释,因为单行“//”注释无效。让我感到惊讶的是,您不能在 javascript 中使用“/* sourceURL=”。它只是被忽略。
2021-04-28 18:01:30
对我来说,js 文件显示在名为“(无域)”的组内的源列表中。可能值得一提,因为我一开始就错过了!
2021-05-11 18:01:30
请注意,它已更改为 //#,尽管 //@ 在 Chrome 中仍然有效。.html 文件中的脚本也可以用同样的方式命名。当心!不要在“=”符号前后留下任何空格。
2021-05-14 18:01:30
只是一个提示。Chrome 调试器将这些伪 javascript 文件放入“源”选项卡中的“(无域)”节点元素中,至少在 localhost 上调试时如此。那是我找到他们的地方。
2021-05-18 18:01:30

您可以在脚本文件或脚本标记的末尾使用//# sourceURL=//# sourceMappingURL=

注意: //@ sourceURL//@ sourceMappingURL已弃用。

2021-05-16 18:01:30
当然,但是大多数小型机都会在生产阶段删除这条线。
2021-05-16 18:01:30

我尝试使用 OP 建议作为解决方法的“//# sourceURL=filename.js”,但它仍然没有出现在“源”面板中,除非它已经存在于我之前的选项卡中它产生了一个例外。

编写“调试器”;线迫使它在那个位置断裂。然后,一旦它出现在“源”面板的选项卡中,我就可以像平常一样设置断点并删除“调试器”;线。

我还需要使用debugger;,并且在加载脚本时必须打开 DevTools。
2021-04-30 18:01:30
它也可能显示在“来源”选项卡下的(无域)列表中。
2021-05-01 18:01:30
一些额外的信息:使用 browsertools:// 作为协议 //# sourceURL=browsertools://yourdomaingoeshere.com/action-openuwws.js
2021-05-07 18:01:30

请注意,以这种方式出现在源选项卡中的源文件将出现在(无域)组中,如果您想调试它,您需要debugger;在代码中添加一行,使该行被执行(通常在开始执行源文件),然后在任何地方添加断点。

如果您正在调试生产阶段,debugger;您的代码中可能没有任何行,您可以通过使用 CharlesProxy 对“插入调试器行的源文件的新副本”进行本地映射来实现这一点。

这救了我!不管我做了什么,直到我输入调试器命令,文件才显示出来。之后,即使在我删除了 debugger 命令之后,它仍然存在于页面重新加载和调试会话中。
2021-05-05 18:01:30

当尝试在 IE 中跟踪此类事情时,我打开开发工具 (F12),然后在控制台中使用以下行找到放置断点的位置:

debugger;myFunction();

这将切换到调试器选项卡,您可以在其中进入myFunction()并设置断点。