postcss 是一个用 JavaScript 插件转换 CSS 的工具平台,本身不直接修改样式,而是提供解析和生成 CSS 的能力。autoprefixer 是基于 PostCSS 的插件,根据目标浏览器自动为 CSS 规则添加厂商前缀。cssnano 同样是 PostCSS 插件,专注于压缩和优化 CSS 以减小文件体积。purify-css 曾用于移除未使用的 CSS 代码,但该项目已正式弃用,不再推荐用于新项目。
在现代前端工程化流程中,CSS 的处理已远不止编写样式那么简单。postcss、autoprefixer、cssnano 和 purify-css 是构建高性能、兼容性强且体积精简的 CSS 资产的关键工具。它们各自解决不同层面的问题,且常被组合使用。本文将从实际工程角度剖析它们的核心职责、协作方式及选型考量。
postcss:CSS 的“编译器”骨架postcss 本身不直接修改 CSS,而是一个用 JavaScript 插件转换 CSS 的工具平台。它解析 CSS 成抽象语法树(AST),允许插件读取、修改或生成新规则,最后再序列化回 CSS 字符串。几乎所有现代 CSS 工具(包括下面三者)都基于 PostCSS 构建。
// postcss.config.js
module.exports = {
plugins: [
require('autoprefixer'),
require('cssnano')
]
};
autoprefixer:自动补全浏览器前缀autoprefixer 是一个 PostCSS 插件,根据 Can I Use 数据库和你指定的浏览器范围,自动为 CSS 规则添加 -webkit-、-moz- 等厂商前缀。开发者只需写标准 CSS,无需记忆哪些属性需要前缀。
// 输入 CSS
const input = 'body { display: flex; }';
// autoprefixer 处理后(假设目标包含旧版 Safari)
// body { display: -webkit-box; display: -ms-flexbox; display: flex; }
cssnano:极致压缩与优化cssnano 也是一个 PostCSS 插件,专注于减小 CSS 文件体积。它执行一系列优化,如删除注释、合并重复规则、缩短颜色值(#ff0000 → red)、压缩 calc 表达式等。
// 输入 CSS
div { color: #ff0000; margin: 10px 10px 10px 10px; /* comment */ }
// cssnano 压缩后
div{color:red;margin:10px}
purify-css:移除未使用的 CSS(⚠️ 已弃用)purify-css 曾用于分析 HTML/JS 文件,找出项目中实际使用的 CSS 选择器,并移除其余“死代码”。但该项目自 2018 年起已停止维护,官方 GitHub 仓库明确标记为 deprecated。不应在新项目中使用。推荐替代方案包括 purgecss 或 unocss 等更活跃的工具。
💡 注意:
purify-css不是 PostCSS 插件,需单独集成到构建流程中。
// purify-css(已弃用,仅作历史参考)
const purify = require('purify-css');
purify(['index.html'], ['styles.css'], {
output: 'purified.css'
});
在真实项目中,这些工具通常串联使用。例如,在 Webpack 中通过 postcss-loader 集成:
// webpack.config.js
module.exports = {
module: {
rules: [{
test: /\.css$/,
use: [
'style-loader',
'css-loader',
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: [
// 先加前缀
require('autoprefixer'),
// 再压缩
require('cssnano')({ preset: 'default' })
]
}
}
}
]
}]
}
};
此流程确保:
postcss:插件生态的中枢PostCSS 的强大在于其插件体系。除了 autoprefixer 和 cssnano,你还可以集成:
postcss-preset-env:使用未来的 CSS 语法(如嵌套、自定义媒体查询)postcss-modules:实现 CSS 模块化tailwindcss:原子化 CSS 框架// 使用未来 CSS 语法
plugins: [
require('postcss-preset-env')({ stage: 3 }),
require('autoprefixer')
]
autoprefixer:精准控制浏览器范围通过 browserslist 配置(通常在 package.json 或 .browserslistrc 中),可精确指定目标环境,避免不必要的前缀膨胀。
// package.json
"browserslist": ["> 1%", "last 2 versions"]
cssnano:按需启用优化项cssnano 提供多种预设(default, lite)和细粒度选项,可在压缩率与构建速度间权衡。
// 仅启用安全优化
require('cssnano')({
preset: ['default', { discardComments: { removeAll: true } }]
})
purify-css:为何被淘汰?purify-css 存在明显局限:
class={isActive ? 'active' : ''})相比之下,purgecss 通过自定义提取器(extractor)能更好识别动态类名,成为事实标准。
postcss + autoprefixercssnanopurify-css,改用 purgecss(可通过 PostCSS 插件 @fullhuman/postcss-purgecss 集成)// postcss.config.js with purgecss
plugins: [
require('@fullhuman/postcss-purgecss')({
content: ['./src/**/*.html', './src/**/*.js']
})
]
postcss + postcss-preset-env + autoprefixer| 工具 | 类型 | 核心功能 | 是否推荐新项目使用 |
|---|---|---|---|
postcss | 平台 | CSS 转换插件系统 | ✅ 必选 |
autoprefixer | PostCSS 插件 | 自动添加浏览器前缀 | ✅ 推荐 |
cssnano | PostCSS 插件 | CSS 压缩与优化 | ✅ 推荐(生产环境) |
purify-css | 独立工具 | 移除未使用 CSS | ❌ 已弃用,勿用 |
purgecss 并配置合适的提取器。这些工具共同构成了现代 CSS 工程化的基石。理解它们各自的边界和协作方式,能帮助你在保证兼容性的同时,交付体积更小、性能更优的样式资源。
当你需要灵活、可扩展的 CSS 处理能力时,postcss 是必选的基础平台。它本身不提供具体功能,但支持丰富的插件生态(如 autoprefixer、cssnano、Tailwind CSS 等),适合任何需要自定义 CSS 转换逻辑的项目,是现代前端工程化的标准组件。
不要在新项目中使用 purify-css,因为它已被官方标记为弃用且多年未维护。若需移除未使用的 CSS,请改用活跃维护的替代方案如 purgecss(可通过 PostCSS 插件集成)。继续使用 purify-css 可能导致动态类名误删、框架兼容性问题及安全漏洞。
当项目需要支持多种浏览器且希望自动处理 CSS 厂商前缀时,应选择 autoprefixer。它基于 Can I Use 数据库和 browserslist 配置,能精准添加必要前缀,避免手动维护的繁琐和错误。适合所有需要跨浏览器兼容性的现代 Web 项目。
在生产构建阶段需要极致压缩 CSS 体积时,应选用 cssnano。它能安全地删除注释、合并规则、缩短颜色值等,显著减小文件大小。注意应在开发环境禁用以保留可读性,且需通过 PostCSS 集成到构建流程中。
PostCSS is a tool for transforming styles with JS plugins. These plugins can lint your CSS, support variables and mixins, transpile future CSS syntax, inline images, and more.
PostCSS is used by industry leaders including Wikipedia, Twitter, Alibaba, and JetBrains. The Autoprefixer and Stylelint PostCSS plugins are some of the most popular CSS tools.
Built by
Evil Martians, go-to agency for developer tools.
Read full docs here.