webpack之旅: 深入理解Plugin

Violet ·
更新时间:2024-11-13
· 785 次阅读

上次我们深入介绍了Loader的相关的内容,今天我将带大家深入看看Plugin插件的内容: 首先我们回顾一下Plugin具体是什么: plugin是插件,它是类似生命周期的一些东西,当webpack在进行打包的时候去对打包做一些具体的处理。 我们之前说plugin的时候也说到了,plugin插件的底层是一个类,它会在webpack打包的某一时刻被执行。那么我们现在就开始带大家去编写一个Plugin插件类: 我们首先创建一个叫做copyright-webpack-plugin.js的文件; 在文件中创建一个js类: class CopyrightWebpackPlugin { constructor(options){ this.name = options.name || "" } }

**注: 我们这里定义了一个CopyrightWebpackPlugin的类,在类的构造函数中可以接受到一个options参数,这个参数就是在使用这个插件是传递进来的配置参数项, 我们拟传递一个name值用于加到文件的末位
3. 现在Plugin的关键来了: 我们说可以将plugin理解为webpack打包的一些生命周期,那么它是如何在webpack打包的某一个时刻去进行运行的呢?现在我就来揭晓这个答案:在plugin插件类中需要去执行一个apply函数,该函数可以接受到一个compiler参数,该参数表示的是一个webpack打包编译过程中的编译对象,当我们需要在webpack打包的某一个时刻去运行这个plugin时我们就可以使用这个编译对象上的compiler.hooks,它表示的是webpack执行中的一些钩子,里面就包含了webpack执行打包的某些时刻。此时我们就可以在这些时刻去对webpack的打包做一些事情。

class CopyrightWebpackPlugin { constructor(options){ this.name = options.name || "" } apply(compiler){ compiler.hooks.compile.tap("CopyrightWebpackPlugin", (compiler) => { console.log("compile") }) } }

**注: 这里我们使用了一个tap()方法,他表示的是使用的是同步执行的钩子,而我们需要在plugin中执行异步的操作时,可以使用的就是tapAsync()方法。tap()方法的参数compilation表示的是此次打包的对象。
4. plugin中执行异步的操作:我们上面说到的comilation参数是为webpack打包的一个对象,此次打包的一些内容我们可以在compilation.assets中获取到,当然我们需要往打包的文件中加入一些内容我们也可以直接往compilation.assets中去加入内容即可, 当我们使用tapAsync()这个异步的钩子执行异步操作时,tapAsync()比tap()函数多一个callback参数,该参数是一个函数,并且我们需要在异步的操作执行结束后手动的调用一下这个函数,它用于告知webpack异步的操做什么时候执行结束。

class CopyrightWebpackPlugin { constructor(options){ this.name = options.name || "" } apply(compiler){ compiler.hooks.compile.tap("CopyrightWebpackPlugin", (compiler) => { console.log("compile") }) } const self = this compiler.hooks.emit.tapAsync("CopyrightWebpackPlugin", (compilation) => { compilation.assets["bundle.js"] = { source: function(){ return `copyright by ${self.name}`, size: function(){ return 50 } } } }) }

**注:我们在这里使用compilation.assets对bundle.js文间进行处理,此时我们它赋值了一个对象,source参数表示我们将要写入到文件中的内容,size属性表示的是写入文件的大小

好了,到这里我们基本的关于plugin的底层的大致东西就给大家说了一个大概,当然plugin的实现还有很多的内容,像compiler参数,compilation参数上也还有很多的属性方法,这些就需要大家去官方文档上看看了,但是它具体是怎么处理webpack打包文件的我想流程大家应该还是有个概念了吧。最后这里我还是为大家附上一个官网关于plugin Api的地址,大家可以去产看哦~~~~
Plugin API官网地址


作者:一树梨花



plugin webpack

需要 登录 后方可回复, 如果你还没有账号请 注册新账号