我在一个使用RequireJS的站点上有多个页面,并且大多数页面都具有独特的功能。它们都共享许多通用模块(jQuery、Backbone等);它们都有自己独特的模块。我想知道使用r.js优化此代码的最佳方法是什么。我看到RequireJS和Almond的文档和示例的不同部分提出了许多替代方案——所以我提出了以下我看到的可能性列表,我问哪一个是最推荐的(或者是否有另一种更好的方法):
- 为整个站点优化单个JS文件,使用Almond,它将加载一次,然后保持缓存。这种最简单的方法的缺点是,我将在每个页面上加载用户不需要的页面代码(即特定于其他页面的模块)。对于每个页面,加载的JS将比需要的大。
- 为每个页面优化一个单独的JS文件,其中将包括公共模块和特定于页面的模块。这样我就可以在每个页面的文件中包含Almond,并且在每个页面上只加载一个JS文件——这将比整个站点的单个JS文件要小得多。不过,我看到的缺点是,通用模块不会缓存在浏览器中,对吗?对于用户访问的每个页面,她都必须重新下载大量的jQuery、Backbone等(公共模块),因为这些库将构成每个独特的单页JS文件的大部分。(这似乎是RequireJS多页面示例的方法,除了该示例不使用Almond。)
-
为通用模块优化一个JS文件,然后为每个特定页面优化另一个JS文件。这样,用户就可以缓存公共模块的文件,并且在页面之间浏览时,只需要加载一个小的特定于页面的JS文件。在这个选项中,我看到了两种方法来完成它,包括RequireJS功能:a.在所有页面的公共模块之前加载文件require.js,使用
data-main
语法或正常的<script>
标签——根本不使用Almond。这意味着每个页面将有三个JS文件:require.js、公共模块和特定于页面的模块。b.似乎这个要点是建议将Almond插入每个优化文件----的方法,这样我就不必加载require.js,而是将Almond包含在我的通用模块和我的页面特定模块中。对吗?这是否比预先加载require.js更有效?
感谢您提供的关于最佳执行方法的任何建议
我想你已经很清楚地回答了你自己的问题。
对于生产,我们和我合作过的大多数公司一样,都是这样做的选项3。
下面是解决方案3的优点,以及为什么我认为你应该使用它:- 它利用了的大部分缓存,所有的常用功能加载一次。在浏览多个页面时,获取最少的流量并生成最快的加载时间。多个页面的加载时间很重要,虽然与您正在加载的其他资源相比,您这边的流量可能并不重要,但客户端会真正欣赏更快的加载时间。
- 这是最符合逻辑的,因为通常网站上的大多数文件共享共同的功能。
解决方案2有一个有趣的优势:
向每个页面发送最少的数据。如果你的很多访问者都是一次性的,比如在一个登陆页面——这是你最好的选择。在面向转换的场景中,加载时间的重要性不能被高估。
你的访客是回头客吗?一些研究表明,40%的访问者是带着空缓存来的。
其他注意事项:
如果您的大多数访问者访问单个页面-考虑选项2。对于一般用户访问多个页面的站点,选项3是很好的选择,但是如果用户访问单个页面并且他看到的都是这些页面,那么这就是最好的选择。
如果你有很多 JavaScript。考虑加载其中的一部分以给用户视觉指示,然后以异步延迟的方式加载其余部分(使用脚本标签注入,或者如果已经在使用require)。人们注意到UI"笨拙"的阈值通常在100毫秒左右。一个例子是GMail的"加载…"。
考虑到HTTP连接在HTTP/1.1默认情况下是Keep-Alive的,或者在HTTP/1.0中有一个额外的头,发送多个文件比5-10年前的问题要小。
确保你从你的服务器发送
Keep-Alive
头HTTP/1.0客户端。一些一般性建议和阅读材料:
- JavaScript的最小化是必须的,例如,r.js做得很好,你在使用它时的思考过程是正确的。r.js还结合了JavaScript,这是朝着正确方向迈出的一步。
- 正如我所建议的,延迟JavaScript也非常重要,并且可以大大提高加载时间。延迟执行将帮助你的加载时间看起来快,这非常重要,在某些情况下比实际加载快得多。
- 您可以从CDN加载的任何内容,例如您应该从CDN加载的外部资源。现在人们使用的一些库,比如jQuery,非常大(80kb),从缓存中获取它们真的会让你受益。在你的例子中,我将不加载骨干,下划线和jQuery从你的网站,相反,我将加载他们从CDN。
我创建了示例存储库来演示这三种优化。
它可以帮助我们更好地理解如何使用r.js
。
https://github.com/cloudchen/requirejs-bundle-examples
仅供参考,我更喜欢使用选项3,遵循https://github.com/requirejs/example-multipage-shim
中的示例我不确定这是否是最有效的。
然而,我发现它很方便,因为:
- 只需配置require即可。配置(在一个地方的各种库)
- 在r.js优化期间,然后决定哪些模块被归为公共
我更喜欢使用选项3,我可以肯定地告诉你为什么。
- 它利用了最多的缓存,所有常见的功能都是一次加载。在浏览多个页面时,获取最少的流量并生成最快的加载时间。多个页面的加载时间很重要,虽然与您正在加载的其他资源相比,您这边的流量可能并不重要,但客户端会真正欣赏更快的加载时间。
我已经列出了更好的选择。
您可以使用任何内容分发网络(CDN),如MaxCDN,以确保您的js文件得到服务给每个人。我也会建议你把你的js文件在你的html代码的页脚。