前面我们了解了 webpack 的output
和entry
。但是 webpack 自带的能力只能处理js
和json
文件,要想处理其他文件,那么就必须要用到loader
。
接下来继续了解一下 webpack 如何使用loader
处理 js,json 以外的文件的。
上面我们也提到loader
是用来处理js
,json
之外的文件,将他们转换为有效的模块。那么接下来就看一下 loader 是如何工作的。
使用 loader 有两种方式:
// webpack.config.js
module.exports = {
mode: 'development',
entry: getEntry,
output: {
filename: '[name].bundle.js',
chunkLoadingGlobal: 'var test1 = 111',
},
module: {
rules: [
{
test: /\.css$/,
use: [{ loader: 'style-loader' }, { loader: 'css-loader' }],
},
],
},
};
上面代码中,module
字段作用是决定 webpack 在项目中如何处理不同类型的模块。[module 完整配置]。loader
,注意一点:loader 的执行顺序是从下往上
执行。import Styles from 'style-loader!css-loader?modules!./styles.css';
介绍了 loader 如何使用,那么接下来介绍一下如何编写一个 loader。
// entry.js
function test1() {
console.log('test1');
console.log(inject);
}
test1();
// entry1.js
function test2() {
console.log('test2');
console.log(inject);
}
test2();
// loader/inject.js
module.exports = function (source) {
console.log(source);
return `
var inject = 'inject code';
${source}
`;
};
// webpack.config.js
const path = require('path');
module.exports = {
mode: 'production',
entry: {
app: path.resolve(__dirname, 'src', 'entry.js'),
lib: path.resolve(__dirname, 'src', 'entry1.js'),
},
output: {
filename: '[name].bundle.js',
},
module: {
rules: [
{
test: /\.js$/,
use: [{ loader: path.resolve(__dirname, 'loader', 'inject') }],
},
],
},
};
执行 webpack 后输出
// app.bundle.js
console.log('test1'), console.log('inject code');
// lib.bundle.js
console.log('test2'), console.log('inject code');
inject code
的变量,打包后变量都注入到了所有test匹配到的文件中。字符串
形式输出,在拿到文件数据后,我们就可以针对数据进行修改或者扩展,最后将处理后的数据 return 出去。接下来了解一下 loader 的特性,根据特性我们可以写一些更加复杂的 loader。
本节主要讲了 webpack 基本配置中的loader
loader
是用于处理 webpack 自身不能处理的文件的,理论上通过编写 loader 可以处理所有文件。loader
是一个函数,入参是一个匹配到的文件的字符串,输出的是处理后的数据(字符串)。loader
具有链式调用;同步/异步调用;在 node 中执行,可以进行任何操作的特性。