--compress 压缩效果有限,仅删空格换行和重复分号,不合并选择器、不去重声明、不剔除未用规则;含200个.btn-*类的文件压缩后体积仅减3%~5%,适合调试或CI/CD中需可读CSS场景,对生产包体积几乎无帮助。

为什么 --compress 基本压不动体积
--compress 只删空格、换行、重复分号,不合并选择器、不去重声明、不剔除未用规则。一个含 200 个 .btn-* 类的文件,压缩前后体积可能只差 3%~5%。它适合本地调试或 CI/CD 中需要可读 CSS 的环节,但对生产包体积几乎没帮助。
真正有效的压缩必须用 --clean-css
--clean-css 是外部插件,能做选择器合并、声明去重、未用规则剔除,但必须配对启用关键参数:
- 必须安装:
npm install -g less-plugin-clean-css - 基础命令缺一不可:
lessc app.less --clean-css="--s1 --advanced --compatibility '*'",漏掉--advanced就不会合并选择器 -
--s1保留关键分号,避免 IE8 解析失败;--compatibility '*'防止rgba()被转成 hex 后丢透明度 - 如果 Less 文件含
@charset "GBK"或中文注释,得加--keep-breaks,否则编码声明可能被误删
:extend() 不生效?先查这三个硬条件
:extend() 能大幅减体积(比如 5 个按钮类共用一套声明),但失效很常见:
-
.target必须真实输出到最终 CSS —— 不能只靠@import (reference)引入,否则编译器找不到目标,退化为复制整块规则 - 选择器必须精确匹配:
.nav-item:hover无法被.mobile-nav:extend(.nav-item)匹配,得写成.mobile-nav:extend(.nav-item:hover all) - 路径必须完全一致:
./base.less和../shared/base.less在 Less 看来是两个文件,各自:extend()会生成两套重复规则 - 验证是否成功:打开编译后 CSS,搜索
.btn, .btn-primary, .btn-secondary {这类逗号分隔块;只有孤立的.btn-primary {,说明链路断了
mixins 漏括号、嵌套过深、通配符导入是体积暴增元凶
这些不是“写法不够优雅”,而是直接导致冗余 CSS 成倍增长:
立即学习“前端免费学习笔记(深入)”;
- 定义 mixin 必须带括号:
.clearfix()正确,.clearfix(无括号)会被当普通 class,哪怕没调用也输出空规则 -
.card { .btn-base(); }编译后变成.card .btn-base { },多一层 DOM 依赖;想保持平级就用& { .btn-base(); } - 嵌套超 15 层或递归 mixin 无终止条件,Less 3.9–3.10.x 会触发
JavaScript heap out of memory -
@import "components/*.less"在标准 Less 中不支持,Webpack 等工具会静默加载全部文件,彻底废掉按需控制
@import 和 :extend() 写没写对。路径错一位、括号漏一个、all 忘加,都可能导致最终 CSS 多出几十 KB。


















