当前位置: 首页 > Web前端 > HTML

一个webpack插件,希望对大家有帮助

时间:2023-04-02 19:30:17 HTML

有梦想,有干货,微信搜索【大千世界】关注这位凌晨还在洗碗的洗碗智慧。本文已收录到GitHubhttps://github.com/qq449245884/xiaozhi,里面有完整的测试站点、资料和我的一线厂商访谈系列文章。最近,我陆续开发了一个UniUsingComponentsWebpackPlugin插件(下面介绍),这是我的第三个开源项目。希望大家一起维护,一起出演。另外两个:vue-okr-tree是基于Vue2的组织结构树组件地址:https://github.com/qq44924588...ztjy-cli团队的一个简单的模板初始化脚手架地址:https:///github.com/qq44924588...UniUsingComponentsWebpackPlugin地址:https://github.com/qq44924588...配合UniApp,用于集成小程序原生组件。配置第三方库后,可以自动导入其下的原生组件,无需手动配置。在生产和构建过程中可以自动淘汰未使用的原生组件。背景第一个痛点是使用在uniapp中开发小程序的朋友应该知道,当我们要在uniapp中使用第三方UI库(vant-weapp、iView-weapp)时,如果要全局使用,需要添加它们要在src/pages.json中使用usingComponents对应的组件声明,如://src/pages.json"usingComponents":{"van-button":"/wxcomponents/@vant/weapp/button/index",}但是在开发过程中,我们并不是很清楚需要哪些组件,所以可能会全部声明(PS:这个在做公共库的时候比较常见),所以要一个一个的写。作为程序员,我们绝对不允许使用这种愚蠢的方法。这是第一个痛点。第二个痛点使用第三方组件。除了src/pages.json,还需要在对应的生产目录下创建wxcomponents,并将第三方库复制到这个文件中。这是uniapp定制的。详情参见:https://uniapp.dcloud.io/fram…。这是第二个痛点。第三个痛点和第二个痛点,我们把整个UI库复制到wxcomponents中,但是最终发布的时候,我们不太可能用到里面所有的全局组件,所以我们也发布了不必要的组件,增加了代码量.有的朋友会觉得,把第三方库复制到wxcomponents中,就复制用过的那个就行了。确实如此,但是组件中可能还用到了其他的组件,我们得一个一个看,再一个一个介绍,这又回到了第一个痛点。有了这三个痛点,就必须有一个插件来做这些蠢事,对付这三个痛点。于是就有了UniUsingComponentsWebpackPlugin这个插件。这个webpack插件主要解决以下问题:配置第三方库后,可以自动导入其下的原生组件,无需手动配置。不使用的原生组件可以在生产和构建过程中自动淘汰。webpack插件webpack插件体系是基于Tapable的强耦合架构。当它在特定时间触发一个钩子时,它会附加足够的上下文信息。在插件定义的钩子回调中,它可以也只能与这些上下文背后的数据结构和接口进行交互。sideeffect,进而影响编译状态和后续流程。从形态上看,插件通常是一个带有apply函数的类:并传入编译器对象compiler,插件开发者可以以此为起点到达webpack中定义的任何钩子,例如:)=>{})}}注意核心语句compiler.hooks.thisCompilation.tap,其中thisCompilation是tapable仓库提供的hook对象;tap是用于注册回调的订阅函数。webpack的插件体系是基于tapable提供的各种hooks,所以有必要熟悉一下tapable提供的hooks的种类以及各自的特点。至此,我就不继续介绍了。有关插件的更多详细信息,您可以访问官方网站。这里我推荐《Webpack 插件架构深度讲解》https://mp.weixin.qq.com/s/tX作者Tecvan。实现思路UniUsingComponentsWebpackPlugin插件主要使用了三个编译器钩子。第一个钩子是environment:compiler.hooks.environment.tap('UsingComponentsWebpackPlugin',async()=>{//todosomeing});该钩子主要用于自动引入其下的原生组件,从而无需手动配置。解决第一个痛点。第二个hookthisCompilation可以获取编译并在最终打包后的产品上运行:',async(cb)=>{awaitthis.copyUsingComponents(compiler,compilation);cb();});});所以这个hook用来将node_modules下的第三个库拷贝到我们生产的dist目录下的wxcomponents,解决了第二个痛点。ps:这个也可以直接用现有的copy-webpack-plugin插件实现。第三个钩子完成了,说明编译执行完成:deleteNoUseComponents();回调();});}执行完成后,意味着我们已经生成了dist目录,我们可以读取文件内容,分析,获取使用了哪些组件,然后删除未使用组件对应的文件。这将解决我们的第三个痛点。PS:这里我判断只有在生产环境才会去掉,开发环境不会去掉,也没有必要。使用npminstalluni-using-components-webpack-plugin--save-dev安装并将插件添加到您的WebPack配置中。例如:constUniUsingComponentsWebpackPlugin=require("uni-using-components-webpack-plugin");module.exports={plugins:[newUniUsingComponentsWebpackPlugin({patterns:[{prefix:'van',module:'@vant/weapp',},{prefix:'i',module:'iview-weapp',},],})],};注意:uni-using-components-webpack-plugin只适用于UniApp开发的小程序。参数NameTypeDescriptionpatterns{Array}指定插件的相关Patternsmodulepfix模块名称。组件前缀模块是指package.json中的名称。如果你使用Vant,对应的模块是@vant/weapp。如果使用iview,对应的模块就是iview-weapp,具体见各自的package.json。prefix是指组件的前缀。例如,Vant使用以van开头的前缀,而iview使用以i开头的前缀。具体可以看各自的官方文档。PS:这里不得不说一下vant,要求别人用van前缀,然后在自己的组件中声明子组件不用van前缀,比如picker组件。里面的json文件是这样写的:{"component":true,"usingComponents":{"picker-column":"../picker-column/index","loading":"../loading/index"}}picker-column和loading没有加van前缀,因为对于这个问题,在自动剔除功能中,我是根据前缀判断使用哪些组件。因为这里的loading并没有给picker-column加前缀,所以会被删除,导致最后的picker无法使用。为了解决这个问题,增加了很多工作。希望Vant正式版能优化一下。总结本文常见的自定义Webpack插件,实现一些日常的技术优化需求。主要介绍了Webpack插件的基本组成和简单结构,通过三个痛点介绍了uni-using-components-webpack-plugin插件,介绍了使用方法和实现思路。最后,关于Webpack插件开发,还有更多的知识需要学习。建议多看官方文档《Writing a Plugin》进行学习。代码部署后可能存在的bug,无法实时获知。事后为了解决这些bug,花费了大量的时间在日志调试上。顺便推荐一个好用的bug监控工具Fundebug。交流有梦想,有干货,微信搜索【大千世界】关注这位凌晨还在洗碗的洗碗智者。本文GitHubhttps://github.com/qq44924588...已收录,有完整的测试站点、资料和我的一线厂商访谈系列文章。