让你的 webpack sass 和 css 处理性能 10 倍提升

智极领航
• 阅读 4117

是的, 你没有听错, 今天介绍的两款 loader 能让你的 webpack 在处理 sass 和 css 时性能提升 10 倍以上, 他们分别是:

看名字就知道, 它们相比官方版本的 loader 要更快, 那到底有多快? 下面给个性能对比.

性能对比

fast-sass-loader vs sass-loader

280+ 以上的 sass 文件测试结果如下:

  • sass-loader: 8517.218ms (7.15MB)
  • fast-sass-loader: 1912.218ms (649KB)

可以看到 fast-sass-loader 的性能远高于 sass-loader, 并且由于去重功能, 其打包的体积更小:

让你的 webpack sass 和 css 处理性能 10 倍提升

链接: https://github.com/yibn2008/fast-sass-loader#performance

fast-css-loader vs css-loader

24000+ 行数的 css 文件测试结果如下:

  • css-loader: 1644 ms (608KB)
  • fast-css-loader: 116 ms (608KB)

可以看到, 加载性能已经超过了 10 倍, 达到 14 倍左右了:

让你的 webpack sass 和 css 处理性能 10 倍提升

链接: https://github.com/yibn2008/fast-css-loader#vs-css-loader

使用方法

使用方法和原版是相似的:

module.exports = {
    module: {
        rules: [
            {
                test: /\.css$/,
                use: [
                    'style-loader',
                    'fast-css-loader' // 替换你原先的 css-loader
                ]
            },
            {
                test: /\.(sass|scss)$/,
                use: [
                    'style-loader',
                    'fast-css-loader', // 替换你原先的 css-loader
                    'fast-sass-loader' // 替换你原先的 sass-loader
                ]
            }
        ]
    }
}

背后的原理

看到这里, 你大概会问为啥这两个 loader 要比官方快? 其实得问官方版本的 loader 慢在哪里.

fast-sass-loader

对于 sass-loader 而言, 最大的问题是没有去重, 导致 sass 文件重复编译, 因此 fast-sass-loader 最核心的地方在于针对 sass 文件去重.

此外, fast-sass-loader 解决了 sass 文件中 url 解析的问题. 原版 sass-loader 无法很好的处理 url(...)相对路径的问题 (编译前和编译后, 相对路径是会变的), 需要使用 url-resolve-loader, 但这个 loader 与 sourceMap 结合时又有许多 bug, 这在方面 fast-sass-loader 要做的更好.

当然, fast-sass-loader 确实是舍弃了一些特性以实现性能的提升:

  1. 不支持 sourceMap (个人认为 sass 的 sourceMap 可有可无)
  2. 不支持 importer 选项
  3. 不支持 某些写法

fast-css-loader

css-loader 中最影响性能的部分是 postcss 解析 css 的过程, 当 css 文件非常大时, 这一过程会特别慢, 而 fast-css-loader 则采用了正则和一些小技巧来实现 css 的解析, 在达到相同效果的前提下性能得到大幅提升.

由于未使用 postcss, 因此 fast-css-loader 也舍弃一些特性:

  1. 不支持 sourceMap (个人认为 css 的 sourceMap 可有可无)
  2. 不支持 css module
  3. 不支持在 js 中导出 css 模块

背后的故事

写这两个 loader 的动机是我们的项目中有非常大规模的 sass 和 css, 原先的 sass-loader 和 css-loader 难以满足我们对性能的要求. 其中 fast-sass-loader 已在很多内部项目中广泛使用, 效果良好; 而 fast-css-loader 则是新鲜出炉的.

欢迎大家在自己的项目中试用 fast-sass-loaderfast-css-loader, 如果觉得不错就加个 star 吧, 哈哈.

如果使用遇到问题, 请提 ISSUE 或直接 PR ~

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Alex799 Alex799
4年前
Vue进阶(幺柒柒):Vue应用Sass、Scss、Less和Stylus
Vue项目中使用预处理器,可以有效减少css代码量,推荐使用Sass、Scss、Less预处理器。可以在创建项目的时候选择预处理器(Sass/Less/Stylus)。如果当时没有选择,内置的webpack仍然会被预配置为可以完成所有的处理,也可以手动安装相应的webpackloader:Sassnpm
Wesley13 Wesley13
4年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Stella981 Stella981
4年前
Sass预编译
sass基于Ruby       ruby的模块管理器叫gem 正规的安装方式是geminstallsass        调用命令  sass  sass文件  css文件webpack编译sass    需要的模块styleloader cssloader sas
Stella981 Stella981
4年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Stella981 Stella981
4年前
Sass
嵌套规则(NestedRules)Sass允许将一套CSS样式嵌套进另一套样式中,内层的样式将它外层的选择器作为父选择器mainp{color:00ff00;width:97%;.redbox{
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这