less 3.x升级到4.x时除法不再自动计算,必须显式用括号(如(100px / 4))或./(如100px ./ 4)标记,否则/视为css字面量;@import须带.less后缀;函数参数须带单位;嵌套中父级@变量不可隐式访问。

Less 3里不能直接执行任意JS表达式
Less 3(特别是从v3.0开始)移除了对JavaScript表达式的原生支持,比如旧版中允许的~`"color: " + (isDark ? "#000" : "#fff")`这种写法,在v3+默认被禁用,启用后也仅限极有限的上下文(如@plugin环境),且不推荐用于业务逻辑。你看到的“动态输出CSS值”,实际应靠Less自身的函数、变量作用域和混合(.mixin)机制实现。
用if()、lighten()等内置函数替代JS逻辑
Less 3提供了足够多的条件与颜色/数学函数来覆盖常见动态需求。例如根据主题开关切换颜色、按层级缩放字号,都不需要JS。
-
if($condition, $true-value, $false-value)可嵌套使用,但注意它只接受布尔字面量或比较结果(如@is-dark = true,然后if(@is-dark, #000, #fff)) - 颜色函数如
lighten(@base, 10%)、contrast(@base)比拼字符串更安全可靠 - 数值计算直接用
@size * 1.2或unit(@px-value, rem),无需parseInt或toString
真要注入运行时JS?走@plugin路径,但仅限Node.js编译环境
Less 3.5+ 支持通过@plugin加载自定义JS模块,但它不是“在CSS里写JS”,而是扩展编译器能力。典型场景:读取环境变量、调用外部API生成变量(如从设计系统JSON拉取色板)。
示例(theme-plugin.js):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
module.exports = {
install: function(less, pluginManager, functions) {
functions.add('getThemeColor', function(name) {
const theme = { primary: '#3a8ee6', danger: '#f5222d' };
return new less.tree.Color(theme[name] || '#000');
});
}
};
在Less中使用:
@plugin "./theme-plugin.js";
.btn { color: getThemeColor("primary"); }
- 该插件只在Node.js下用
less.render()或CLI编译时生效,浏览器端less.js不支持 - 返回值必须是Less AST节点(如
Color、Dimension),不能是字符串或原始JS对象 - 无法访问浏览器DOM或
window,纯编译期行为
混淆点:别把~""误当JS执行器
有人以为~`...`还能执行JS,其实Less 3已废弃此语法。残留的~"..."只是字符串转义(去掉引号),不会求值。下面这些都无效:
-
~`"calc(" + @width + " - 20px)"→ 编译报错或原样输出 -
~`Math.round(@value)`→ 不会调用Math -
~"hello" + @world→ 字符串拼接失败,Less不支持运行时字符串操作
真正能动态的,只有编译期确定的变量、函数调用和混合参数;所谓“动态”,本质是预编译分支,不是CSS-in-JS那种运行时渲染。
最容易被忽略的是:你以为在写JS,其实Less早在你保存文件时就完成了所有计算——没有闭包、没有副作用、也没有console.log可调试。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










