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

NodeSass被弃用,取而代之的是DartSass

时间:2023-03-21 12:24:12 科技观察

就在今天,Sass官方团队正式宣布将弃用Libsass,以及基于它的NodeSass和SassC,并推荐用户使用DartSass。首先我们看一下官博的一些回复(前半部分来自官博https://sass-lang.com/blog/libsass-is-deprecated),接下来我们对NodeSass做一个benchmark测试和飞镖萨斯。阅读本文后,以下问题将得到解答。那么为什么会发生这种变化呢?NodeSass之后会维护吗?DartSass能满足我们的需求吗?DartSass的性能如何?DartSass的优点和缺点。背景说明此更改是在Sass核心团队进行大量讨论之后得出的结论,他们得出的结论是,是时候正式宣布弃用LibSass和基于其构建的包(包括NodeSass)了。多年来,LibSass显然没有足够的工程带宽来跟上Sass语言的最新发展(例如,最新的语言功能是在2018年11月添加的)。尽管我们很希望看到这种改进,但即使LibSass的长期贡献者MichaelMifsud和MarcelGreter的出色工作也跟不上CSS和Sass语言发展的快速步伐。主要包括以下四点:新的Sass项目不再推荐使用LibSass,改用DartSass。建议所有现有的LibSass用户制定计划最终迁移到DartSass,并且所有Sass库制定计划最终放弃对LibSass的支持。不再计划向LibSass添加任何新功能,包括与新CSS功能的兼容性。LibSass和NodeSass将尽最大努力无限期维护,包括修复主要错误和安全问题以及与最新Node版本的兼容性。为什么弃用?多年来,Sass一直处于模棱两可的状态,LibSass在理论上是官方支持的实现,但实际上在功能方面是静态的。随着时间的推移,越来越明显的是,这种情况给Sass用户带来了真正的问题。例如,用户经常会疑惑为什么原生CSS的min()和max()不能正常工作,可能认为Sass整体有问题,但实际上是因为LibSass不支持这个特性。官方支持的LibSass不仅会给个人用户带来痛苦,由于LibSass不支持去年推出的Sass模块系统,主要相关的Sass库担心其下游用户不兼容而无法使用,明确表示所有Sass用户都应该放弃使用LibSass,我们希望为这些库的作者提供更现代的功能更实用。LibSass甚至抑制了Sass语言本身的发展。我们无法推进将/作为分隔符的提议,因为他们编写的任何代码都会在DartSass中产生弃用警告,或者不会在LibSass中编译。通过将LibSass标记为弃用,事情会变得更好,Sass将更好地支持最新版本的CSS。“弃用”是什么意思?我们选择使用“弃用”一词,因为它在编程社区中具有很大的分量,并强烈表明用户应该开始计划放弃LibSass。然而,这并不意味着该项目完全死亡。LibSass和NodeSass的首席维护者MichaelMifsud证实,他计划继续保持与过去几年相同的维护水平。这意味着虽然不会添加更多功能(因此LibSass将慢慢偏离与最新CSS和Sass语法的兼容性),但维护版本将继续无限期发布。便携性和性能怎么样?LibSass相对于DartSass有两个主要优势:可移植性:由于它是用C++编写的,所以很容易将LibSass嵌入到其他编程语言中,并提供原生感觉的API。性能:与直接用脚本语言编写代码相比,通过C++API调用LibSass非常快。特别是,这意味着LibSass在JavaScript中比DartSass编译为JS的库快得多(尽管它与DartSass的命令行可执行文件相当)。我们正在使用Sass嵌入式协议解决这两个问题,该协议将Sass编译器作为子进程运行,可以通过消息传递与任何宿主语言进行通信。嵌入式协议支持原生SassAPI的所有功能,包括定义自定义导入器和Sass函数的能力,同时还提供高性能CLI应用程序。DartSass已经实现了嵌入式协议的编译器端,并且正在积极开发JavaScript端。DartSassDartSass可以编译成纯JavaScript编写的sass包上传到npm。纯JS版本比独立的可执行文件慢,但很容易集成到现有的工作流程中,并允许您在JavaScript中定义自定义函数和导入器。通过npm安装时,DartSass旨在实现与NodeSass兼容的JavaScriptAPI库。完全兼容性仍在开发中,但DartSass目前支持render()和renderSync()函数。但是请注意,由于异步回调的开销,默认情况下renderSync()的速度是render()的两倍多。//使用示例varsass=require("sass");sass.render({file:scss_filename,},function(err,result){/*...*/});//ORvarresult=sass.renderSync({文件:scss_文件名,});Benchmark测试脚本库:https://github.com/hua1995116/sass-benchmark接下来我们分别测试NodeSass和DartSass的同步和异步性能。测试Sass文件:https://github.com/ElemeFE/element/blob/dev/packages/theme-chalk/src/date-picker/date-picker.scss测试机型:MacBookPro(Retina,15-inch,Mid2014)节点版本:v12.16.0基准库:benchmark速度测试说明:基准测试结果使用benchmark:sassasyncx14.01ops/sec±27.72%(55runssampled)sasssyncx28.83ops/sec±7.24%(63runssampled)node-sassasyncx47.50ops/sec±3.10%(58runssampled)Fastestisnode-sassasync描述:值越大,速度越快,性能越好。内存测试说明:三种方法各操作50次后的情况。结果:可以看出NodeSass的性能确实很不错,这也是官方所说的优势。DartSass同步方式的性能比异步方式略高2倍左右。总结总的来说,DartSass是面向未来的,支持各种新特性。DartSass的纯JS方式也可以让我们摆脱被NodeSass编译支配的恐惧,再也不用担心NodeSass安装不成功,而且DartSass也在积极处理它的性能问题。本文转载自微信公众号“秋风手记”,可通过以下二维码关注。转载本文请联系秋风笔记公众号。