持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第9天, 点击查看活动详情
css预处理器和后处理器属于前端工程化的重要部分,预处理器:将其他语法的样式文件编译为浏览器认识的css文件,后处理器:对css文件进行压缩,处理浏览器兼容性等等;主要有sass-loader/less-loader、postcss-loader、css-loader、style-loader
loader的顺序是从右到左依次处理我们的样式文件,最先处理的当然是我们的预处理器:saas-loader、less-loader
saas-loader/less-loader
@import "b.scss"
html{
overflow:hidden;
b.scss
body{
height:100%;
编译后a.scss:
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"]