less 4.x 不支持 map 结构,仅能通过命名空间(如.colors {@primary: #007bff;})配合@namespace[@key]语法访问;无map-get等函数,.each()等为过时写法;多层需嵌套规则集硬编码;所有操作均在构建期执行且无类型校验。

Less 4.x 没有 Map 结构——这是最需要先说清的事实。你看到的 map-get、map-keys、.each() 等写法,要么来自过时教程混淆了 Sass 语法,要么依赖已废弃的第三方插件(如 less-plugin-functions),在官方 lessc 4.2.0 中全部不可用,直接编译会报 ReferenceError: map-get is not defined。
直接用命名空间 + 方括号访问(Less 4.0+ 唯一原生“类 Map”语法)
Less 4.0+ 引入了命名空间变量和 @namespace[@key] 访问语法,这是目前最接近“静态 Map”的官方能力:
- 必须用
.开头声明命名空间,例如.colors { @primary: #007bff; @success: #28a745; } - 访问必须用方括号:
.colors[@primary]→ 编译为#007bff -
@key必须是已定义的变量名(如@primary),不能是字符串"primary",也不能是另一个变量@theme-key: @primary; .colors[@theme-key](不会展开) - 不支持嵌套路径:
.themes[@light][@primary]是非法语法;要实现多层,得拆成多个命名空间
示例:
.colors {
@primary: #007bff;
@success: #28a745;
}
.text-primary {
color: .colors[@primary];
}
想批量生成原子类?别碰 .each(),它根本不存在于 Less 4.x
网上大量教程教的 .each(@colors) { } 或 map-keys(@colors) 在 lessc 4.2.0 中完全无效。这些函数从未被官方合并,社区 PR 已被明确拒绝。试图运行会得到:
Cannot call method 'each' on nullUnrecognised input(遇到括号包裹的 (key: value) 时)
真正能批量生成的方式只有两种:
- 用空格分隔的 list +
extract()+ 手动索引(适用于固定顺序、数量少的配置,如断点) - 用
when条件 mixin 模拟键匹配(兼容性好,但写法冗长)
比如模拟主题色映射:
.theme-color(@name) when (@name = primary) { @ret: #007bff; }
.theme-color(@name) when (@name = success) { @ret: #28a745; }
.text-success { color: .theme-color(success); }
多层级主题必须靠规则集({ })+ 静态路径展开
想表达 light.colors.primary 这种结构,唯一合法写法是:
@themes: {
light: {
colors: {
primary: #007bff;
success: #28a745;
};
};
};
然后通过 @themes.light.colors.primary 访问——注意:没有引号、没有括号、没有逗号、不能插值(@layer: light; @themes.@{layer}.colors.primary 会失败)。
这种写法本质是嵌套规则集,所有路径都在编译期硬编码展开,无法动态切换。如果你需要 JS 运行时换主题,必须配合 CSS 自定义属性:
:root {
--primary-color: @themes.light.colors.primary;
}
再在样式中统一用 var(--primary-color),而不是反复查 @themes。
最容易被忽略的一点:所有“Map 类操作”都发生在构建期,且无类型安全
你写的 .colors[@primary] 如果 @primary 没在 .colors 里定义,Less 不会报错,而是静默返回空值,导致生成的 CSS 缺失关键声明。没有 map-has-key(),也没有编译期校验。真要防错,只能靠人工核对命名空间内变量名,或在构建流程中加一层 JSON Schema 校验脚本预处理主题配置文件。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











