The css-loader interprets @import and url() like import/require() and will resolve them.
Github: css-loader
解析 @import 和 url() 的语法,然后将 css 拼接为字符串,最后用 ES module 导出。
下面从实际例子看下 css-loader 的输出:
webpack version: 5.88.1
css-loader: 6.8.1
style-loader: 3.3.3
// test.css
@import './b.css';
@import './c.css';
#root {
font-size: 30px;
color: red;
}
// b.css
.b {
display: flex;
transition: all 2s ease;
}
// c.css
.c {
display: block;
}
我们在打包的入口文件引入了 test.css,然后 test.css 文件引入了 b.css 和 c.css 文件,最后我们看下 css-loader 的输出:
// Imports
import ___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___ from "../node_modules/css-loader/dist/runtime/noSourceMaps.js";
import ___CSS_LOADER_API_IMPORT___ from "../node_modules/css-loader/dist/runtime/api.js";
import ___CSS_LOADER_AT_RULE_IMPORT_0___ from "-!../node_modules/css-loader/dist/cjs.js!./b.css";
import ___CSS_LOADER_AT_RULE_IMPORT_1___ from "-!../node_modules/css-loader/dist/cjs.js!./c.css";
var ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_NO_SOURCEMAP_IMPORT___);
___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_0___);
___CSS_LOADER_EXPORT___.i(___CSS_LOADER_AT_RULE_IMPORT_1___);
// Module
___CSS_LOADER_EXPORT___.push([module.id, `#root {\n font-size: 30px;\n color: red;\n}`, ""]);
// Exports
export default ___CSS_LOADER_EXPORT___;
其实最后 css-loader 输出的是一串字符串,上面我把格式解析了下,可以看到我们的 css 代码拼接成了字符串,然后加到了 __CSS_LOADER_EXPORT__ 中,最后用 ES module 导出。然后 test.css 中导出的 b.css 和 c.css 文件,使用 webpack loader 的内联语法 处理了。
css-loader 的输出之后会由 style-loader 处理,最后将样式默认以 <style></style> 标签的方式插入到 <head> 标签中,多个样式文件对应多个 style 标签。
importLoaders 配置
当遇到 @import 语法,CSS modules and ICSS imports 时,默认会用 css-loader 处理,在 css-loader 前执行的 loader 就不会再回头执行了,如果配置了 importLoaders number类型,例如配置了 n,就会用 css-loader 前的 n 个 loader 去处理,然后再用 css-loader 处理。
下面我们演示下具体的例子:
// webpack.config.js
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
{
loader: 'css-loader',
options: { importLoaders: 1 },
},
{
loader: 'postcss-loader',
options: {
postcssOptions: {
plugins: [
[
"autoprefixer",
],
],
},
},
}
]
}
]
}
当我们以上面的 webpack 配置进行打包时,我们查看打包产物 bundle.js:
我们发现对于使用
@import 导入的 b.css 和 c.css 文件,使用了 css-loader 和 postcss-loader 来处理。
如果将 importLoaders 配置注释掉,我们再看:
会发现只会使用 css-loader 去处理这两个文件。
这样就体现了 importLoaders 配置的用法和作用。
仅供参考