为什么Google PageSpeed Insights建议我压缩JavaScript和CSS(使用带有JS和CSS压缩的Rails 3.2),以及如何修复?

10

我知道我无法在KB上节省太多,但为了在Google PageSpeed Insights中获得更好的分数,进而可能获得更好的SEO排名,我该如何解决这个问题?

来自https://developers.google.com/speed/pagespeed/insights/?hl=en&url=www.tradebench.com

Minify JavaScript for the following resources to reduce their size by 2.8KiB (2% reduction). Minifying http://d2bfamm4k6zojq.cloudfront.net/…tion-ea806932c941fb875b7512a557ebead3.js could save 2.8KiB (2% reduction) after compression.

它告诉我CSS文件也是相同的。

这是我的production.rb文件:

config.assets.compress = true
config.assets.js_compressor  = Uglifier.new(:mangle => true)
config.assets.css_compressor = :yui

看了一下uglify的文档和选项,我没有找到如何配置它以获取最后2KB的方法。

有人知道如何压缩最后一点以删除PageSpeed提示吗?也许可以使用比Uglifier更好的压缩器?

谢谢:-)


1
不用担心。页面速度有误,试图消除该通知是毫无意义的。 - user229044
谢谢,虽然我猜Google可能将其作为SEO排名的一部分。你确定他们不这样做吗? - rassom
这是速度优化,而不是搜索引擎优化。我非常怀疑谷歌会因为你发送额外的2kb而给你处罚。 - MrYoshiji
1个回答

15

如果您检查您的被压缩的JS代码,您会发现代码虽然被压缩了,但是你包含的每个JS库在顶部都有其自己的版权和许可信息(这是正确的),就像下面这段代码片段:

/**
 * Copyright 2009 SomeThirdParty.
 * Here is the full license text and copyright
 */

如果您真的想要在Rails应用中实现完全最小化,并摆脱PageSpeed Insights的2%额外压缩通知,您可以通过以下设置实现:

config.assets.js_compressor = Uglifier.new(copyright: false)
或者
config.assets.js_compressor = Uglifier.new(output: { comments: :none })

注意1:以上两者都将删除你的application.js中的所有注释。

注意2:同时使用这两个设置,Uglifier会从你的压缩js中去除所有版权信息,因此你的应用程序可以实现谷歌PageSpeed所需的完全压缩,并且你获得+1分的分数。

然而,你不应该避免包含你正在使用的代码的版权信息。大多数许可证(MITBSDGPL等)要求在重新分发库时保留版权和许可信息。当你允许浏览器从你的服务器或CDN下载库的压缩副本时,这被视为你再次分发该库。 因此,你应该在你的应用程序中某个地方包括版权和许可信息

如何操作

你可以做的一件事是收集你在应用程序中使用的js库的所有版权信息,并将它们全部添加到一个licenses.txt文件中,放置在你的public文件夹下。你的public/licenses.txt应该像以下内容:

/**
 * Unobtrusive scripting adapter for jQuery
 * https://github.com/rails/jquery-ujs
 *
 * Requires jQuery 1.8.0 or later.
 *
 * Released under the MIT license
 *
*/
[...and the rest copyrights here one after the other]

然后通过使用链接标签在应用程序的HTML头部(layouts/application.html)指定该文件的位置:

<head>
  <!-- License information of used libraries -->
  <link rel="license" href="../licenses.txt">
</head>

rel=license表示:当前文档的主要内容受引用文档所描述的版权许可证保护。

最后,如果您想更加准确地处理这个问题,您应该在缩小后的application.js文件中只包含一条注释,以便让某人精确定位所有版权信息(以防万一..)。为此,请在您的application.js文件顶部添加以下注释:

/*!LC
 * Copyright and Licenses: http://www.example.com/licenses.txt
*/

因此,您的application.js可能如下所示:

/*!LC
 * Copyright and Licenses: http://www.example.com/licenses.txt
*/ 
//= require jquery
//= require jquery_ujs
//= [..rest of your requires]

注意: 我已在开头加上!LC以区分这个注释。您需要添加一个正则表达式(regexp)给代码压缩器以使其只允许在压缩后的js文件中包含这个注释。为此,请转到production.rb文件并添加以下内容:

config.assets.js_compressor = Uglifier.new(output: { comments: /^!LC/ })

Uglifier只允许在您的压缩JS文件顶部有一个!LC注释,这样您就不会因为只有一个注释而获得pagespeed insights上的警告。如果您按照所有这些做,您将完全符合pagespeed insights的要求,实现最佳交付的压缩.js,并将所有版权问题整理到一个地方以供任何法律问题。


3
哇!回答得非常好,而且非常详细。谢谢 :-) - rassom
非常有趣 - 很棒的答案。特别是Rails那一行。谢谢! - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接