转载

我为什么不再用Compass写CSS(缺点分析)

Compass 是一个糟糕的项目。目前最大的Sass框架,它目前由Chris Eppstein自己维护,两个Sass核心设计者之一,目前它仍然十分流行。

注* SASS: Syntactically Awesome Style Sheets,CSS扩展语言可编程样式表); 相关文章 LESS vs SASS?选择哪种CSS样式编程语言? 

然而,大约一年前,我就完全抛弃Compass了。我将把从我们的项目中删掉。从我自己的网站中删掉。从我身边的项目中删掉。到底发生了什么?我是怎么从"Compass是最好的"转变到“我不需要它了”的呢?

起初我认为Compass是一个比Sass更好的东西,直到认识到它其实并没有带来多大实惠。至少是还不值得将其引入到项目中,特别是Ruby Sass本身已经很慢了...

这里我绝不是说Compass没用。我也不是劝你不要用。我只是想告诉你不使用Compass时另外一种做事方式。

我们先看看Compass有什么功能:

  • 浏览器前辍(-webkit, -moz等),基于CanIUse数据库 (v1.0.0+);
  • 数学计算函数助手,像cos, sin, pi等等;
  • 颜色助手 像 shade, tint等等;
  • 图片助手像 image-width 和 image-height;
  • 图像切片自动合并编绎 。 注* 小图合大图减小连接请求

还有很多其它的附件

Autoprefixer没什么改进

在Compass 1.0.0之前,浏览器前辍是在Compass里手动管理的。这意味着每产生或传递一个新的前缀,都要拉一次新的请求来删除混入的前缀。不是很理想......这就是为什么Chris在V1.0.0里使用了一种更聪明的方法,直接从 CanIUse 提取数据。

同时,非常受欢迎的 Autoprefixer 库也能做这样的事。在这一点上,无论是Compass 还是Autoprefixer都能100%使用最新的浏览器前辍,但还有一个重要的区别:在Compass中,你仍然必须在属性和值上加一些前辍,而Autoprefixer作为您部署过程的一部分,随后再处理样式表。

为了输出下面的CSS:

.unicorn {

-webkit-transform: translateX(42em);

-ms-transform: translateX(42em);

transform: translateX(42em);

}

使用Compass得这样写:

.unicorn {

@include transform(translateX(42em));

}

使用Autoprefixer插件:

.unicorn {

transform: translateX(42em);

}

后者不仅更简单更短,而且不再需要transform的前缀属性,这一切都很好。

你不会经常用到数学运算

我喜欢Sass为我们在样式表中提供的数学运算的能力。当我们使用CSS的预处理时,我们可以在CSS中混入变量,对于以数字为基础的CSS,但忽略数学的支持CSS来讲,这是一个巨大的进步。

最重要的是,Compass提供了一些先进的数学函数,如 cos, sin, tan, sqrt, pow, pi; 也许还有 acos, asin, atan, log 运算和 e 常量。 在某些情况下,我不得不承认,此功能可能是有用的。例如,在以前的文章中,我使用的 cos 和 sin 打造完美的混合阴影。 前阵子, 我记得需要开方 sqrt 来正确地对齐和旋转伪元素。因此,它们有应用情形。

然而,他们的应用场景是如此罕见,我不得不重新考虑Compass在项目中保留数学函数的充分理由,实现上这些函数都可以在但Sass被polyfilled实现。举例来说,这里是一个纯粹的Sass版的 pow 功能:

/// Power function

/// @param {Number} $x

/// @param {Number} $n

/// @return {Number}

/// @source  https://github.com/adambom/Sass-Math/blob/master/math.scss Sass-Math

@function pow($x, $n) {

$result: 1;

@if $n >= 0 {

@for $i from 1 through $n {

$result: $result * $x;

}

} @else {

@for $i from $n to 0 {

$result: $result / $x;

}

}

@return $result;

}

如果你赵的需要Sass中的高级数学函数,我建议你参考一下 Sassy-Math 。

您可以自己实现颜色函数

说实施,我对Compass 的 颜色函数 不是非常的熟悉,因为我从来没有使用过其中任何一个功能。不过Compass提供了如此多的内置函数来处理颜色,我从来没有感觉有多少的需要。

下面有个例子。在CSS中实现渐变。为了让使用 mix 稍微容易点,我写了两个很短的函数,他们在Compass中是被实现了的。

/// Slightly lighten a color

/// @access public

/// @param {Color} $color - color to tint

/// @param {Number} $percentage - percentage of `$color` in returned color

/// @return {Color}

@function tint($color, $percentage) {

@return mix($color, white, $percentage);

}

/// Slightly darken a color

/// @access public

/// @param {Color} $color - color to shade

/// @param {Number} $percentage - percentage of `$color` in returned color

/// @return {Color}

@function shade($color, $percentage) {

@return mix($color, black, $percentage);

}

无论如何,我不认为Compass有必要专门提供这些。

你可以不依赖图片工具

让我们来看一看有用的东西。Compass它是用Ruby编写的,提供的图片助手可以自动计算出类例image-width和image-height这样的属性。这是很实用的,特别当你需要替换图片时,你无需担心尺寸发生变化。

.logo {

$logo-path: '/assets/images/logo.png';

width: image-width($logo-path);

height: image-height($logo-path);

// ...

}

不幸的是,我们没有办法写polyfill兼容函数来自己实现。Sass无法访问文件系统,因此无法任何弄清楚的图像尺寸。

话虽这么说,我个人倾向于使用SVG并在项目中并尽量地少使用图片。由于SVG是可缩放的矢量图形,我不需要关心它的尺寸。我已经使用好长一段时间了。

SVG Sprite有一大波自动合并的工具

好了,现在我们谈论Sprite Build,它一直是Compass的主要亮点,从文件夹中将小图标自动合并,并创建CSS Sprites只需要一两分钟,也许更少。

@import "compass/utilities/sprites";
@import "my-icons/*.png";
@include all-my-icons-sprites;

在我们的样式表中自动创建CSS Sprite还有很多其他的选择。按照同样的思路,只用Compass的Sprite工具,我会觉得很奇怪,不管它有多好。没有必要将二者紧密联系在一起,即使它可能带来一些好处。

注* 参见 CSS Sprite小图片自动合并工具(NodeJS,Python,Java,Ruby) 

关于LibSass的一句话

Compass与 LibSass 是不兼容的。因为它仍然在很大程度上依赖于Ruby,你不大可在一个“LibSass环境”使用Compass。在当今世界,LibSass越来越被认同,我认为与语言无关是一个主要的目标。显然,Chris也认同这一点,它正在将它移植到LibSass中。

注* LibSass:让Sass扩展样式表语言脱离Ruby框架的依赖,而变成一个可以被方便引用的库。

最后的思考

远离Compass,你真正想要的东西应该是比较简单的。如果你真的需要Compass的小工具,你只需要加一些Sass的函数即可。然后,在项目中引用Autoprefixer甩掉所有的CSS样式前缀。最后,引入一个自定义的Sprite图片自动合并工具。 

其实,Compass并不是一个坏的工具。恰恰相反,Compass是一个了不起的框架!如果你对Compass非常满意,请继续坚持使用。

另外,如果你使用的不太多的话,那么你可以考虑摆脱它,像我一样。

原文地址:点此

正文到此结束
Loading...