当前位置: 首页 > 科技观察

继往开来的Sass第三代编译器:RubySass、Node-Sass、Dart-Sass

时间:2023-03-20 01:45:36 科技观察

浏览器为了简化样式的描述,将css设计成DSL(DomainSpecificLanguage).CSS写起来容易,但有很多不方便的地方,比如不支持嵌套,代码冗余;不支持继承和混合,不易重用代码。为了将代码组织和动态计算的能力扩展到css,社区中出现了一些编译成css的预处理语言,如sass、less、stylus等。此外还有后处理器如postcss,从css到css的编译,在编译过程中进行各种解析和转换。less和stylus的编译器都是js写的,但是sass比较特殊,第三代的编译器都没有js写的。今天来说说sass的历史:sass的第3代编译器。rubysasssass最早由ruby于2006年开发,作为一种结合其web框架的模板引擎haml编写css的语言。因为比较好用,前端也用了。sass编译器是用ruby开发的,而ruby是解释型语言,所以前端开发者要编译sass需要在本地安装ruby。后来Node.js的出现推动了前端工程化的发展,即使用Node.js为前端编写编译、打包等工具链。但是Node.js只支持c++这种编译型语言的扩展包,无法使用rubysass,于是node-sass出现了。直到2019年3月,rubysass宣布不再维护,sass最早的编译器退出了历史舞台。在node-sass中,sass编译器是用c++实现的,叫做LibSass,它与node集成在一起,是node-sass的包。当然也可以和其他语言集成,比如go、java等。node-sass让我们可以在Node.js中通过api编译sass代码,顺应了前端工程化的趋势。而且node-sass是用C++写的,编译速度比rubysass快很多。但是由于node-sass是C++模块,安装时必须对应node版本,否则会编译报错,比较麻烦。在github上可以找到node和node-sass的版本对应关系:node-sass看起来不错,编译速度快,支持Node.js调用。虽然要注意和node版本的对应关系,但是问题不大。不过node-sass已经被标记为deprecated,这意味着它会慢慢退出历史舞台。为什么?主要是维修速度跟不上。就像TS是JS的超集一样,SASS是CSS的超集。Superset是指TSCompiler必须支持JS的各种新语法,SASS也必须支持CSS的各种新语法,然后在此基础上迭代自己添加的那些语法。SASS团队的两位主要维护者感觉自己跟不上支持CSS新特性的速度,于是社区出现了dart-sass,一个支持CSS新特性更好的sass编译器。随着时间的推移,新的CSS特性的支持差距越来越大。终于在2020年10月,node-sass宣布不再支持新特性,标记为废弃,推荐使用dart-sass。node-sass博客上有一段话表明了他们的沮丧:在与Sass核心团队多次讨论之后,我们得出的结论是,是时候正式宣布LibSass和构建在其上的包(包括NodeSass)有被释放。已弃用。多年来,很明显,LibSass背后根本没有足够的工程带宽来使其与Sass语言的最新发展保持同步(例如,2018年11月添加了最新的新语言功能)。尽管我们非常希望看到这种范式转变,但即使LibSass的长期贡献者MichaelMifsud和MarcelGreter的出色工作也跟不上CSS和Sass语言发展的快速步伐。这么说来,node-sass算是登上了历史的舞台,但它对前端工程的贡献是不可磨灭的。再来看看sass编译器的后继者:dart-sass。dart-sassdart-sass绝对是一个用dart编写的sass编译器。Dart是flutter的编程语言,可以编译成js,所以它提供的npm是js,不需要像node-sass那样绑定node版本。下载npm包后,可以看到一个sass.dart.js,是用dart编译的:因为dart-sass的npm包是用js编译的,所以速度会比node-sass慢,但主要是优点是它支持css的所有特性,而且因为是js包,所以安装非常方便。dart-sass代表着未来,也是官方推荐的sass编译器。三代sass编译器介绍完三代编译器,我们简单回顾一下:rubysass是最早的sass编译器,用ruby编写,所以不能被node调用,但是是先驱,其历史成就排名第一的。只需要安装ruby即可执行,比较麻烦。node-sass是顺应前端工程化趋势出现的node包。它是用c++实现的sass编译器LibSass的一个包。它更快,因为它是用C++编译的。提供Node.js的API,支持前端工程化趋势。历史成绩排名第二。只是匹配node-sass和node版本比较麻烦。dart-sass是一个用dart实现的sass编译器,提供的dart-sass包是js,由dart编译。优点是支持更全面的css新特性,与node版本没有绑定关系。rubysass和node-sass都是历史,dart-sass是sass编译器的未来。综上所述,css缺乏代码组织和动态计算能力,所以社区中出现了一些css预处理器:sass、less、stylus。less和stylus的编译器都是js写的。最特别的是sass。它的三代编译器分别是用ruby、c++、dart写的,没有一个是js。(这在工程领域也很特别,js编译器从js逐渐发展到rust、go等其他语言,而sass编译器从其他语言逐渐转回编译成js的语言)ruby??sass和node-sass已经过时了,但是它们对前端工程的贡献是不可磨灭的。dart-sass代表了sass编译器的未来。希望它能接过前人的接力棒,继往开来,做的更好吧。