@plugin规则在Less 4.0+中已被彻底移除,必须通过plugins数组显式传入插件;Node.js需在less.render()中传入plugins: [require('./plugin.js')],Webpack需配置options.plugins,浏览器需在less.min.js前设置window.less = { plugins: [myPlugin] }。

@plugin 规则在 Less 4.0+ 中已完全移除,直接写 @plugin "xxx.js" 必然报错 Unknown rule: @plugin——这不是路径或权限问题,而是语法已被废弃。想扩展功能,必须走现代插件加载路径。
Less 插件为什么总不生效?
根本原因不是代码写错了,而是没注册、没传入、没提前加载。
- Node.js 环境下:
less.render()或less.renderSync()必须显式传入plugins: [require('./my-plugin.js')],否则插件函数根本不会被调用 - Webpack +
less-loader:必须在options.plugins数组里require()插件模块,仅 import 不起作用 - 浏览器环境:必须在
less.min.js加载前,通过window.less = { plugins: [myPlugin] }全局注册;顺序错,less.plugins就是空数组 -
@plugin只能在 .less 文件顶层写,不能套在@media、.mixin()或嵌套规则里,否则解析阶段就跳过
自定义函数插件怎么写才不报 toCSS 错误?
常见错误是直接 return '12rem' 或 return 12,Less 内部要求返回特定 AST 节点实例。
- 插件对象必须含
install(less, pluginManager)方法(不能是箭头函数) - 注册函数用
less.functions.add('px2rem', ...),名字区分大小写 - 参数如
px是less.Dimension实例,需调用px.getValue()和px.getUnit().toString() - 返回值必须是
new less.Dimension(value, unit)、new less.Color([r,g,b], a)等内置类型,不能是原始值或字符串 - 单位转换类函数(如
px2rem)建议默认以rem为单位返回,避免用户再手动加单位
Visitor 插件改 AST 时最常踩的坑
Visitor 适合批量重写样式节点(比如统一补单位、替换颜色变量),但节点不可变,判断和替换逻辑极易出错。
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 不能假设
node.value是字符串或Color—— 它可能是Variable、Call或DetachedRuleset,必须用instanceof判断类型 - 只匹配
node.name === 'color',避免误改background-color或border-color - 若需取变量真实值(如
@primary对应的#007bff),得调用node.value.eval(context),且 Visitor 必须声明isPreEvalVisitor: true - 修改必须返回新节点:
return new less.tree.Color(...);原地赋值node.value = ...无效 - Visitor 的
visitDeclaration()接收的是 AST 节点,不是 CSS 字符串,别试图正则替换
插件文件格式和加载时机的硬性限制
插件不是普通 JS 模块,它对格式、路径、执行时机有严格约定。
立即学习“前端免费学习笔记(深入)”;
- 必须是 CommonJS 格式:
module.exports = { install() { ... } };.mjs、ES Module或未转译的.ts直接失败 - 路径是相对于当前 .less 文件的,不是 Node.js 模块路径;
@plugin "utils/px2rem.js"表示同目录下的utils/px2rem.js - 不支持动态路径:
@plugin "prefix-" + $name + ".js"是非法语法,会触发ParseError - 同一个插件多次
@plugin只执行一次install(),但每次都会尝试读取 JS 内容——别在里面写副作用逻辑(如console.log、fetch) - 插件无法访问当前文件的变量作用域,所有上下文信息必须通过 AST 节点或
eval(context)显式获取

















