Rails - @ import和* = require之间的区别?

时间:2015-05-12 08:10:25

标签: css ruby-on-rails ruby twitter-bootstrap twitter-bootstrap-3

所以我有一个相对简单的Rails应用程序,我想通过Bootstrap为它添加一些材料设计样式。

我已将以下宝石添加到我的Gemfile中:

gem 'bootstrap-sass'
gem 'bootstrap-material-design'

现在他们都工作了,我的问题是为什么我似乎必须以不同的方式将它们添加到我的应用程序中。对于vanilla Boostrap,我只是将其导入特定视图(我认为这是正确的术语)scss文件就像正常一样。

@import "bootstrap-sprockets";
@import "bootstrap";

但是对于Material Design gem,我必须“要求”它到根application.css文件而不是

 *= require bootstrap-material-design

为什么差异,以及需要语法实际上做什么?

3 个答案:

答案 0 :(得分:9)

我想你明白了CSS / SASS @import option的目的。 requiresprockets directive。 Sprockets在编译会话期间处理指令 - 简单连接所需文件。唯一的区别是它们如何处理(共享)上下文。 简而言之 - 始终使用@import安全

请在此处查看详细说明: https://github.com/rails/sass-rails#important-note

答案 1 :(得分:4)

每当我更改CSS时,我遇到了非常慢的重新编译问题。根据{{​​3}},Sprockets require和Sass @import之间的差异非常重要,至少在性能方面如此:

  

资产管道对Sass @imports的处理方式不同于它对待Sprockets。在导入的情况下,每次保存都将通过并每次编译所有导入,无论您保存哪个部分。在样式表中处理Sprockets的方式是,只有您保存的部分将重新编译,然后在刷新时本地注入页面。链接是将多个部分加载到单个文件中进行生产的默认方式。

通过将require用于我的第三方供应商依赖项,CSS重新编译现在需要1.5秒而不是25秒。

答案 2 :(得分:-4)

  

include和require方法做的事情非常不同。

     

require方法执行大多数其他编程中包含的操作   语言:运行另一个文件。它还跟踪您所需要的内容   过去并不会要求同一个文件两次。运行另一个文件   如果没有这个附加功能,您可以使用加载方法。

     

include方法从另一个模块获取所有方法   将它们包含在当前模块中。这是语言层面的事情   而不是像require那样的文件级事物。包含方法   是与其他模块“扩展”类的主要方法(通常是   被称为混合)。例如,如果您的类定义了该方法   “each”,你可以包含mixin模块Enumerable,它可以充当   一个集合。这可能会令人困惑,因为非常使用包含动词   与其他语言不同。

因此,如果您只是想使用模块,而不是扩展它或进行混合,那么您将需要使用require

奇怪的是,Ruby的require类似于C的include,而Ruby的include几乎与C的include完全不同。

More info