最有效的多页RequireJS和Almond设置



我在一个使用RequireJS的站点上有多个页面,并且大多数页面都具有独特的功能。它们都共享许多通用模块(jQuery、Backbone等);它们都有自己独特的模块。我想知道使用r.js优化此代码的最佳方法是什么。我看到RequireJS和Almond的文档和示例的不同部分提出了许多替代方案——所以我提出了以下我看到的可能性列表,我问哪一个是最推荐的(或者是否有另一种更好的方法):

  1. 为整个站点优化单个JS文件,使用Almond,它将加载一次,然后保持缓存。这种最简单的方法的缺点是,我将在每个页面上加载用户不需要的页面代码(即特定于其他页面的模块)。对于每个页面,加载的JS将比需要的大。
  2. 为每个页面优化一个单独的JS文件,其中将包括公共模块和特定于页面的模块。这样我就可以在每个页面的文件中包含Almond,并且在每个页面上只加载一个JS文件——这将比整个站点的单个JS文件要小得多。不过,我看到的缺点是,通用模块不会缓存在浏览器中,对吗?对于用户访问的每个页面,她都必须重新下载大量的jQuery、Backbone等(公共模块),因为这些库将构成每个独特的单页JS文件的大部分。(这似乎是RequireJS多页面示例的方法,除了该示例不使用Almond。)
  3. 为通用模块优化一个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,我可以肯定地告诉你为什么。

  1. 它利用了最多的缓存,所有常见的功能都是一次加载。在浏览多个页面时,获取最少的流量并生成最快的加载时间。多个页面的加载时间很重要,虽然与您正在加载的其他资源相比,您这边的流量可能并不重要,但客户端会真正欣赏更快的加载时间。

我已经列出了更好的选择。

您可以使用任何内容分发网络(CDN),如MaxCDN,以确保您的js文件得到服务给每个人。我也会建议你把你的js文件在你的html代码的页脚。

最新更新