webpack之plugin编写 -- 从html-webpack-plugin源码的角度来看如何编写plugin
准备写个webpack的plugin,打开官网文档https://www.webpackjs.com/contribute/writing-a-plugin,发现有点蒙圈,看完文档好像知道怎么写,但又写不出来,所以看下html-webpack-plugin的实现,从而整体了解下插件的整体流程
一、html-webpack-plugin源码分析
1.插件的作用
这个插件都用过,它的作用可以概况为两类:
- 生成html页面
- 处理bundle.js
2.结合plugin 的编写步骤分析html-webpack-plugin的实现
2.1流程步骤
webpack文档的步骤:
根据文档步骤可以写出一下代码:
这就一个plugin插件的雏形,这个光看文档也能写出来,所以看源码的主要目的是看第4步,即如何处理webpack内部实例的特定数据
2.2需要了解的钩子
a.compiler
www.webpackjs.com/api/compile…
github.com/webpack/web…
它是扩展自tapable类,用来注册和调用插件,tapable的用法有篇博客专业介绍,这里不再说了,简单来说就是compiler扩展与tapable,抛出一系列的生命周期钩子函数,以便我们在webpack的不同编译阶段进行不同的操作
本次主要关注 emit钩子
b.compilation
www.webpackjs.com/api/compila…
github.com/webpack/web…
它可以理解为webpack编译一次生成的整个编译资源,一个 compilation 对象表现了当前的模块资源、编译生成资源、变化的文件、以及被跟踪依赖的状态信息。compilation 对象也提供了很多关键时机的回调,以供插件做自定义处理时选择使用。本次主要关注 assets
2.3html-webpack-plugin如何处理数据
a. 如何生成html
1.插件调用:
当插件调用的时候会传入html 的 template以及filename
getFullTemplatePath() 会判断模板是否配置了loader,如果没有配置会使用默认的loader
2.index.html生成过程:
到这里其实index.html已经加载了,childCompilation.assets[outputName].source() 返回的就是index.html编译之后的源码,下一步就是把所有的打包文件添加到index.html中
3.将生成的资源文件(js/css)插入html
处理chunks
compilation的assets是map对象,html-webpack-plugin会先将assets的chunks处理一下,便于后期插入
这里使用node的vm(虚拟机)来构建index.html源码,source 其实就是上一步生成的compilationPromise
generateHtmlTags()根据assets中js和css生成要插入html的head和body,assets是从compilation.getStats()获取并整理处理的 chunks对象
injectAssetsIntoHtml()函数就是将处理过的body和header插入index.html中
最后一步就是将已经插入资源的index.html加入到compilation的assets中,便于webpack打包生成文件
然后再去看webpack官网plugin编写的案例:
最后本地调试插件:
本地开发完npm发布就行
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 模板不会安装或需要功能定制以及二次开发?
发表评论
还没有评论,快来抢沙发吧!