PostCSS 本身不修复兼容性,真正起作用的是插件(如 autoprefixer、postcss-preset-env);若配置未生效、插件未正确加载或流程中断(如 cssnano 删除前缀),则 CSS 兼容性处理会失败。

PostCSS 本身不修复兼容性,它只是管道;真正干活的是插件,比如 autoprefixer、postcss-preset-env。没配对插件或流程断了,写再标准的 CSS 也没用。
PostCSS 根本没运行?先验证配置是否被读取
很多“前缀没加”问题,其实是 postcss.config.js 压根没被执行。Vite 5+ 默认启用 PostCSS,但如果你在 vite.config.js 里写了 css.postcss,反而会覆盖默认行为;Webpack 则完全依赖你手动配 postcss-loader,漏一个环节就失效。
- 在
postcss.config.js里临时加一行require('xxx-missing'),重启构建——不报错说明文件根本没加载 - Vite 要求配置文件必须在项目根目录,且不能是
.cjs或.mjs(除非显式指定) - Webpack 中,
postcss-loader必须放在css-loader之后,且css-loader的importLoaders≥ 1,否则@import的 CSS 不进 PostCSS 流程 - Vue CLI 项目中,只有
<style lang="postcss">才走 PostCSS;普通<style>块需确认 loader 链里真有postcss-loader
browserslist 配置错误,Autoprefixer 就等于瞎忙
autoprefixer 完全按 browserslist 输出前缀,不是靠经验猜。写 "last 2 versions" 可能拉进 Safari 12,但它对 gap 已原生支持,结果白加一堆无效前缀;写 "> 1%" 却可能带上 IE11,生成大量 -ms-,而你的项目根本不打算支持。
- 把
browserslist写在package.json里,避免多处维护;别用autoprefixer插件内的overrideBrowserslist参数 - 线上项目推荐显式声明,例如:
"iOS >= 13"、"Safari >= 14.1"、"Chrome >= 90" - 运行
npx browserslist看实际匹配哪些浏览器;再跑npx autoprefixer --info确认目标属性是否真会被处理 - Flex 布局要兼容 IE11,必须传选项:
require('autoprefixer')({ flexbox: 'no-2009' });Grid 前缀默认关闭,需手动开grid: true,但它只补-ms-grid-column这类旧语法,不转换现代写法
CSS 写法超出 Autoprefixer 能力范围
autoprefixer 只补前缀,不转译语法。它不会把 aspect-ratio: 1/1 加前缀(caniuse 显示无主流前缀需求),也不会把 place-items: center 拆成 align-items + justify-items;反过来,IE11 的 display: -ms-grid 和现代 grid 差异极大,加了前缀也不等于能用。
立即学习“前端免费学习笔记(深入)”;
- 写
gap: 1rem没前缀 → 正常,不是 bug,是 caniuse 数据决定的 - 想用
@nest嵌套语法?必须用postcss-nesting(v10+),不是postcss-nested;且&必须紧贴@nest后最左侧,不支持多层嵌套 - 8 位颜色值
#12345678、color-mix()这类特性,autoprefixer完全不管,得靠postcss-preset-env
构建后前缀消失?大概率是 cssnano 把它删了
开发环境正常、生产构建后前缀没了,八成是 cssnano 在压缩阶段启用了内置 autoprefixer,而且它用的是自己的 browserslist,和你的不一致,甚至直接把“冗余”前缀当垃圾清掉了。
- 检查
cssnano配置,禁用其内置 autoprefixer:{ preset: ['default', { autoprefixer: false }] } - 确保
postcss.config.js中autoprefixer插件排在cssnano之前(PostCSS 插件顺序影响执行时机) - 构建后清空缓存再试,尤其 Webpack 的
.cache目录或 Vite 的node_modules/.vite - Tailwind 用户注意:
tailwindcss/nesting是内置插件,但只在 v3.3+ 提供,且必须写在tailwindcss配置项之前
最常被忽略的一点:你看到的源码里写了 transform,不代表输出里一定有 -webkit-transform——得去构建产物里查最终生成的 CSS,而不是只信编辑器预览或 DevTools 里的源码映射。


















