为什么PostCSS处理@custom-media时报Unknown word错误?
我在用PostCSS处理CSS时遇到问题,当写@custom-media和CSS变量时,编译总报Unknown word错误。已经装了postcss-preset-env和autoprefixer。
配置文件是这样写的:
module.exports = {
plugins: {
'postcss-preset-env': {},
autoprefixer: {}
}
};
尝试过把@custom-media改成@media就正常了,但项目需要动态媒体查询。查了文档说是需要特定插件,但按网上的教程配了还是不行。
首先,@custom-media是CSS的未来特性,postcss-preset-env需要明确告诉它要转换这个语法。你需要修改配置文件:
为什么这样配?因为postcss-preset-env默认只开启部分polyfill,为了减少打包体积。custom-media-queries属于Stage 2的提案,需要手动开启。
还有一个常见坑点是语法格式要正确。正确的@custom-media写法应该是:
需要注意几点:
1. 定义时要用--前缀,这是CSS自定义属性的规范
2. 使用时也要带--前缀
3. 记得用括号包裹条件表达式
如果还报错,检查下你的PostCSS版本,建议用最新版。我之前用7.x版本也遇到过奇怪的问题,升级到8.x就正常了。
顺便吐槽下,CSS这些未来语法真的很折腾,每次都要查兼容性。不过一旦配好了,用起来确实爽,特别是项目里有很多响应式断点时。
@custom-media语法,虽然你用了 postcss-preset-env,但它默认的 stage 配置可能没开到支持实验性语法。@custom-media属于比较新的 CSS 规范,需要明确启用。postcss-preset-env 默认只处理 stage 2+ 的特性,而 custom media 查询在早期是 stage 3,但实际使用时经常因为 parser 解析不到直接报 “Unknown word”。解决方法很简单:修改配置,显式开启
features或调整stage。改成这样:
重点是加上
features: { 'custom-media-queries': true },这样强制启用 custom media 支持。有时候光靠 stage 3 也不保险,插件层面得打个补丁。另外确认一下你用的 postcss-preset-env 版本,老版本(比如 6.x 以下)对 custom-media 支持不完整,建议升级到最新版:
顺便提一句,这类问题服务端构建流程最容易踩坑,本地开发能跑不代表 CI 能过,版本一乱就炸。建议锁版本 + 提前在 pipeline 验证。