postcss本身不压缩css,报错多因插件未处理新语法即流入cssnano:如oklch()、@container等需在postcss-preset-env中显式启用对应features并设stage:3,且确保browserslist生效、插件顺序正确(preset-env必须在cssnano之前)。

PostCSS 本身不压缩 CSS,出错大概率是某个插件在转换时误删、误改或未识别新语法。 比如你写了 color: oklch(50% 0.2 240) 或 aspect-ratio: 16/9,但插件没配 stage 或没启用对应 feature,就会直接透传到压缩器(如 cssnano),而老版本 cssnano 会把它当非法 token 报错。
为什么 cssnano 报 Unexpected token 却找不到源头?
因为 PostCSS 插件链是“先转换、后压缩”。如果某个插件(比如 postcss-preset-env)没处理新语法,它就原样流到下个阶段;而 cssnano 默认只认 CSS 语法子集(如不支持 @container、inset-area),直接抛错。
- 常见报错位置:
Unexpected token "oklch"、Unexpected "@"、Unexpected "/" - 不是 cssnano 有 bug,而是它前面的插件没把新语法降级或移除
- 运行
npx postcss --verbose your.css可看每步输出,定位哪步之后出现异常 token
postcss-preset-env 的 stage 和 features 必须显式对齐
默认 stage: 2 会跳过 container-queries、cascade-layers、oklab 等 stage 3 特性,即使你写了也等于没写。
- 要支持
@container,必须加features: { 'container-queries': true },且stage: 3 -
aspect-ratio同样需'aspect-ratio': true,否则 autoprefixer 不管、preset-env 也不转 - 颜色函数如
oklch()要单独启用'color-function': true,不能只靠 stage - 配置里别混用
postcss-cssnext—— 它已废弃,和postcss-preset-env冲突,会导致 AST 解析错乱
检查 browserslist 是否真实生效
插件是否启用某项转换,最终取决于 browserslist 输出的浏览器范围。写错位置或格式,整个链就失效。
- 必须用
.browserslistrc文件(而非塞在package.json的browserslist字段),避免被 webpack / vite 的内部解析忽略 - 执行
npx browserslist,确认输出不含 IE11、UC Browser 等不支持新特性的旧环境;如果含,grid、subgrid就不会被降级,反而可能触发压缩器报错 - 若目标含 Safari 15.4 以下,
color-mix()就不能开,否则 preset-env 无法降级,cssnano 直接崩
真正容易被忽略的是:插件链顺序。比如 cssnano 放在 postcss-preset-env 前面,新语法根本没机会被处理——这种错不会报 warning,只会静默失败。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











