持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天,点击查看活动详情
前言
css预处理器和后处理器属于前端工程化的重要部分,预处理器:将其他语法的样式文件编译为浏览器认识的css文件,后处理器:对css文件进行压缩,处理浏览器兼容性等等;主要有sass-loader/less-loader、postcss-loader、css-loader、style-loader
loader的顺序是从右到左依次处理我们的样式文件,最先处理的当然是我们的预处理器:saas-loader、less-loader
saas-loader/less-loader
- 将saas、less语法编译为css语法
- 处理@import,其实我们的@import经过loader处理之后,会将import进来的代码拷贝进来
a.scss
b.scss@import "b.scss" html{ overflow:hidden; }
编译后a.scss:body{ height:100%; }
body{ height:100%; } html{ overflow:hidden; }
重点来了:saas的@import和css的@import有什么不同呢?saas的@import是在编译过程处理,而css的@import则需要在渲染时发出多个http请求
postcss-loader
postcss是万能的,既能做预处理器也能做后处理器
postcss丰富的功能是由它的插件系统所提供的,例如移动端经常需要转换为rem单位,所以可以使用px2rem的postcss插件来进行编译时转换
postcss能做什么?以下引自postcss官网:
解决全局css问题
postcss-modules
和react-css-modules
可以自动以组件为单位隔绝 CSS 选择器。提前使用先进的 CSS 特性
autoprefixer/postcss-preset-env
更佳的 CSS 可读性
precss
囊括了许多插件来支持类似 Sass 的特性,比如 CSS 变量,套嵌,mixins 等。postcss-utilities
囊括了最常用的简写方式和书写帮助。图片和字体
postcss-assets
可以插入图片尺寸和内联文件。postcss-sprites
能生成雪碧图。postcss-inline-svg
允许你内联 SVG 并定制它的样式。postcss-write-svg
允许你在 CSS 里写简单的 SVG。提示器(Linters)
doiuse
提示 CSS 的浏览器支持性,使用的数据来自于 Can I Use。
功能这么强大,那么postcss是如何工作的?
与babel、eslint类似,它也是用ast来进行转换的:
- 首先拿到原始字符串,对字符串进行语法、词法分析(tokenizer)
2. 通过解析器(Parser),将分析后的结果转化为ast抽象语法树
3. 分析ast,替换关键位置的字符
4. ast转化为结果字符串,输出
其中具体的逻辑可以查看post-css源码进行学习
css-loader
-
css模块化
{ loader: "css-loader", options: { modules: true, importLoaders: 1, }, }
开启css module之后设置全局样式必须使用特殊语法:global()
-
组合样式
:local(.c1){ color:red; } :local(.c2){ composes:c1; background:blue; } // 编译后复用c1类名 exports.locals = { c1: "_23_aKvs-b8bW2Vg3fwHozO", c2: "_13LGdX8RMStbBE9w-t0gZ1 _23_aKvs-b8bW2Vg3fwHozO", };
-
导入样式
:local(.buttonGroup) { composes: button from "library/button.css"; background: red; }
style-loader
css样式提取为style标签
与之相反的有一个插件“mini-css-exreact-plugin”,它是将样式提取成一个文件
这两者有什么区别呢?
style标签是作为html一部分直接与dom同步解析的,而css文件则需要下载之后再进行解析,增加了首屏数据的加载时间,如果为了极致的性能优化,尽量将一部分样式用style-loader注入,然后其他的一部分使用css文件的形式,不要全部都用一个css文件,那样的话文件体积会非常大
loader的顺序
文章的标题顺序就是loader的执行顺序,配置如下["style-loader","css-loader","postcss-loader","sass-loader"]
总结
阅读完文本后相信读者已经对css预处理器和后处理器了如指掌,并且还知道如何在webpack中进行配置;面试的时候应该能够对这部分内容从容应对。