PostCSS 作用

PostCSS 是什么以及它能做什么

问题

PostCSS 的作用是什么?它和 Sass/Less 有什么区别?

解答

PostCSS 是一个用 JavaScript 转换 CSS 的工具。它本身不做任何转换,而是通过插件系统来实现各种功能。

常见用途

1. 自动添加浏览器前缀(Autoprefixer)

/* 输入 */
.box {
  display: flex;
  user-select: none;
}

/* 输出 */
.box {
  display: -webkit-box;
  display: -ms-flexbox;
  display: flex;
  -webkit-user-select: none;
     -moz-user-select: none;
      -ms-user-select: none;
          user-select: none;
}

2. 使用未来 CSS 语法(postcss-preset-env)

/* 输入:使用 CSS 嵌套(原生语法) */
.card {
  background: #fff;
  
  & .title {
    font-size: 18px;
  }
  
  &:hover {
    box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
  }
}

/* 输出:兼容当前浏览器 */
.card {
  background: #fff;
}
.card .title {
  font-size: 18px;
}
.card:hover {
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}

3. CSS 压缩(cssnano)

/* 输入 */
.box {
  margin: 10px 20px 10px 20px;
  color: #ff0000;
  font-weight: normal;
}

/* 输出 */
.box{margin:10px 20px;color:red;font-weight:400}

配置示例

// postcss.config.js
module.exports = {
  plugins: [
    // 使用未来 CSS 特性
    require('postcss-preset-env')({
      stage: 2,
      features: {
        'nesting-rules': true
      }
    }),
    // 自动添加前缀
    require('autoprefixer'),
    // 生产环境压缩
    process.env.NODE_ENV === 'production' && require('cssnano')
  ].filter(Boolean)
}

与 Sass/Less 的区别

特性PostCSSSass/Less
本质插件平台预处理器
语法标准 CSS + 插件扩展自定义语法
功能按需选择插件内置固定功能
扩展性可编写 JS 插件有限

两者可以配合使用:Sass 编译后再用 PostCSS 处理。

// webpack 配置示例
module.exports = {
  module: {
    rules: [{
      test: /\.scss$/,
      use: [
        'style-loader',
        'css-loader',
        'postcss-loader',  // PostCSS 处理
        'sass-loader'      // 先用 Sass 编译
      ]
    }]
  }
}

关键点

  • PostCSS 是插件平台,本身不做转换,功能由插件提供
  • Autoprefixer 自动添加浏览器前缀,是最常用的插件
  • postcss-preset-env 让你使用未来的 CSS 语法
  • cssnano 用于生产环境的 CSS 压缩
  • 可以和 Sass/Less 配合使用,互不冲突