--strict-math=on 是为提前暴露非法数学表达式(如 100% / 3 - 10px),强制括号明确运算意图,仅拦截除法歧义,不校验单位、作用域或插值;Webpack/Vite/Node API 需显式配 math: 'strict' 才生效。

开启 --strict-math=on 不是为了“更规范”,而是为了提前暴露那些本就会让浏览器解析失败、但 Less 却静默放行的数学表达式——比如 100% / 3 - 10px 这类写法,在非严格模式下编译成无效 CSS,上线后布局就塌了。
为什么 100% / 3 - 10px 会静默产出错误值?
Less 默认的 math: always 模式会尝试执行所有除法,但不校验语义合理性。它把 100% / 3 - 10px 当作三步运算:100% / 3 → 33.33333333%,再减 10px → 得到 33.33333333% - 10px。这个结果是非法 CSS 值,浏览器直接忽略整条声明。
严格模式强制你显式加括号,逼你面对真实意图:
- 想让浏览器运行时计算?必须写成
~"calc(100% / 3 - 10px)" - 想让 Less 编译期算出固定像素?得先确保单位可运算,例如
@base-width: 375px; width: (@base-width / 3) - 10px; - 混用百分比和像素还硬除?
--strict-math=on直接报ParseError: division requires parentheses,不让你糊弄过去
--strict-math=on 和 Webpack / Vite 的配置差异
命令行参数不是万能的——构建工具链里必须显式对齐,否则等于没开:
立即学习“前端免费学习笔记(深入)”;
- Webpack
less-loader(v11+):必须设math: 'strict',math: 'always'或'parens-division'都不行 - Vite(
vite.config.ts):在css.preprocessorOptions.less下配math: 'strict',漏掉preprocessorOptions层级就无效 - Node.js API 调用(如自研构建脚本):
less.render()不接受--strict-math参数,必须传{ math: 'strict' }选项对象
注意:math: 'strict' 是唯一等效于命令行 --strict-math=on 的值;其他选项(包括 'always')都会退回到静默除法行为。
单位丢失、作用域错乱这些坑,严格模式管不管?
不管。它只拦截除法语法歧义,不校验单位是否合理、变量是否定义、作用域是否污染。
比如这些错误仍会通过编译:
-
@gap: 8 * 1.5px;→ 实际输出12(无单位),因为乘法顺序导致解析失败 -
@media (min-width: @breakpoint-md + 1px) { ... }→ 若@breakpoint-md未导入,Less 用0替代,生成@media (min-width: 1px) -
height: ~"calc(100vh - @header-height)";→ 插值失败,@header-height不展开,最终是字面量calc(100vh - @header-height)
所以 --strict-math=on 是必要但不充分条件:它能拦住最常见、最隐蔽的 calc 失效,但单位、作用域、插值这些,还得靠人盯住 @{var} 写法、导入顺序和调试输出。


















