【问题标题】:Rails 3 JavaScript resource pipeline managementRails 3 JavaScript 资源管道管理
【发布时间】:2012-10-09 14:59:27
【问题描述】:
我想知道使用 Ruby gem 将 JavaScript 库包含到 Rails 项目中与自己包含 JavaScript 文件之间有什么区别。
我知道您可以使用 bundler 锁定 js 库的一个版本,或者使用一个命令通过 bundler 更新所有 js 库,而不是手动将 js 文件复制并粘贴到您的项目中。 Rails::Engine 类增加了多少开销,这是从 Rails 应用程序中可用的 gem 获取资产文件的唯一方法吗?是否有任何其他显着差异表明哪种方式是包含这些库的“最佳”方式?
【问题讨论】:
标签:
javascript
ruby-on-rails
gem
asset-pipeline
rails-engines
【解决方案1】:
Rails::Engine 类对于只提供资产的 gem 来说太过分了(即使是无害的,因为它不会有很多运行代码)。有了 Railtie 就绰绰有余了。在任何情况下,差异都可以忽略不计。
使用外部 gem,您可以将资产保存在项目中。
例如,angular-rails gem 提供了一些离线代码来生成东西,它不会影响你的应用程序。
另一方面,您必须等待 gem 维护者在需要时使用新版本的库更新它。
【解决方案2】:
reddit 上来自 olaf_from_norweden 的 post 很棒,答案是:
让我们来看看 Twitter Bootstrap gem 的 Sass 端口是什么
实际上是:
https://github.com/thomas-mcdonald/bootstrap-sass/blob/master/lib/bootstrap-sass.rb
在 Rails 初始化时评估引导 gem 时(当您
启动服务器),它使用 require 加载自身的各个部分
视环境而定。
如果 Compass Sass 框架 gem 是
加载后,它会告诉 Compass 要使用的 Rails 资产文件夹路径。
如果您使用带有资产管道的 Rails 版本,它会加载一个
空 Rails::Engine。
引擎只是您可以挂载的 Rails 应用程序
到其他 Rails 应用程序上。当 Rails 在运行过程中遇到引擎时
初始化时,它会查找引擎指定的路径
加载相关文件。
在这种情况下,gemspec 在初始化期间告诉 Rails 其包含的供应商目录中的 .scss/.png/.js 文件。
在开发模式下,Rails 将重新编译这些资产
每个请求以及主应用程序中的其他资产。
在生产中,甚至没有加载引导 gem,因为它进入了
:assets 你的 Gemfile 组。
希望这是有道理的。不是最好的或
最突出的解释。即使宝石已加载
生产,Rails 不会去寻找资产目录,除非
它正在编译资产。所以也没关系。