less 4 默认 strictmath=true 且移除 javascriptenabled,要求数学运算加括号、禁用js表达式,并强化@import循环检测与source map偏移修复。

Less 4 默认 strictMath=true 导致数学表达式报错
Less 4.x 把 strictMath 默认值从 false 改为 true,意味着所有数学运算必须显式用括号包裹,否则直接报 SyntaxError: expected 1 selector or at-rule, was "10px / 2"。这不是语法错误,是解析器主动拒绝未加括号的运算。
- 旧写法(Less 3 兼容):
@size: 10px / 2;→ Less 4 报错 - 新写法(必须):
@size: (10px / 2);或@size: unit(10px / 2, px); - Webpack 用户:在
less-loader的options中显式设strictMath: false可临时兼容,但不推荐长期使用 - 全局搜索项目中所有
:后带/、*、+、-的变量赋值,批量补括号比关 strictMath 更可靠
Less 4 移除 JavaScript 表达式支持引发的 javascriptEnabled 失效
Less 4 彻底移除了 javascriptEnabled 选项,任何含 unit(10px / 2, px)、color(~"rgb(@{r}, @{g}, @{b})") 这类 JS 调用的代码都会报 ParseError: Unrecognised input。这不是配置漏了,是能力被删了。
- 所有
unit()、percentage()、color()、~""拼接都必须重写 - 替代方案:
@size: (10px / 2);替代unit(10px / 2, px);用@{var}插值替代字符串拼接 - Vue CLI 用户注意:
vue.config.js中若还保留javascriptEnabled: true,会触发 less-loader 配置校验失败,直接构建中断 - 第三方 UI 库(如旧版 Ant Design)若依赖 JS 表达式,必须锁定 Less 3 或升级到已适配 Less 4 的版本
Less 4 的 @import 解析更严格,环状引用暴露更早
Less 4 对 @import 的路径解析和依赖拓扑做了增强,原本在 Less 3 中静默运行的循环引用(如 A.less → B.less → A.less),现在会在编译初期就抛出 Variable @xxx is undefined 或卡死,不再等到内存耗尽才崩溃。
- 不是 bug,是提前暴露问题:检查报错行附近所有
@import,尤其带(reference)或(inline)的导入 -
@import (reference)不解决作用域闭环——它只跳过 CSS 输出,不改变变量/mixin 加载顺序 - 快速定位法:临时删掉所有
(reference)和(inline),让所有导入“真实生效”,循环会立刻触发变量未定义错误 - 根治方式:抽离公共变量到独立
tokens.less,确保它是第一个被导入且不反向引用任何其他文件
Source Map 行号偏移或失效因 @import 文本拼接机制未变
Less 4 虽升级了 AST,但 @import 仍是纯文本拼接,不是模块化加载。这导致 Source Map 的 sources 字段里行号与原始 .less 文件严重偏移,尤其当多个文件通过 @import 合并后,DevTools 点击跳转总错行。
- 不是配置没开:确认
lessc --source-map或less-loader sourceMap: true已启用 - 关键补救:加
--source-map-include-names参数,避免sources缩写成mixins.less,而应为src/less/mixins.less - Webpack 用户必须同步开启
css-loader sourceMap: true,否则它会“吃掉” less 生成的 map 并重写一份,造成二次偏移 - 如果用了
mini-css-extract-plugin,务必设publicPath: '',否则sourceMappingURL会写成绝对路径,本地开发时 404
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











