Less 默认将 @import "xxx.css" 视为外部 CSS 原样输出为 @import url(),不解析、不内联;需配置 css-loader 的 importLoaders: 2 或改用 postcss-import 才能使其参与构建流程。

Less 默认把 @import "xxx.css" 当作原生 CSS 导入处理,直接输出 @import url("xxx.css") 到编译结果里,不解析、不内联、不参与构建流程——所以它根本不会被 Webpack 或 Vite 打包合并。
为什么 @import "reset.css" 编译后还是 @import url()
因为 Less 的 @import 对后缀有默认行为判断:
-
@import "reset.css"→ Less 认为这是外部 CSS,不做解析,原样输出@import url("reset.css") -
@import "reset.less"→ 正常读取、解析、内联内容 -
@import (less) "reset.css"→ 强制当 Less 源文件处理(要求内容语法合法)
浏览器收到 @import url() 后会单独发起请求,而现代构建工具默认不接管这类运行时加载,导致资源未被压缩、去重、哈希,也绕过了 css-loader 的路径重写逻辑。
Webpack 中 css-loader 必须设 importLoaders: 2
否则 @import (css) "xxx.css" 在 Less 里写的语句,会被 css-loader 完全忽略——它默认只处理 CSS 文件里的 @import,对 less-loader 输出的 @import 不感知。
立即学习“前端免费学习笔记(深入)”;
正确配置示例:
use: [
'style-loader',
{
loader: 'css-loader',
options: { importLoaders: 2 } // ← 关键:让 css-loader 处理 less-loader 输出的 @import
},
'postcss-loader',
'less-loader'
]
漏掉这行,@import "reset.css" 在编译后可能直接消失,或变成无效的 @import url() 被浏览器静默拒载。
更稳妥的做法:用 postcss-import 替代 Less 原生 @import
Less 的 @import 不支持条件导入、无法跨 loader 通信、也不做依赖去重。而 postcss-import 是专为现代构建设计的:
- 统一处理
.css和.less混合依赖 - 自动去重、排序、报错
- 路径解析由 Webpack alias 控制,
@import '~@/styles/reset.css'可靠生效
操作要点:
- 删掉所有
@import "xxx.css"语句 - 在
postcss.config.js中启用require('postcss-import') - 把
@import写在.css文件里(不是.less),例如@import 'reset.css'; - 确保
postcss-loader在css-loader之前执行
真正容易被忽略的是:即使你写了 @import (css),只要没配 importLoaders 或没切到 postcss-import,那条语句就只是个“幻觉”——它既没进打包流程,也没触发任何构建阶段的路径修正或内容内联。


















