3

试图了解有关 Rails 的一些事情:

过去,我在前端项目中成功地使用了rake-pipelinerake-pipeline-web-filters 。

最近,有了 Rails 后端,我的前端资产正在使用 Rails Asset 管道生成。我认为它们都是相似的,但我无法在我的脑海中对齐它如何映射到 Assetfile 在 rake 管道中做事的方式。

所以,问题:

  1. Rake Pipeline 是 Rails Asset 管道的替代品吗?如果是,为什么以及这两种解决方案的历史和优点/缺点是什么?如果不是,它们有什么关系?

  2. 使用 Rake 管道,您可以添加出色的rake-pipeline-web-filters来获得所有连接、缩小、预处理,如 scss、minispade 等。使用 Asset Pipeline,似乎很难配置。一个直接的限制是我所有的 JS 都会立即进行评估,并且我不支持资产管道中的 minispade。替代方案是minispade-rails gem。

一般来说,我试图了解如何在 Rails Asset 管道中使用 rake 管道 Assetfile 获得类似的构建过程。

有人可以澄清这两个构建过程以及如何普遍考虑它们吗?

4

1 回答 1

10

Rake Pipeline 是 Rails Asset 管道的替代品吗?如果是,为什么以及这两种解决方案的历史和优点/缺点是什么?如果不是,它们有什么关系?

rake-pipeline不是链轮的直接替代品。rake-pipeline无限灵活和强大。资产管道实际上只是一个带有串联的预处理器。它不会使诸如源映射和模块包装之类的事情变得容易。Sprockets 做“依赖管理”。我引用依赖管理是因为在 javascript 文件中编写一些东西=require是一种“管理依赖”的可怕方式。

Rake 管道定义了构建资产所需的步骤。这是管道。这是您可能会想到的构建过程:

  1. 将coffeescript编译成javascript
  2. 将所有 javascript 文件包装在 minispade 模块中
  3. 连接所有文件
  4. 缩小连接的文件。

您可以构建非常复杂的构建管道。请参阅 Iridium 的Assetfile,了解可能是世界上最复杂的 rake 管道示例。Rake-pipeline 不仅仅用于为 Web 应用程序构建资产。它可用于构建任何类型的代码库。Ember.js 使用它为 Ember.js 和 Ember-Data 构建发布文件。你可以用链轮来做到这一点,但这会浪费大量时间并且非常尴尬。

Sprockets 似乎针对开发进行了优化,其中 rake-pipeline 针对复杂的应用程序进行了优化。个别资产正在开发中。这使得开发速度更快,因为不必连接资产(仅在需要时进行预处理)。这对于 rake-pipeline 是不可能的。Rake-pipeline 只关心输入和输出。中间构建文件不可访问。

如果你愿意,你可以在 rails 内使用 rake-pipeline。rake-pipeline gem 捆绑了一个 rails 引擎来用它自己替换资产管道。如果你正在构建一个复杂的前端应用程序,我可能会推荐这个。如果您只想将 JS 文件包装在模块中,那么您可以查看资产管道的各种项目。

使用 Rake 管道,您可以添加出色的 rake-pipeline-web-filters 来获得所有连接、缩小、预处理,如 scss、minispade 等。使用 Asset Pipeline,似乎很难配置。一个直接的限制是我所有的 JS 都会立即进行评估,并且我不支持资产管道中的 minispade。替代方案是 minispade-rails gem。

见上一段。

一般来说,我试图了解如何在 Rails Asset 管道中使用 rake 管道 Assetfile 获得类似的构建过程。

这对于链轮是不可能的。Sprockets 功能实际上是 rake-pipeline 的一个子集。Rake 管道可以做 sprockets 可以做的所有事情,而且做得更好。缺点是它需要更多的配置。

我建议您查看我链接的资产文件。它可以让您了解您可以使用 rake-pipeline 做什么。这是我用 rake-pipeline 完成的一些事情。

  • 在我的最终构建中包含特定于环境的 JS/CCS(如生产、开发、测试)等
  • 允许其他代码使用钩子绑定到我的构建过程中
  • 为我的 Ember 应用程序创建初始化文件
  • 预编译车把模板
  • 去掉生产代码中不需要的断言。
  • 从我的输入生成 HTML5 缓存清单

您可以使用资产管道完成所有这些工作,但这不值得。

于 2013-06-04T08:30:40.670 回答