学习 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 ,然后在浏览器开发者工具中观察:

开启后的效果

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

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

参考文献:
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PostCSS 插件有很多,以下是 PostCSS 官方网站上列出的所有插件及其作用: 1. PostCSS-import:使用 @import 导入外部 CSS 文件。 2. PostCSS-mixins:类似于 Sass 的 Mixin。 3. PostCSS-nested:允许使用嵌套规则。 4. PostCSS-simple-vars:使用自定义变量,类似于 Sass 的变量。 5. PostCSS-math:进行数学计算。 6. PostCSS-color-function:使用颜色函数。 7. PostCSS-calc:使用 calc 函数。 8. PostCSS-extend:使用类似于 Sass 的 @extend。 9. PostCSS-for:使用类似于 Sass 的 @for。 10. PostCSS-each:使用类似于 Sass 的 @each。 11. PostCSS-conditionals:使用类似于 Sass 的 @if 和 @else。 12. PostCSS-nth-child-fix:支持伪类选择器 :nth-child。 13. PostCSS-modules:将 CSS 类名转换成哈希值,避免类名冲突。 14. PostCSS-pxtorem:将像素值转换成 rem 值,使得页面更好地适配不同大小的设备。 15. PostCSS-zindex:自动计算 z-index 值。 16. PostCSS-font-magician:自动引入相应的字体文件。 17. PostCSS-will-change:为元素添加 will-change 属性。 18. PostCSS-apply:使用类似于 CSS 变量的 @apply。 19. PostCSS-csso:代码压缩优化。 20. PostCSS-discard-comments:去除注释。 21. PostCSS-discard-duplicates:去除重复的样式。 22. PostCSS-discard-empty:去除空的样式。 23. PostCSS-discard-overridden:去除被覆盖的样式。 24. PostCSS-merge-longhand:合并长手写属性。 25. PostCSS-merge-rules:合并相同的规则。 26. PostCSS-minify-font-values:压缩字体值。 27. PostCSS-minify-gradients:压缩渐变值。 28. PostCSS-minify-params:压缩参数值。 29. PostCSS-minify-selectors:压缩选择器。 30. PostCSS-normalize-charset:添加 @charset 规则。 31. PostCSS-normalize-display-values:标准化 display 属性值。 32. PostCSS-normalize-positions:标准化定位属性值。 33. PostCSS-normalize-repeat-style:标准化背景重复和背景平铺属性值。 34. PostCSS-normalize-string:标准化字符串。 35. PostCSS-normalize-timing-functions:标准化缓动函数。 36. PostCSS-normalize-unicode:标准化 Unicode 字符。 37. PostCSS-normalize-url:标准化 URL。 38. PostCSS-normalize-whitespace:标准化空白。 39. PostCSS-ordered-values:按字母顺序排列属性值。 40. PostCSS-reduce-idents:缩短标识符,如类名、id 等。 41. PostCSS-reduce-initial:缩短初始值。 42. PostCSS-reduce-transforms:合并 transform 属性。 43. PostCSS-unique-selectors:去除重复的选择器。 44. PostCSS-pseudo-class-any-link:添加 :any-link 伪类。 45. PostCSS-pseudo-class-first:添加 :first-match 和 :nth-match 伪类。 46. PostCSS-pseudo-class-focus-within:添加 :focus-within 伪类。 47. PostCSS-pseudo-class-last:添加 :last-match 伪类。 48. PostCSS-pseudo-class-matches:添加 :matches 伪类。 49. PostCSS-pseudo-class-not:添加 :not 伪类。 50. PostCSS-pseudo-class-placeholder:添加 ::placeholder 伪类。 51. PostCSS-pseudo-element-any-link:添加 ::any-link 伪元素。 52. PostCSS-pseudo-element-content-insert:添加 ::before 和 ::after 伪元素。 53. PostCSS-pseudo-element-custom-properties:添加 ::part 和 ::theme 伪元素。 54. PostCSS-pseudo-element-dir:添加 ::dir 伪元素。 55. PostCSS-pseudo-element-file-selector-button:添加 ::file-selector-button 伪元素。 56. PostCSS-pseudo-element-fullscreen:添加 ::fullscreen 伪元素。 57. PostCSS-pseudo-element-placeholder-shown:添加 ::placeholder-shown 伪元素。 58. PostCSS-pseudo-element-range-thumb:添加 ::range-thumb 伪元素。 59. PostCSS-pseudo-element-scrollbar:添加 ::scrollbar 伪元素。 60. PostCSS-pseudo-element-scrollbar-button:添加 ::scrollbar-button 伪元素。 61. PostCSS-pseudo-element-scrollbar-track:添加 ::scrollbar-track 伪元素。 62. PostCSS-pseudo-element-scrollbar-track-piece:添加 ::scrollbar-track-piece 伪元素。 63. PostCSS-pseudo-element-slotted:添加 ::slotted 伪元素。 当然,还有很多其他的 PostCSS 插件,可以根据自己的需要来选择和使用
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值