在学习 webpack 的自定义 loader 时,遇到了两段代码没理解,导致不理解webpack的执行原理,
不理解1:
this.callback(null, content, map, meta)
不理解2:
const callback = this.async()
setTimeout(() => {
callback(null, content, map, meta)
}, 1000)
以上两段代码是啥作用,如何理解,执行情况是什么
webpack.config.js
const path = require("path")
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './dist'),
filename: 'js/[name].js',
clean: true
},
module: {
rules: [
{
test: /\.js$/,
use: [
"./loaders/demo/test1",
"./loaders/demo/test2",
]
}
]
},
plugins: [
new HtmlWebpackPlugin({
template: path.resolve(__dirname, './public/index.html')
}),
],
mode: 'development'
}
test1.js
// 同步 loader
/*
* loader就是一个函数
* 当webpack解析资源时,会调用相应的loader去处理
* loader接受到文件内容作为参数,返回内容出去
* content 文件内容
* map SourceMap
* meta 别的 loader 传递的数据
* */
module.exports = function (content, map, meta){
console.log('test1');
/*
* 第一个参数: err 代表是否有错误
* 第二个参数: content 处理后的内容
* 第三个参数: source-map 继续传递 source-map
* 第四个参数: meta 给下一个 loader 传递参数
* */
this.callback(null, content, map, meta)
return content
}
test2.js
// 异步 loader
module.exports = function (content, map, meta){
const callback = this.async()
setTimeout(() => {
console.log('test2');
callback(null, content, map, meta)
}, 1000)
}
不理解为什么是这样输出,可以推荐这方面的解答
this.async() 是异步方法 callbalck是回调函数
setTimeout(() 里的代码都是异步 所以 要用 async 。 const callback = this.async()这个就是 把callback 定义成 异步函数