cssnano 默认删除所有注释,包括 purgecss/rtl 等语义化注释,因其 discardComments 仅支持布尔值且 preset-default 隐式启用;应手动拆解插件链,用 postcss-discard-comments 配 preserve 正则保留关键注释。

cssnano 默认只删普通注释,但项目里那些带语义的/* purgecss start ignore */或/* rtl:begin:ignore */会被一并清掉——这不是精简,是破坏。
为什么 cssnano --safe 仍会误删关键注释
默认配置下cssnano把所有/* ... */当无用字符处理,不管它是不是被构建工具、RTL 插件或人工标记依赖。比如postcss-rtl靠/* rtl:ignore */跳过双向文本转换,purgecss靠/* purgecss ignore */保活动态类名——这些全在cssnano的删除列表里。
- 启用
cssnano前必须确认它是否处于 PostCSS 插件链末尾,否则上游插件(如postcss-preset-env)可能已把注释转成其他结构,导致cssnano根本看不到原始标记 -
cssnano的discardComments选项不支持正则白名单,只认布尔值:true全删,false全留,没有中间态 - 若你用了
postcss-import,它的@import内联会把被引用文件里的注释也带进来,cssnano照单全收
用 preset 和 plugins 手动接管注释控制权
别碰cssnano/preset-default,直接拆解插件链,只启用你需要的压缩项,把注释交给更细粒度的插件管。
- 禁用
cssnano自带的discardComments,改用postcss-discard-comments并配preserve选项:require('postcss-discard-comments')({ preserve: [/^\/\*\s*(purgecss|rtl|keep):/i] }) - 把
cssnano降级为仅启用mergeLonghand、collapseWhitespace、reduceTransforms等安全项,避免normalizeWhitespace二次干扰注释位置 - 若项目含 CSS-in-JS 或动态类名(如
className={`btn ${isPrimary ? 'btn--primary' : ''}`}),必须确保postcss-discard-comments的preserve正则能匹配到/* safelist: btn--primary */这类人工标注
注释不是冗余,而是契约
真正该删的是没被任何工具读取、也没人维护的“死注释”,比如三年前写的/* TODO: refactor this later */或空行里的/* --- */。而所有以/* [tool-name]:开头的,都是构建流程中明确约定的信号量——删它们等于撕毁接口协议。
最常被忽略的一点:当你在postcss.config.js里写plugins: [cssnano(), ...]时,cssnano会悄悄加载整套 preset,默认开启discardComments: true,哪怕你没显式配置。得手动展开、逐个关掉,不能偷懒。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











