Rails 关于 sprockets 中的 require 和 scss 中 @import 的一些疑问。

bydmm · 2014年04月21日 · 最后由 bluesky0318 回复于 2019年07月09日 · 5262 次阅读

在 rails 中用 sprockets 的 require 做 css 连接合并压缩是肯定没有问题了,但是解决不了共享 SCSS 中 mixin 的问题。 用 sprockets 的 require 的话,前端代码的结构就容易变的混乱,并且要用到共享的 mixin 的话,所有 scss 文件的前面都要@import "common/mixin"。

我听说 scss 的@import其实可以替代 sprockets 的 require,因为 scss 的@import可以把多个文件连接起来变成一个文件,就如同 require 一样。

但是我所知的 CSS 中的@import操作实际上是在客户端游览器要重新请求一次文件,和 require 的连接压缩完全不同。

我想知道 require 和 scss 的@import到底是一个什么情况。

大家是什么前端架构,是怎么组织以及怎么合并 CSS 代码的。

CSS 的 import 是 CSS 的 import,SCSS 的 import 是 SCSS 的 import。

#2 楼 @Rei 看来 SCSS 的@import显然可以实现 require 的功能,只是@import不能 require_directory 这么用。

This feature will never be part of Sass. One major reason is import order. In CSS, the files imported last can override the styles stated before. If you import a directory, how can you determine import order? There's no way that doesn't introduce some new level of complexity. By keeping a list of imports (as you did in your example), you're being explicit with import order. This is essential if you want to be able to confidently override styles that are defined in another file or write mixins in one file and use them in another.

#4 楼 @Rei http://stackoverflow.com/questions/4778627/is-it-possible-to-import-a-whole-directory-in-sass-using-import or https://github.com/haml/haml/issues/97 似乎 SCSS 官方不太喜欢这个功能。 因为官方认为一次引用一个目录会让用户无法控制引用的顺序。

require 和 @import 一起用.... 按模块划分的 css 用 require,比如

topic.scss
reply.scss

功能性的在 application.scss 用 @import 引入,比如

_reset.scss
_share.scss
_button.scss

因为相同层级的 css 与加载顺序有关,后面的会覆盖前面的,像 reset 这样的个人比较喜欢用 @import 手动加进去

原来@import引入文件有时件也有顺序上的要求

  • sprockets require 是拼接编译后的文件
  • sass @import 是拼接源文件之后再整体编译

按需使用吧

#3 楼 @bydmm sass 可以 require_directory,有个插件叫做 sass-glob?好像是这个名字,搜一下。

至于文件顺序问题,自己把握。

import scss 文件,测试了一下,有效果。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号