学习 PostCSS 以及使用

学习 PostCSS 以及使用

《工欲善其事,必先利其器》

banner

一、初识 PostCSS

PostCSS 是一款 CSS 编译器;

PostCSS 是一个使用 JavaScript 工具和插件转换 CSS 代码的工具,它的主要功能其实是可以利用 JavaScript 去处理一些原生的 CSS 或者预处理器(Less、Sass)处理不了的工作。这种特性本质上,是基于 PostCSS 自身的编译能力和强大的插件系统支持的基础之上的。

例如,它能为某个 css 属性,根据项目内指定的浏览器种类和版本的 json 文件(或者 package.json 的属性),查询 caniuse 中,不同浏览器对该 CSS 属性的兼容情况,然后自动为这个属性补充不同的浏览器前缀。

再例如,px 是一个固定的长度单位,而设备视口的尺寸是各种各样的。如果我们想通过一套样式来适配各种设备的显示,就需要相对的单位,常用的是 remPostCSS 能依靠插件自动的,将项目内所有的 px 值,计算并改写为对应 rem 值。

除此之外还有很多很多功能,并且我们也能根据某些的特定需求,构建属于自己项目专属的功能插件。

过渡

PostCSS 利用自身的 parserCSS 代码解析为抽象语法树;

编译器?抽象语法树?这不就跟针对 js 的编译器 babel 一样吗?

的确如此。

PostCSS 利用自身的 parserCSS 代码解析为抽象语法树(AST),这里分为 parse、transform、generate 3个阶段。过程中,读取 postcss.config.js 配置文件的插件列表,利用插件改写 AST,最终输出改写后的 css 代码。

插件工作于 transform 阶段,基于 AST 做分析处理和转换。只不过,cssAST 比 JavaScript 的简单得多,没有分类成太多的规则。

ast and plugins
(图片取自掘金-神说要有光,侵删。)

而我们也可以通过 astexplorer.net ,能可视化的查看其匹配的规则:

可视化观察

二、预处理器与 PostCSS 之间的关系

从前文可知,PostCSS 输入与输出的产物都是 css 文件。因此,跟那些预处理器不同,它也被称为后处理器,因为其通常再 css 处理链条的最末端。

也就是说,预处理器和 PostCSS 其实是互不影响的,无论你是否选择使用 css 预处理器,PostCSS 总是最后工作。通过一张图即可完美诠释这个过程:

之间的关系
(图片取自掘金-魔术师卡颂,侵删。)

三、应用一个简单的 PostCSS 插件

  1. 下载工具、插件

这里我使用的包管理工具是 pnpm ,其他的下载

pnpm install postcss postcss-loader autoprefixer -D
  1. 配置插件

这里有几种配置方法,依次介绍一下:

注意,对于没有内置 postcss 的脚手架,在配置浏览器版本时,可以直接在脚手架的配置文件里面配置(例如 vue.config.js)。
而有内置 postcss 的脚手架,在配置浏览器版本时,则需要另外在 postcss.config.js 里面配置。

  • Vue-cli 创建的项目,于 vue.config.js 里面配置
// vue.config.js
module.exports = {
  css: {
	loaderOptions: {
	  postcss: {
		plugins: [
		  // ...其他插件
		  "autoprefixer": {
            // 配置使用 autoprefixer
            overrideBrowserslist: [
			  "Android 4.1",
         	  "iOS 7.1",
          	  "Chrome > 31",
          	  "ff > 31",
          	  "ie >= 8"
          	  "last 2 versions", // 所有主流浏览器最近2个版本
          	] 
          }
		]
	  }
	}
  }
}
  • Vite 创建的项目,是天然支持 postcss 的,使用之前只需要安装即可。因此需要在 postcss.config.js 里面配置插件,没有该文件的在项目根目录下自行创建:
// postcss.config.js
module.exports = {
  plugins: {
	// ...其他插件
    autoprefixer: {
      overrideBrowserslist: [
        "Android 4.1",
        "iOS 7.1",
        "Chrome > 31",
        "ff > 31",
        "ie >= 8",
        'last 2 versions', // 所有主流浏览器最近2个版本
      ]
    }
  }
}
  • 手撸党选择 Webpack 创建项目的,于 webpack.config.js 里面配置 postcss,也是需要另外配置 postcss.config.js 文件:
// webpack.config.js
module.exports = {
  module: {
    rules: [
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader", "postcss-loader"]
      }
    ]
  }
}
// postcss.config.js
module.exports = {
  plugins: {
	// ...其他插件
    autoprefixer: {
      overrideBrowserslist: [
        "Android 4.1",
        "iOS 7.1",
        "Chrome > 31",
        "ff > 31",
        "ie >= 8",
        'last 2 versions', // 所有主流浏览器最近2个版本
      ]
    }
  }
}

注意:关于 overrideBrowsersList 属性,开发者可以选择与 postcss 集成到一起,也可以选择割裂开来。

如果选择割裂开来则有两种不同的配置方式,例如在根目录配置 .browserslistrc 文件;或者在 package.jsonbrowserslist 选项中配置。两者作用相同,同时引用则会引发冲突导致报错,此时二选一即可。

  1. 查看效果

选择一个 CSS3 的属性,先不要开启观察效果:

transiform: translateX(100px);

效果如下:

未开启的效果

再开启 postcss ,然后在浏览器开发者工具中观察:

开启后的效果

是不是很神奇?好了,今天这篇文章就到此为止辣~

感谢你的阅读,希望你的未来一片光明!

参考文献:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值