【问题标题】:Chrome just doesn't finish loading JS filesChrome 只是没有完成加载 JS 文件
【发布时间】:2014-11-08 22:08:51
【问题描述】:

我正在编写一个应用程序,其中在 <head> 部分中包含大约 12 个短 JS 文件(我知道,我应该将它们合并并在 <body> 结束之前移动它们;在生产中会得到这些文件)

问题在于,当我尝试在 Chrome 中加载应用时,有些文件会立即加载,而有些则根本加载不完! Chrome 一直在尝试加载 12 个 JS 文件,并且从不呈现页面直到我点击“停止”。

当我点击停止时,HTML 被渲染并且 JS 文件失败,如下图所示:

请注意,不同的 JS 文件每次尝试都会失败!每次卡住的不是同一个文件!

检查失败文件的标头显示“警告:请求尚未完成”。文件有时会卡在“正在接收”中好几分钟!

现在有趣的部分来了,点击停止后,如果我专注于多功能栏并按 Enter,所有 JS 文件立即加载并且应用程序运行正常!

在服务器端,我使用的是 Apache、PHP 和 MySQL。我是否在 Apache 中配置错误?

2 天后的状态:zilch,没什么,nada,这让我发疯了。我尝试从不同的机器上运行代码,尝试更改 apache 缓存设置并更改 javascript 中的无数内容,但没有任何效果。最糟糕的是,没有人能指出问题出在哪里!

【问题讨论】:

  • 尝试关闭一些 chrome 扩展。众所周知,Adblock 会干扰开发。
  • 所有扩展都被阻止。以前没有人遇到过这样的事情吗?为什么投反对票?我还没有在任何地方找到解决方案!
  • 您是否尝试过在其他地方托管文件?也许有某种mime类型的问题? (我没有投反对票)。
  • 3.5 分钟加载缩小的 jquery - 这里确实有问题。您是否仅在 Chrome 中遇到过这些问题? Firefox 会发生什么?
  • 您是否尝试过注释掉或删除每个包含,重新加载,看看是否遇到同样的问题

标签: javascript php html apache google-chrome


【解决方案1】:

一种可能是您启用了 Keep-Alive,但它无法正常工作。我以前见过这个。浏览器建立到您的服务器的最大连接数(通常为 6 个)以下载前几个文件(CSS、JS 等),然后这些连接在超时之前不会释放。我的症状与你的不太一样 - 超时为 20 秒,之后所有内容都会分批加载 6 个 - 但这仍然可能是原因。

在您的 Apache 配置(大多数系统上的 httpd.conf)中,查找 KeepAlive 行(如果缺少,则添加它)并将其设置为 Off

【讨论】:

  • 你能详细说明“keep-alive”不能正常工作吗?它将如何导致问题?我在使用 IIS 时遇到了同样的问题。
【解决方案2】:

不仅仅是一个答案,这是我解决问题的方法。

我会尝试的一件事是一次注释掉一个标签并重新加载,以查看阈值在哪里。另外,因为这可能是服务器配置问题,所以我会在每次尝试后重新启动它,以便有一个干净的状态,可以这么说,即尝试之间没有保留状态。

我会尝试通过使用您最喜欢的语言的脚本发出对各种 Javascript 的请求来获得更多提示。理想情况下,我会尝试一个一个地获取脚本(比如使用 curl),在请求之间等待几毫秒。我想我也会在这里达到一个门槛。比如,每秒获取一个脚本是可行的,但是当请求太接近时,服务器就会卡住。

如果仍然没有线索,我会使用 tcpdump 来观察浏览器和服务器之间的流量。好吧,这可能有点太低级了!

但也许我会使用 netstat 查看浏览器与服务器并行打开多少连接以获取资源,并查看我们是否达到了并发限制。

很抱歉,这是一个解决方案,但我希望你能得到一些想法,我很想知道你的问题到底是什么!

【讨论】:

    【解决方案3】:

    有几个很好的答案,但如果您想要一个万无一失的方法,您可以使用 PHP 一次发送所有脚本。如果问题确实是与服务器的连接太多,您可以添加一些 html 代码,如下所示:

    <script type="text/javascript" src="scripts/scripts.php />
    

    然后在scripts.php 中使用include() 函数来包含所有JavaScript 文件,如下所示:

    <?php
    header(''); // control all your headers
    include('jquery-1.9.1.min.js');
    // rest of scripts
    ?>
    

    如果没有其他方法,并且问题是连接过多,这应该可以。

    【讨论】:

      【解决方案4】:

      尝试在https://www.stevesouders.com/cuzillion/ 中模拟问题 它应该说你的问题 - 铬或服务器

      【讨论】:

      • 链接已失效
      【解决方案5】:

      检查 Content-Length 标头。服务器可能传递不正确的值 - 大于实际内容长度。

      【讨论】:

        【解决方案6】:

        在浏览器中发出请求后,我们得到了完全相同的消息“警告:请求尚未完成”。

        请求本身大约是 15 MB 的 JSON,它被输入到 Angular 1 应用程序中。这个请求大约需要 2 秒。请求完成后,Angular 摘要循环阻塞了浏览器超过 12 秒(这在请求期间通过分析可以看到)。在那段时间里,Chrome 在请求中显示了“警告:请求尚未完成”消息,而实际上它已经完成了。

        【讨论】:

        • 您好,您能详细说明一下“请求期间的分析”吗?我想我有同样的问题,但我想确认一下
        • 嗯,已经有一段时间了。我认为它就像:启动浏览器的分析器,然后加载页面,并在请求完成并呈现应用程序后停止分析器。
        猜你喜欢
        • 2022-08-15
        • 2016-12-20
        • 2010-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 2016-06-30
        相关资源
        最近更新 更多