SCSS和LESS相比有什么优势?Bootstrap 4也要改成SCSS默认的了

[图片] 我个人一直是倾向less。更像原生的CSS。@符号比$符号更加看起来更加亲切在CSS中。 一直没有分清楚两者区别,变量,嵌套,mixin和函…
关注者
512
被浏览
77,539

13 个回答

恰巧,前段时间我在中国css-conf. 做了一个关于预处理器的分享

CSS预处理器 - 郑海波

,有些想法还算清晰。



我算是补充下

@顾轶灵

的回答, 来解答下题主的问题。

我个人一直是倾向less。更像原生的CSS。@符号比$符号更加看起来更加亲切在CSS中。

词法角度讲, LESS的确是最接近CSS的,但是仅限于如此。 但是不幸的是它占用了 @at-rule 关键字作为了变量标识符,使得功能扩展性大大降低

比如SCSS等预处理器可以轻易引入 @extend 来实现继承功能(从语法上是符合规范的)

.foo{}
.foo-lg{@extend .foo}

但LESS就不得不在选择器上面开刀,引出了 :extend 这样的自定义伪类

nav ul {
  &:extend(.inline);
  background: blue;
}
.inline {
  color: red;
}

当然在表现上会有所区别,比如嵌套结构的继承,但是大体实现的相似的功能。 但是从语言角度角度讲,扩展@at-rule 比扩展选择器要更健康一些,也更符合 css原本的设计。再者, 假如你要引入其它功能呢?比如循环、条件。 大家可以脑补下LESS的递归解决方案. 灵活性不可同日而语, 而这个缺陷在LESS第一版出现时,就已经注定了,所以LESS作者肯定不是一个语言设计的大师


一直没有分清楚两者区别,变量,嵌套,mixin和函数两个都有的。为什么感觉原来越多的人倾向SCSS的呢?

答案就是语言能力,LESS的设计限制了它的语言扩展性。预处理器80%的功能都是类似的, 但是往往一些细微的区别就可能导致你选型的不同。


首先LESS是没有函数支持的, 函数支持并不是一个独立存在, 它需要有完整的内部数据类型定义,参数、条件或循环控制、返回值定义等等... LESS显然没有提供所有的这些。 正是因为如此,这也是预处理器语言能力的分水岭.

或许有些人说, 函数完全可以由js来实现,我可以操作AST来实现具体函数, 大家可以脑补下为什么现在React配合JSX会让我有舒爽的感觉,而React通过JS直接声明函数嵌套就乏味的很, 这就是DSL(领域专属语言)带来的魅力,它是一个更高级的抽像(比接口封装更高级), 它隐藏了内部细节,而只暴露了领域模型的“外衣”供你使用, 比如你可以直接使用 1+$width, 使用场景非常简单。 但是从语法分析和解析角度, 并不是所有人都可以轻易通过生成AST和操作AST来解决这个加法的简单问题的。

并且函数直接在预处理语言中定义还具有天然的跨(运行时宿主)语言特性.

bootstrap从2的默认less到,3的scss复制,到未来4的scss默认。应该有原因的吧?国内也是的。大漠老师啊

我记得bootstrap5 号称可能要使用postcss, 题主是否也要追呢? 一个良好的CSS组织架构配合LESS其实现在应付绝大部分的前端工程也绝对没有问题, 关键你是否真的了解自己的需求。