Webpack 5 打包 Less 报错90%源于 less-loader 版本与配置不匹配,需降级至 v7.3.3、同步安装 less、显式配置 lessOptions.paths 处理 ~ 别名、避免 smp 与 mini-css-extract-plugin 冲突,并升级 less 至 ≥3.13.1 以解决内存溢出。
Webpack 5 打包 Less 报错,90% 是 less-loader 版本与配置不匹配,不是文件路径或语法问题。
这是最典型的版本断层错误:[email protected]+ 彻底移除了旧版 API,但你的 Webpack 配置仍按 v7 写法传参(比如直接写 { javascriptEnabled: true }),导致 loader 内部调用 this.getOptions() 失败。
npm uninstall less-loader && npm install less-loader@7 -D(v7.3.3 是目前最稳的兼容版本)lessOptions 包裹所有参数,稍有遗漏就报 Invalid options object
less-loader:漏装 less 编译器本身会触发 Cannot find module 'less' —— 必须同时执行 npm install less -D
这个报错和文件是否存在无关,本质是 less-loader 没把 ~ 当成 node_modules 别名处理。Less 解析器默认不走 Webpack 的 resolve.alias,必须显式告诉它去哪找。
less-loader 的 options 中加 lessOptions: { paths: [path.resolve(__dirname, 'node_modules')] }
resolve.alias 和 lessOptions.paths 里都配 ~antd: path.resolve(__dirname, 'node_modules/antd')
@import '~antd/es/style/themes/index.less'; 改成 @import 'antd/es/style/themes/index.less';(去掉 ~),靠 Webpack 默认 node_modules 查找逻辑兜底antd/dist/themes/ 下,~antd/es/... 根本不存在加上 smp 后打包失败,但去掉就正常?这不是你配置错了,而是 smp 的 wrap 操作破坏了 mini-css-extract-plugin 对 loader 类型的判断逻辑,尤其在 less-loader 和 css-loader 共存时容易误判。
smp —— Webpack 5 自带 stats: 'verbose' 和 profile: true 已足够定位慢点mini-css-extract-plugin 到 @1.3.6(v2+ 与 smp 兼容性差)rules 的 exclude:确保 /(js|css|json|png|jpg|gif|less)$/ 显式排除了 .less,否则 url-loader 会提前把 .less 当资源处理,再交给 less-loader 时已不是源码,报 Unrecognised input
这不是内存不够,是 Less 解析器 AST 节点爆炸。常见于深层嵌套、递归 mixin 或通配符 @import,尤其在 Webpack 5 的 watch 模式下反复编译会加速崩溃。
less:必须 ≥ 3.13.1 或 4.2.0+,新版 AST 回收机制能降内存 40%+@import "components/*.less":改成明确路径 + @import (once) "xxx.less"
.a { .b { .c { ... } } })就该拆成独立 class@import "../组件/button.less" 会直接卡死;统一用英文路径,或通过 lessOptions.paths 指定包含中文目录的父路径真正棘手的从来不是报错信息本身,而是报错位置和实际原因错位——Less 文件里一个没闭合的括号,可能让 Webpack 在完全无关的 CSS 提取阶段崩掉;~ 看似是路径问题,实则是解析器和模块系统两套机制没对齐。动手前先看 less-loader 和 less 的实际版本,比猜报错含义快十倍。