我有一个700kb解压缩的JS文件,该文件加载在每个页面上。在我在每个页面上放置12 javascript文件之前,但是为了减少http请求,我将它们全部压缩到1 file中。

此文件为~130kb gzipped并通过gzip提供。但是,在本地计算机上,它仍未打开包装并加载到每一页上。这是性能问题吗?

我已经用firebug profiler对javascript进行了分析,但是没有发现任何问题。我面临的问题/错觉是该文件中压缩了jquery库,这些库有时未在当前页面上使用。

例如jquery datatables已压缩200kb,并且仅在我的2个中加载网站页面。另一个是jqplot,也就是另一个200kb

我现在有400kb的多余代码没有在页面的80%上执行。

我应该将所有内容都保留在1个文件中

我应该取出jquery库并仅在当前页面上加载相关的JS吗?

评论

如果有700kb的JS代码,您应该重新拆分它,只包含真正需要的脚本。另外,使用jQuery(“……写得更少,做更多……”)似乎有点过大,因为它具有如此庞大的JS文件。如此大量的JS,您到底在干什么?

@feeela看看jquery-ui,jquery.datatables。那些单独在一起就是400kb。我也使用了其他插件,例如jquery.validate,jquery.uniform-这些东西加起来了。 xD

在这种情况下(如下所述),您确实应该拆分脚本并仅加载所需的内容...

#1 楼

您可以使用requirejs动态加载仅在该页面上所需的库。然后,您只需要在所有页面上加载requirejs(大约14k),就可以节省385kb。

集成也非常容易:只需将“ require”包含的代码“包装”起来:

require(["jquery", "jquery.alpha", "jquery.beta"], function($) {
    //the jquery.alpha.js and jquery.beta.js plugins have been loaded.
    $(function() {
        $('body').alpha().beta();
    });
})


评论


我真的很喜欢那个网站设计。我从未听说过requirejs。您如何通过http请求对此进行评分?这不是在页面上放置了更多的http请求吗? (还不错吗?)对不起我的愚蠢问题。

–凯尔
2012年6月27日8:34



少请求当然更好,但是节省> 35万也不错。是的,如果您在该页面上包含另一个库,则您的站点将再次发出请求。如果它是一个站点上的数据表,而另一个站点上是jqplot,那很好。我同意,在50%的页面上再加载五个库会使优势消失。但是对于您而言,我认为这是一个很好的解决方案(假设其余的js保留一个压缩文件)。

–迈克尔
2012年6月27日8:45

谢谢迈克尔。该解决方案非常出色。在我将所有内容拆分成一页之前,这……这比我的想法要好。谢谢你的建议。既然您熟悉requirejs,您认为requirejs就足够了吗?我在某些网站上看到他们使用google加载其jquery和其他库google.load('...')。

–凯尔
2012年6月27日上午8:50

我强烈建议从Google(或其他提供它的网站)加载通用库。这有2个优点:a)lib文件在不同站点之间缓存。用户以前曾经访问过一个网站,也可能使用从Google加载的jquery。然后从缓存而不是从服务器再次加载该文件! b)即使必须加载它,从Google CDN加载它比从您自己的Web服务器加载它要快得多。

–迈克尔
2012年6月27日上午10:16

#2 楼

如果您的框架/ CMS /具有适当的功能,则可以按照@Michael的建议有条件地包含脚本,但无需附加库。

以数据表为例,例如WordPress可以通过以下方式处理这种情况:

// For reference; this isn't functional code.
if (is_page('whatever')) {
    <script src="/path/to/datatables.js"><script>
    <script>
        [Your datatables setup here]
    </script>
}


RequireJS没什么错;您只需要评估它所增加的附加级别的复杂性(首先要学习使用它)是否可以抵消更易于使用的工具对您的影响。如果您只有上述两种情况,这可能是一个更好的选择。如果您还有很多事情要做,那么RequireJS可能是整体上更好的方法。

评论


我有一个自定义网站,该网站由我从themeforest购买的html模板制成。唯一的问题是,该家伙花了大约6个JS文件,周围杂乱无章。所以我将它们放在一个文件中,其中包括几个库jqplot,datatables,jquery-ui。这些全部加起来大约为550-600kb。 100kb是我使用这些库的JS。我觉得我应该解决这个问题,而不是在每个页面上加载太多无关的JS库。谢谢您的建议! =)

–凯尔
2012年6月27日9:20



#3 楼

700kb的JavaScript是一个性能问题,因为必须在页面加载后对其进行解析。因此,您应该注意,只有那些需要的脚本才被加载。在内部处理导航而无需离开单个页面的情况下,一个完整的JavaScript在完整的AJAX网站(例如GMail)上可能是可以的。但是,即使是完整的AJAX站点也会进行动态JS加载,以防止在启动时加载不必要的JS(内存和速度问题)。

您已经说过,您想减少http流量。您应该使用HTTP缓存。问题是,如果将过期时间设置得太高,则在缓存过期之前,对JS的更改可能是不可见的。

有一个技巧,但是,您没有引用myscript.js但是myscript.js?version={myversion}。应用程序更新后,您更改{myversion}并强制JavaScript重新加载。

评论


是的,有了这种大小的JS,再加上它实际上是相当普遍的库,使用CDN将是一个很大的好处。

–扎夫-本·杜吉德
2012年6月28日19:36



#4 楼

约700kb的JavaScript是一个性能问题,如果进行压缩,则在优化代码时我们必须遵循以下规则:


缩小Java脚本-只需进行压缩和解压缩,这并没有减少代码,首先使用良好的Minify JS工具并缩小代码。您只有12个文件,每个文件在进行俱乐部合并以达到最佳性能之前将分别缩小。
使用异步javascript加载,因为使用异步加载会导致非常快的加载时间和页面呈现速度。对用户的影响非常大,因为良好的异步加载不会阻止呈现过程,并且感觉页面加载时间会大大减少。图片和其他显示的项目会在没有加载javascript的情况下定期显示。
使用GOOGLE cdn进行JQUERY;我认为您正在使用JQUERY并从自己的网站加载它,这也是一个不利之处,请使用GOOGLE CDN(免费)加载JQUERY。由于几乎每个第3个网站都在使用它,因此缓存中的客户端计算机上已经可以使用它。
自定义长过期标头:了解网站的加载方式以及加载时间问题,那么您必须提供HTTP JS的长过期文件,这样就不能每次都下载文件,这将减少第二次请求。根据我的研究,与第一次页面访问相比,第二页面上的加载时间有更多退出。
使用页面速度进行检查:有时其他资源也会影响页面的加载速度,请进行交叉检查并尝试优化其他资源也。由于在每个资源上都花了很多时间,因此给我们的JS加载增加了时间。