You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
// A JavaScript class.classMyExampleWebpackPlugin{// Define `apply` as its prototype method which is supplied with compiler as its argumentapply(compiler){// Specify the event hook to attach tocompiler.hooks.emit.tapAsync("MyExampleWebpackPlugin",(compilation,callback)=>{console.log("This is an example plugin!");console.log("Here’s the `compilation` object which represents a single build of assets:",compilation);// Manipulate the build using the plugin API provided by webpackcompilation.addModule(/* ... */);callback();});}}
loader 和 plugin 的区别
两者的区别可以从下面几点分析:
概念上
引用 webpack 官网 关于 loader 和 plugin 的解释:
loader 的概念相对容易理解。插件的就比较拗口,其实插件就是暴露了 webpack 整个打包构建生命周期 中的钩子给我们订阅,方便我们监听整个打包过程
用法上
loader
有两种方式使用 loader:
配置文件。loader 有两个属性:
内联方式
在每个 import 语句中显式指定 loader
plugin。
只需要引入对应的 plugin,然后在 plugins 数组中 new 一下即可
执行顺序
plugin
plugin 的执行时机和 webpack 钩子或者其他插件的钩子有关,本质上利用的是 Tapable 定义的钩子。webpack 提供了各种各样的钩子,可以看这里。因此如果想要熟练开发 webpack 插件,一定要对 Tapable 用法比较熟悉。我手写了 Tapable 所有的钩子,解读了 Tapable 的源码,并提供了使用 Demo,具体可以看这里
loader
默认情况下,loader 按照我们在配置文件中配置的
module.rules
从下往上,从右到左依次执行。但是可以通过enforce
以及inline loader
修改 loader 的执行顺序。loader 的分类
按执行顺序,loader 可以这么划分:
enforce
被设置成pre
的 loaderenforce
被设置成post
的 loaderenforce
属性的普通 loaderloader 的执行顺序
默认情况下,loader 按照我们在配置文件中配置的
module.rules
从下往上,从右到左依次执行。实际上,loader 会按照下面的顺序执行:
preLoader
normal loader
inline loader
postLoader
inline loader
的使用方式不同,也会改变 loader 的顺序,这又引入了新的复杂度,可以点击这里查看inline loader
前面只有!
号,则文件不会再通过配置的normal loader
解析inline loader
前面有!!
号,则表示文件不再通过其他 loader 处理,只经过 inline loader 处理。inline-loader
前面有-!
,则不会让文件再去通过preLoader
以及normal loader
解析,但还是会经过postLoader
解析执行顺序这块建议动手实践一下
如何开发 loader 和 plugin
loader
记住,loader 只能是普通函数,不能是箭头函数,因为 webpack 在运行 loader 时,会往我们的 loader 中注入 loaderContext 上下文,可以点击这里查看。因此 loader 函数中的 this 是有意义的,不能使用箭头函数。
loader 的组成
loader 包含两部分,pitchLoader 和 normalLoader,pitch 和 normal 的执行顺序正好相反
normal loader2 -> normal loader3
建议动手实践方便比较 pitch loader 和 normal loader 的关系。目前我们用的
style-loader
就使用了pitch loader
,具体可以查看我手写的 style-loaderplugin
plugin 是一个类,其中必须实现一个 apply 方法,apply 方法接收 webpack 的 compiler 对象,从中可以定义插件自己的钩子或者订阅其他插件的钩子
源码上
从 webpack 调用 loader 以及 plugin 的时机简单介绍
loader
loader 的调用在lib/NormalModule中。
webpack 在打包我们的源码时,会从入口模块开始构建依赖(主要流程在 Compilation.js 中)。对每一个文件都会依次执行下面的顺序:
可以看出,loader 的执行在依赖解析之前完成
plugin
plugin 的调用时机就比较灵活。实际上 webpack 在整个生命周期都会调用相应的钩子。比如
假设有个需求,需要分析都有哪些文件引用了
product.js
这个文件,此时就可以使用resolvers
钩子。总结
综上可以看出,虽然 loader 的分类,组成,用法比较多样,但是只要理解了这些差异,就能轻松的开发自己的 loader。
plugin 的组成,用法比较单一,但是如果要自己开发的话还是有难度的。因为需要理解 webpack 在整个生命周期过程中都暴露了哪些钩子,怎么结合自己的业务需求去使用对应的钩子。
The text was updated successfully, but these errors were encountered: