
No more than code.
loader 是在 Webpack 中作用于指定格式的资源文件并将其按照一定格式转换输出。例如:less-loader 将 less 文件转换为 css 文件输出。
单一职责,一个 Loader 只做一件事情,正因为职责越单一,所以 Loaders 的组合性强,可配置性好。
loader 支持链式调用,上一个 loader 的处理结果可以传给下一个 loader 接着处理,上一个 Loader 的参数 options 可以传递给下一个 loader,直到最后一个 loader,返回 Webpack 所期望的 JavaScript。
rules: [ { test: /\.css$/, use: ['style-loader', 'css-loader']}],
Rule.test 筛选资源,符合条件的资源让这项规则中的 loader 处理,值可以是字符串、正则表达式、函数、数组。
test: path.resolve(__dirname, 'src/css');
test: function (path) { return path.indexOf('.css') > -1 }
test: [/\.css$/, path.resolve(__dirname, 'src/css')];
Rule.include 符合条件的资源让这项规则中的 loader 处理,用法和 Rule.test 一样。
Rule.exclude 符合条件的资源要排除在外,不能让这项规则中的 loader 处理,用法和 Rule.test 一样。
Rule.issuer 用法和 Rule.test 一样,但是要注意是匹配引入资源的文件路径,如在 main.js 中引入 css/index.css
// Rule.issuer 和 Rule.test、Rule.include 、Rule.exclude同时使用时候,也是“与”的关系。
issuer: /\main\.js$/,
//issuer: path.resolve(__dirname, 'main.js'),
//issuer: [/\main\.js$/ , path.resolve(__dirname, 'main.js')],
//issuer:function (content) {
//return content.indexOf('main.js') > -1
//}
Rule.resource 筛选资源,符合条件的资源让这项规则中的 loader 处理。但配置 resource 选项后,test、include、exclude 选项不能使用。issuer 选项不生效。 resource 选项中有以下子选项:
rules: [
{
resource:{
test:/\.css$/,
include: path.resolve(__dirname, 'src/css'),
exclude: path.resolve(__dirname, 'node_modules'),
},
use: ['style-loader', 'css-loader']
},
],
Rule.resourceQuery 匹配资源引入路径上从问号开始的部分。例import './ass/main.css?inline'
,要匹配?inline:
resourceQuery:/inline/,
Rule.use ·use: ['style-loader']
其实是 use: [ { loader: 'style-loader'} ]
的简写。
use 的值还可以是函数,返回一个数组,参数为 info,info 中有以下内容
use: (info) => {
return ['style-loader', { loader: 'css-loader' }];
};
Rule.loader loader: 'css-loader'
是 use: [ { loader: 'css-loader'} ]
的简写。
rules: [{ test: /\.css$/, loader: 'css-loader' }];
Rule.oneOf 当规则匹配时,只使用第一个匹配规则。例如说要处理 css 文件资源时,one.css 要用 url-loader 处理,two.css 要用 file-loader 处理。可以用 Rule.oneOf 来配置
rules: [
{
test: /\.css$/,
oneOf: [
{
resourceQuery: /one/, // one.css?one
//test: /one\.css/,
use: 'url-loader',
},
{
resourceQuery: /two/, // two.css?two
//test: /one\.css/,
use: 'file-loader',
},
],
},
];
从右到左,从下到上执行。换句话来说,就是后写的先执行,跟栈一样后进先出,例如:
use: ['style-loader', 'css-loader', 'less-loader'];
// 以上配置中,less-loader先执行,再执行css-loader,最后执行style-loader
控制 loader 的执行顺序 用 Rule.enforce 来控制,其有两个值:pre:优先执行;post:最后执行
rules: [
{ test: /\.less$/, loader: 'less-loader', enforce: 'pre' },
{ test: /\.less$/, loader: 'css-loader' },
{ test: /\.less$/, loader: 'style-loader', enforce: 'post' },
];
// 此时,less-loader先执行,再执行css-loader,最后执行style-loader。
参考链接