@z-utils组 重构和自动化实现


highlight: monokai
theme: github

包简介

  • @z-utils组 是一个可以在vue/react/pure js 中使用的工具包,它包含三个子类,分别为 @z-utils/base, @z-utils/react, @z-utils/vue 三个分别在不同区域使用。

  • 他是原 zzy-javascript-devtools 的重构版本,在实现之前所有能力的基础上扩展了其他内容:

  • 对内(开发):

    • 使用rollup重构打包逻辑
    • 全自动化打包生成
    • 自动生成更新日志以及版本号
    • 全自动化生成对应包的readme.md文件
    • 文件分级更加明确
    • 扩展性提升
    • 统一开发格式
  • 对外(使用):

    • 开放cjs模式
    • readmd.md文件更加合理,格式统一
    • 新增对vue的支持,以及纯工具包,避免额外开销(分三个包分别按项目决定用哪个)
    • 未来迭代逐渐开放对hooks函数的支持

目录

  • command:逻辑主体
    • plugins:rollup插件存放
      • recordReadme.ts 获取转译后的 每个文件内的特殊注释
    • generatorFiles.js:文件生成执行内容,生成范围包含:打包后的对外提供工具函数,
    • generatorReadme.js:生成向外提供的readme.md
    • packageControler.js 控制打包后的package.json
    • rollupBuild.js 打包程序
    • start.js 脚本执行文件,记录基本信息
  • common:公共内容
    • constant.js:常量
    • utils.js:公共函数
  • content:对外提供工具函数内容存放路径
  • packages:打包后存放路径
  • readmes: 打包后readme拼接内容预设
    • header.md:头部带拼接内容
    • updates.json:记录每次更新信息,供日志段落拼接
  • typings:被打包内容typings(待使用)
  • example.ts 对外提供工具函数的注释举例,严格按照,否则无法正常生成对应readme内容

接下来主要记录一下这个包的实现过程:

实现

大体思路

  1. 对于原先的拆包(原先包的实现思路:在开发npm包时遇到的一些问题以及解决方法(zzy-javascript-devtools)),我决定直接跳过,在录入方法的时候就以单文件进行,因为在后期的componetns和hooks工具中都有对包的引入,如果前期放一块的话,拆分流程会很复杂,而且单个工具的体量对未来来讲,单文件开发是最合适的。
  2. 拆包结束之后分别打包
  3. 在rollup打包过程中记录每个工具的注释内容,最终连带更新日志组合在一起,生成每个包的readme.md
  4. 生成打包后工具的批量导入代码,写入到入口文件内。
  5. 更新指定mode的package.json中的version。

到这里就结束了,随后发包即可。
ps:第五点的更新是依据最开始打包流程开始时的问询流程,并记录到更新日志内。

具体实现

执行命令

image.png

打包

无论更新还是打包模式,都会走genreatorFiles.init(mode) 函数,内部通过 fast-glob 包获取到指定目录内的所有文件,稍加处理即可进行rollup多入口打包。

image.png

rollupBuild.js:

image.png

  • 注意genreatorFiles通过 GenreatorFiles类 new出来的实例,直接进行导出的,而不是导入后再进行new的,这点很重要。这种写法可以让其他文件引入这个实例时进行数据存储而不会丢失,类似状态存储器。

readme.md生成,组装

目前,包内的readme.md结构分三层:header,updates log,contents

  • header是写死的,简单说明包
updates log
  • updates log 是在 执行命令标题内的图片中,对话式交互内如果是更新,则对当前的更新内容做记录,也是generatorReadme.addUpdateSays(say, level, mode)做的事情。

image.png

生成的内容存放在·readmes/updates.json中:

image.png

  • contents
    contents,也就是方法试例,如果想要自动生成,就得考虑在该目标文件内做文章。
    而能经过每个文件的步骤,就只有打包流程中了,也就是利用rollup打包过程,从中开发自定义插件,在transfrom钩子中处理文件内容。(钩子描述)

在开发插件之前,先要确认如何才能拿到我们想要的内容?
保证不会干扰文件的情况下,注释是最合适的,那么就得在注释中加入一些特殊标识来去有目标的截取我们需要用到的内容:

image.png

转换后的效果就是:

image.png
plugin-recordReadme实现:
image.png
image.png

核心就是根据正则,批量获取,更改,记录。

组装

主要内容都已经记录,最后的组装就很简单了:

image.png

generatorContent方法是将之前记录的注释内容遍历改造为字符串内容。

入口文件生成

这个步骤其实和之前没什么差别,就是多了一个cjs模式内容需要多生成一份

更新版本号

这里主要依赖之前记录下的更新日志(updates.json)的version,如果是字符串就是指定模式更新,数组则是批量更新,值都有,获取然后写入就是了,没什么好说的。

小结

rollup重构这个想法在之前看vite源码的时候就已经在考虑了,如今也终于实现。还顺便实现了一些有趣的功能,还是比较满意的,初版基本上就是这些内容了。
目前还差一些比较重要的能力待后续版本更新:TS类型提示,自动发包
目前包内还没有新增工具函数,在后期迭代过程中会逐渐新增vue/react的相关components以及hooks类型

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/295960.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十八、本地配置Hive

1、配置MYSQL mysql> alter user rootlocalhost identified by Yang3135989009; Query OK, 0 rows affected (0.00 sec)mysql> grant all on *.* to root%; Query OK, 0 rows affected (0.00 sec)mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)2、…

期末加油站-图像处理期末知识点汇总

第三章:图像增强 一、概念 1.图像增强是通过某种技术有选择地突出对某一具体应用有用的信息,削弱或抑制一些无用的信息。 2. 图像增强处理不是无损处理,不能增加原图像的信息。 3. 图像增强按所处理的对象不同可分为: 灰度图像增…

手写MapReduce实现WordCount

水善利万物而不争,处众人之所恶,故几于道💦 文章目录 需求分析编写MapReduce实现上述功能Mapper类Reducer类Driver类 查看输出结果 需求 假设有一个文本文件word.txt,我们想要统计这个文本文件中每个单词出现的次数。 文件内容如下…

蓝牙物联网室内定位系统解决方案

目前国内外室内定位技术较多,常见的有无线局域网(Wireless Fidelity,WiFi)、射频识别(Radio FrequencyIdentification,RFID)、蓝牙低功耗(Bletooth Low EnergyBLE)、超宽带(Ultra Wide BandUWB)技术等。近几年智能设备的迅速发展和蓝牙设备的生产制造成本越来越低&a…

Unity手机移动设备重力感应

Unity手机移动设备重力感应 一、引入二、介绍三、测试成果X Y轴Z轴横屏的手机,如下图竖屏的手机,如下图 一、引入 大家对重力感应应该都不陌生,之前玩过的王者荣耀的资源更新界面就是使用了重力感应的概念,根据手机的晃动来给实体…

案例147:基于微信小程序的酒店管理系统

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

使用vue-qr,报错in ./node_modules/vue-qr/dist/vue-qr.js

找到node_modules—>vue-qr/dist/vue-qr.js文件,搜…e,将…去掉,然后重新运行项目。

Netty 与 RPC(一)

Netty 与 RPC Netty 原理 Netty 是一个高性能、异步事件驱动的 NIO 框架,基于 JAVA NIO 提供的 API 实现。它提供了对TCP、UDP 和文件传输的支持,作为一个异步 NIO 框架,Netty 的所有 IO 操作都是异步非阻塞的,通过 Future-List…

Github 2023-12-23 开源项目日报 Top10

根据Github Trendings的统计,今日(2023-12-23统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目6C项目2C项目1Jupyter Notebook项目1HTML项目1Go项目1非开发语言项目1 免费API集体清单 创建周期…

医疗影像中DR的骨抑制

1 背景 在DR的拍摄中,根据肺部和脊肋骨两种组织,在不同能量X射线的照射下,衰减的系数不同的特点,可以通过两次不同剂量的曝光后,通过算法,得到一张骨骼的图像和一张肺部图像。 通过一些机构的统计&#x…

爬虫字典生成工具,CeWL使用教程

爬虫字典生成工具,CeWL使用教程 1.工具概述2.参数解析3.使用实例1.工具概述 CeWL 是一个 ruby 应用程序,它将给定的 URL 爬到指定的深度,可以选择跟随外部链接,并返回一个单词列表,然后可用于密码破解者 Cewl 是黑客武器库中的强大工具,因为它允许创建有针对性的单词列…

Git常用命令及解释说明

目录 前言1 git config2 git init3 git status4 git add5 git commit6 git reflog7 git log8 git reset结语 前言 Git是一种分布式版本控制系统,广泛用于协作开发和管理项目代码。了解并熟练使用Git的常用命令对于有效地管理项目版本和历史记录至关重要。下面是一些…