【问题标题】:How does your rails app include javascript?您的 Rails 应用程序如何包含 javascript?
【发布时间】:2011-04-11 10:39:54
【问题描述】:
我很好奇你们的 Rails 应用程序是如何包含 javascript 的。例如:
- 您是否将所有 js 代码打包到一个文件中并为所有请求提供服务?
- 您是否根据控制器/动作有条件地加载某些 js?
- 您使用什么工具或技术,例如:asset_packager、yui 压缩器、sprockets、BigPipe 启发的实现?
一些背景知识:我在一个大型 Rails 应用程序上工作,该应用程序非常重 JS。目前,所有 js 都被缩小并从单个文件中提供。这使事情变得非常方便,因为所有框架和小部件都随处可用。我开始质疑这种方法,让所有用户为一些他们可能永远不会看到的 js 付出代价似乎有点疯狂。使用脚本包含乱扔代码似乎很糟糕而且很困难,因为大部分网站都通过 ajax 提供内容。
有人有什么建议可以分享吗?
非常感谢!
【问题讨论】:
标签:
javascript
jquery
ruby-on-rails
ajax
prototypejs
【解决方案1】:
有几个权衡需要考虑:
- 如果你有一个大的 JS 文件,那么应该为你的所有页面缓存它。但是如果只有少数页面使用 JS 那就不好了。
- 如果您的页面不共享 JS,那么您可能希望对每个页面的单独 JS 使用“按需”加载。但是您不希望加载太多,因为每个 JS 提取都有自己的开销。
备注
- 确保您的所有 JS 将永久缓存在您的客户端上。在文件名或 url 中使用版本号 (foo.js?123)
- 确保 JS 文件最小化。
- 确保网络服务器已开启 gzip 编码。
- 您可能希望为您的 JS 使用低成本的内容交付网络,例如 Amazon 的 Cloudfront 或其竞争对手之一。
回答您的具体问题
您是否将所有 js 代码打包到一个文件中并为所有请求提供服务?
所有请求都会获得一个包含库代码和大多数页面上使用的 JS 的大型 JS 文件。某些特定页面还会获得额外的 JS 文件。
你会根据控制器/动作有条件地加载某些 js 吗?
是的,对于几个非常重的 JS 页面,这些页面会获得一个额外的 JS 文件。所有页面都获取 reg JS 文件,并且所有页面都缓存/可用。
您使用什么工具或技术,例如:asset_packager、yui 压缩器、sprockets、受 BigPipe 启发的实现?
- YUI 压缩机
- S3 用于为我的 assets.foo.com 域提供服务
- rake 任务以合并/最小化多个 JS 源文件