loader就是一个转换函数,输入原始文本,输出转换后的文本,例如简单实现ts-loader
const ts = require('typescript')
// normal方法
module.exports = (source) => {
return ts.transpile(source).outputText
}
// pitch方法
module.exports.pitch = (source) => {
// 这里如果返回了值,就会停止向右pitch,开始向左执行normal
// return source
}
webpack本身就是基于事件机制的,包含了很多内置插件,这些插件都是基于事件订阅来执行的。一个简单的插件如下:
class MyHtmlPlugin {
constructor(options) {
// 从参数拿到html模板
this.templateContent = options.templateContent
}
apply(compiler){
const self = this
// 监听emit事件
compiler.hooks.emit.tapAsync('MyHtmlPlugin', (compilation, callback) => {
// 往assets列表添加一个index.html
compilation.assets['index.html'] = {
source() {
return self.templateContent
},
size() {
// 返回文件字节大小
return this.source().length
}
}
callback()
})
}
}
module.exports = MyHtmlPlugin;
常用事件: