Less 4 升级后数学运算报错是因编译器默认禁用模糊语法:math: 0 被移除,除法需括号或 ./,单位混合计算被禁止,calc() 需 ~"" 保护,unit()/unitless() 成必需。

升级到 Less 4 后旧项目数学运算报错,不是你写错了,而是编译器默认不再容忍模糊语法——math 配置被重定义、除法行为收紧、单位混合计算被禁止,所有“以前能跑通”的写法,现在都可能卡在解析或类型校验阶段。
math 配置失效:math: 0 已彻底消失,不是关不关的问题
Less 4 中 math: 0(即旧版宽松除法)已被完全移除。它不会报错,但会被静默忽略,编译器自动 fallback 到 math: 2(强制括号模式)。你改了配置却没效果,大概率是写了 math: 0 或漏了配置层级。
-
math: 1允许无括号除法(如10px / 2),兼容旧写法,但语义不明确(100px / 2 + 10px是先除还是先加?) -
math: 2(默认)要求所有除法显式加括号,或用./安全除法(注意空格:10px ./ 2) - 配置必须在编译器启动时传入:
less-loader的options.math,或 Vite 的css.preprocessorOptions.less.math
除法写法必须改:/ 不再是除法运算符,除非加括号或用 ./
Less 4 默认把裸露的 / 当作分隔符(比如路径、注释),不是数学运算符。写 width: 100px / 2 会直接报错或被跳过,而不是算出 50px。
- ✅ 正确写法:
width: (100px / 2)或width: 100px ./ 2 - ❌ 错误写法:
width: 100px / 2、@size: 10px / 2 - 工具链里没配
math: 1时,./是最稳妥的选择,空格不能省
带单位和无单位值不能混算:unit() 和 unitless() 成为刚需
Less 4 禁止隐式单位转换。写 @base: 16px; @scale: 1.2; @size: @base * @scale; 会直接报 Operation on an invalid type,因为 px * number 不被允许。
- 必须显式提取数值:
unit(@base)返回16,再乘@scale,最后用unit(..., 'px')加回单位 - 用
unitless(@value)判断类型,避免函数内因参数单位不一致而崩溃 - 不要依赖
+拼接单位,10 + px是非法语法,@a + @b单位不一致也会报错
calc() 被提前计算:不加 ~"" 就永远进不了浏览器
Less 会把 calc(100vh - 64px) 当成数学表达式去算,而不是留给 CSS 运行时。结果要么输出一个错误静态值(如 calc(36vh)),要么直接报错。
- ✅ 必须用
~"calc(100vh - @{gap})",且@gap必须带单位(如@gap: 64px) - ❌
calc(100vh - @gap)、~'calc(...)'(单引号不触发插值)、@gap: 64(无单位)都会失败 - 变量插值必须写在
~""外部,再拼进去;中间计算建议拆成独立变量,避免字符串拼接出错
真正容易被忽略的是:即使你设了 math: 1,@import 路径、函数参数单位、变量作用域这些规则仍全部生效——数学模式只是冰山一角。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











