less 3.x 禁用反引号内 js 求值是明确设计决策,为安全性和可预测性;须改用 modifyvars 预传字符串变量或 functions 注册同步自定义函数,且仅限 node.js/构建时使用。

Less 3.x 不再支持运行时 JavaScript 表达式求值(如 @var: `someJS()`),这是被明确移除的功能;动态 CSS 必须改用预编译阶段的 JavaScript 调用,或降级到 Less 2.x(不推荐)。
为什么 @var: `js code` 在 Less 3.x 中直接报错?
Less 3.0+ 彻底删除了对反引号内 JS 执行的支持,解析器遇到 `Math.random()` 这类语法会抛出 ParseError: Unrecognised input。这不是 bug,是设计决策——为安全性和可预测性,禁止在样式表中执行任意 JS。
- 旧写法(Less 2.x):
@width: `Math.round(@base * 1.5)`;→ 在 3.x 中完全失效 - 错误现象:编译中断,控制台提示类似
Unrecognised input 'Math.round'... - 替代思路不是“绕过限制”,而是把 JS 计算移到预编译环节
用 modifyVars + 自定义函数在 Node.js 环境预计算
如果你用 less.render() 或 less.watch() 在服务端/构建时编译,可以在调用前把 JS 计算结果传入 modifyVars,让 Less 当作普通变量使用。
<pre class="brush:php;toolbar:false;">const less = require('less');
<p>const dynamicValue = Math.round(Math.random() * 100) + 'px';</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java"><img
src="https://img.php.cn/upload/skill/000/000/081/178955835420587.jpg" alt="Alibabacloud Sdk Client Initialization For Java" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java" class="overflowclass">Alibabacloud Sdk Client Initialization For Java</a>
<p class="overflowclass">在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。</p>
</div>
<a rel="nofollow" href="/xiazai/skill3430" title="Alibabacloud Sdk Client Initialization For Java" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><p>less.render(<code> .box { width: @width; } </code></p>, {
modifyVars: {
'@width': dynamicValue // ← 字符串形式传入,无需引号包裹
}
}).then(output => console.log(output.css));
-
modifyVars的值必须是字符串(如'24px'、'#f00'),不能是数字或对象 - 如果要传计算逻辑(比如基于屏幕尺寸响应式断点),必须在 JS 层完成所有计算,再塞进
modifyVars - 注意:浏览器端
less.js(v3.x)同样不支持运行时 JS 求值,此方案只适用于 Node.js 或构建工具(如 webpack-less)
用 functions 注册自定义 Less 函数(需 Node.js)
Less 3.x 允许通过 functions 选项注入自定义函数,这些函数在编译期被调用,返回值参与 CSS 生成 —— 这是最接近“JS 求值”的合法方式。
<pre class="brush:php;toolbar:false;">less.render(`
.item { margin: px2rem(24); }
`, {
functions: {
px2rem: (px) => {
const val = parseFloat(px.value);
return { value: (val / 16).toFixed(2) + 'rem' };
}
}
});
- 函数接收的是 Less AST 节点(
px 是 <code>Dimension对象),需用.value提取原始数值 - 返回值必须是 Less 内置类型(如
{ value: '1.5rem' }),不能直接 return 字符串 - 不支持异步操作(如
fetch、setTimeout),所有计算必须同步完成 - 浏览器端无法注册此类函数(
less.js初始化后functions不可变)
真正麻烦的地方在于:你得区分清楚「编译前」和「运行时」——Less 3.x 把所有 JS 交互严格限定在编译前一刻,没有中间态。一旦漏掉 modifyVars 类型校验,或误以为浏览器里能跑自定义函数,就会卡在黑盒里很久。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










