在 Webpack 5 中处理 Less,最标准且不容易出错的配置方式,就是这条常见的加载链:['style-loader', 'css-loader', 'less-loader']。原因很明确,因为 use 的执行顺序是从右往左:先由 less-loader 将 Less 编译为 CSS,再交给 css-loader 解析其中的依赖关系,最后通过 style-loader 把样式注入到 DOM 中。只要少装了 less,或者把这几个 loader 的顺序写错,通常都会直接触发 Module parse failed 报错。

Webpack 5 默认并不能直接识别 .less 文件,必须依赖 loader 链把它转换成浏览器可以执行的代码;而配置失败最常见的问题,往往集中在 loader 顺序错误、依赖缺失,以及开发和生产环境没有正确区分。
loader 顺序为什么必须是 ['style-loader', 'css-loader', 'less-loader']
Webpack 的 use 数组遵循从右到左的执行规则,因此实际处理顺序为:less-loader → css-loader → style-loader:
less-loader:负责把.less源文件中的变量、嵌套、@import等 Less 语法编译成标准 CSS 字符串css-loader:用于解析 CSS 中的url()、@import等资源依赖,并将其转换为模块导出style-loader:把最终得到的 CSS 字符串插入到 DOM 的标签中,这一步也是开发环境热更新生效的重要前提
如果顺序写反了,比如把 style-loader 放在最右边,就很容易导致样式不生效,或者直接报出 Module parse failed: Unexpected character '@'。这类错误通常说明 less-loader 根本没有正确执行。
必须装齐的依赖和它们的作用
这些依赖少任何一个,执行 npm run build 时基本都会直接报错,而不是简单警告:
style-loader和css-loader:用于处理所有 CSS 样式资源,二者都必不可少less-loader:本质上只是负责转换 Less 的 loader,本身并不内置编译引擎less(注意不是less-loader):真正的 Less 编译依赖,如果漏装,通常会报Cannot find module 'less'
推荐统一使用下面这条安装命令:
npm install -D style-loader css-loader less-loader less
尽量不要再使用 node-sass 或过旧版本的 less,在 2026 年的主流 Webpack 5 项目里,通常已经默认要求使用 less@4.2+。
开发 vs 生产环境的 loader 必须分开写
style-loader 更适合开发环境:它会把样式直接挂载到 DOM 中,并支持 HMR 热更新;但在生产环境里,通常必须把样式抽离成独立的 .css 文件,否则不仅会让 JS bundle 体积变大,也不利于浏览器并行加载资源:
- 开发环境:
use: ['style-loader', 'css-loader', 'less-loader'] - 生产环境:
use: [MiniCssExtractPlugin.loader, 'css-loader', 'less-loader']
这里有一个在配置 Webpack 5 Less 时特别容易踩坑的细节:MiniCssExtractPlugin.loader 不是字符串形式的 'mini-css-extract-plugin/loader',而是必须从插件中 import 出来的 loader 引用,这也是 Webpack 5+ 的规范要求。另外不要忘记,它还必须和 plugins: [new MiniCssExtractPlugin({ filename: '[name].[contenthash].css' })] 配合使用,只有这样生产环境的 CSS 抽离配置才会真正生效。
容易被忽略的兼容性细节
Less 编译生成的 CSS 默认不会自动补充厂商前缀,如果直接用于生产环境,在旧版 Safari 或部分 Android 浏览器中可能出现兼容性问题:
- 建议增加
postcss-loader和autoprefixer,并在postcss.config.js中配置好browserslist less-loader的additionalData选项经常被用来全局注入变量,例如主题色,但在 Webpack 5 中更推荐写成函数形式,否则可能影响 HMR 热更新css-loader默认启用了esModule: true,如果你仍然使用require('./xxx.less'),得到的结果会是{ default: 'xxx' },这时需要改为require('./xxx.less').default,或者手动关闭该选项
实际排查 Webpack 5 配置问题时,真正最容易卡住开发者的,往往不是 loader 有没有安装,而是 less 与 less-loader 的版本不兼容,或者在 development 模式下错误使用了 MiniCssExtractPlugin 的 loader。
