前言
在前端开发领域,经常会听到一些预处理器 (Pre-processor),比如 Sass、Less、Stylus,这些工具是什么?为什么会存在?本文将探讨以下几个重点(附带示例):
- 什么是 CSS 处理器?
- 它们提供了什么好处?为什么需要它们?
- 有哪些可选的预处理器?
- 可能不应该使用预处理器的原因
什么是 CSS 处理器?
在今天,编写面向未来的 CSS
「CSS 处理器」的存在,主要是为了弥补 CSS 开发中功能不够完善的问题。早期开发中,缺乏复杂的逻辑和功能来编写可复用且易于管理的代码,这使开发者面临了 难管理、难扩展 的困境,尤其是在大型项目中,问题变得更加严重。于是,CSS 处理器应运而生,用于解决这些问题。
通过预处理器扩展 CSS 的功能和语法,可以实现更复杂的逻辑和更简洁的代码,例如 Variables、Functions、Mixins、Code Nesting 等,从而践行 DRY 原则。
或者通过后处理器对现有的 CSS 进行处理,如压缩、优化、修改现有的 CSS,例如 Import、Minification、Autoprefixer、CSS Nano 等。
使用预处理器的理由
让编写 CSS 充满可能性!
- 写嵌套 CSS 时无需重复命名(Nesting)
- 无需将所有代码都挤在一个文件中(Modules/Mixins)
- 可以使用变量和运算符(Variables/Operators)
- 避免重复编写相同的代码(Extend/Inheritance)
总的来说,预处理器帮助我们更高效地编写 CSS。我们可以把预处理器语言(可以想象成包含语法糖的 CSS)编译成普通 CSS 使用。
当然,浏览器仍然只识别 CSS,并不了解任何预处理器语言。因此,在使用时需要将预处理器的语法“预”处理为 CSS。尽管各种预处理器有自己定义的逻辑和语法,最终都会被转译为 CSS。
如何使用预处理器?
预处理器可以通过包管理器安装到项目中,或者使用现有软件如 Prepros 都能实现相同的目的。不过,对于初学者来说,推荐在 CodePen 中设置使用 CSS 预处理器 来练习(免费注册即可)。
Sass — Syntactically Awesome Style Sheets 广受欢迎的预处理器
Sass 是目前最受欢迎的预处理器(State of CSS 2021),也是最早出现的预处理器之一。它拥有庞大的社区和丰富的学习资源,是一个成熟稳定、功能强大的预处理器。Sass 最初基于 Ruby 语言编写,现在官方推荐使用全新的 Dart Sass。
编写 Sass 时有两种语法 —— SASS 和 SCSS。其中,SCSS 更接近 CSS 的样式,使用大括号和分号来嵌套语句,与规范的 CSS 保持一致,也就意味着符合规范的 CSS 语法就是符合规范的 SCSS 语法。
我个人更喜欢简洁的 SASS。如果你特别厌烦在写 CSS 时输入大量的 {}
和 ;
,可以选择 SASS!除此之外,两者只是书写习惯不同,本质上没有区别。
如果还不清楚,可以在后续章节中通过 Sass 示例了解它所提供的解决方案。
LESS — Leaner Style Sheets
LESS 是一款撰写于 Javascript 的预处理器,无疑是 Sass 主要的竞争对手,提供了。不过自从 Bootstrap 于第四版更换它们的预处理器为 Sass 后就较少人使用了。
Stylus
Stylus 是一款撰写于 Node JS 的预处理器,更小众,使用的人比例更少,不过偶尔还是会出现因此在这里标注一下。
最后,为什么你可能不需要预处理器
解释完了预处理器的好处,也要了解什么场合,你不应该用它。
非原生
前端开发的世界一直在变换,一个专案新增多余的依赖 (Dependency) 并不是一件好事;而非原生的代码可能在某一天就被原生所取代了,代表可能未来某一天某些预处理器提供的功能被赶上,可能需要再重构一遍代码。
更高层级的抽象
预处理器施作 CSS 在一个更高的抽象级别,可能不了解的人需要花费成本来去维护你的代码,营造一个更复杂的开发环境,投入额外的时间成本学习。
专案没有很大
使用以上这些功能还需要安装配置与学习,不如直接开始写 CSS 就好。
结语
最终,要不要使用预处理器?要使用哪一款?关系到团队与个人的偏好或专案的规模来决定,精进 CSS,不管哪款预处理器都能样样通。
参考资料
- mdn CSS Preprocessor
- State of CSS
- CSS Preprocessors – Sass vs LESS vs Stylus (With Examples)
- CSS is dead, long live CSS
- What’s the difference between SCSS and Sass?
- Deconfusing Pre- and Post-processing