0

我想知道使用 Ruby gem 将 JavaScript 库包含到 Rails 项目与自己包含 JavaScript 文件之间有什么区别。

我知道您可以使用 bundler 锁定 js 库的一个版本,或者使用一个命令通过 bundler 更新所有 js 库,而不是手动将 js 文件复制并粘贴到您的项目中。Rails::Engine 类增加了多少开销,这是从 Rails 应用程序中可用的 gem 获取资产文件的唯一方法吗?是否有任何其他显着差异表明哪种方式是包含这些库的“最佳”方式?

4

2 回答 2

0

对于只提供资产的 gem,这个Rails::Engine类是矫枉过正的(即使是无害的,因为它不会有很多运行代码)。有了 Railtie 就绰绰有余了。在任何情况下,差异都可以忽略不计。

使用外部 gem,您可以将资产保存在项目中。

例如,angular-rails gem 提供了一些离线代码来生成东西,它不会影响你的应用程序。

另一方面,您必须等待 gem 维护者在需要时使用新版本的库对其进行更新。

于 2012-10-09T15:32:54.970 回答
0

来自olaf_from_norweden在 reddit 上的精彩帖子以及答案:

让我们来看看 Twitter Bootstrap gem 的 Sass 端口实际上做了什么:

https://github.com/thomas-mcdonald/bootstrap-sass/blob/master/lib/bootstrap-sass.rb

在 Rails 初始化(启动服务器时)评估 bootstrap gem 时,它使用 require 根据环境加载自身的各个部分。

如果 Compass Sass 框架 gem 被加载,它会告诉 Compass 要使用的 Rails 资产文件夹路径。

如果您使用带有资产管道的 Rails 版本,它会加载一个空的 Rails::Engine。

引擎只是您可以安装到其他 Rails 应用程序上的 Rails 应用程序。当 Rails 在初始化期间遇到引擎时,它会查找引擎指定的路径以加载相关文件。

在这种情况下,gemspec 在初始化期间告诉 Rails 其包含的供应商目录中的 .scss/.png/.js 文件。

在开发模式下,Rails 将在每次请求时重新编译这些资产以及主应用程序中的其他资产。

In production, the bootstrap gem isn't even loaded because it goes in the :assets group of your Gemfile.

Hope that makes sense. Not the best or most salient explanation. And even if the gem was loaded in production, Rails doesn't go hunting for assets directories unless it's compiling assets. So it doesn't even matter.

于 2012-10-23T17:31:38.007 回答