问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

lerna+dumi+eslint多包管理实践

发布网友 发布时间:2024-09-17 05:00

我来回答

1个回答

热心网友 时间:2024-09-29 15:03

背景

在开发大型项目时,我们通常会遇到同一工程依赖不同组件包,同时不同的组件包之间还会相互依赖的问题,那么如何管理组织这些依赖包就是一个迫在眉睫的问题。

我们目前已有的方案有:Multirepo(多个依赖包独立进行git管理)和Monorepo(所有依赖库完全放入一个项目工程).

Multirepo的缺点在于每个库变更之后,需要发布到线上,然后在项目中重新安装,打包,发布,最后才能更新,这样如果依赖关系越复杂就越难以维护。Monorepo最大的缺点就是不便于代码的复用和共享。

为了解决上述的问题,lerna这款工具诞生了,它可以方便的管理具有多个包的JavaScript项目。同时对于组件包的开发者和维护者,为了让团队其他成员更好的理解和使用我们开发的组件,搭建组件文档和demo就显得格外重要.

我们对以上提到的几点问题做一个总结:

大型项目中如何管理组织依赖包及其版本问题

如何高效低成本的搭建简单易用的组件文档

如何配置eslint代码规范和代码提交规范

接下来我将针对以上问题一一来给出解答.如果大家想看实际的案例,可以参考:

best-cps|基于lerna+dumi搭建的多包管理实践

大型项目中如何管理组织依赖包及其版本问题

这个问题主要用我上面的提到的lerna工具来解决.目前我们比较熟悉的babel,create-react-app,vue-cli等都使用了lerna.

在没使用lerna时,我们不同库的组织形式可能如下:

使用lerna之后的库组织结构:

以上两个是我做的简图,基本可以对比出使用lerna前后的差异,lerna的作用是把多个项目或模块拆分为多个packages放入一个git仓库进行管理。我们可以使用它提供的命令轻松的对不同项目进行管理,如下:

lernaboostrap自动解决packages之间的依赖关系,对于packages内部的依赖会直接采用symlink的方式关联

lernapublish依赖git检测文件改动,自动发布,管理版本号

lernacreate创建一个lerna管理的package包

lernaclean删除所有包下面的node_modules目录,也可以删除指定包下面的node_modules

同时lerna还会根据git提交记录,自动生成changelog.当然lerna还提供了很多有用的命令,大家感兴趣可以在官网学习.

接下来我就带大家从零搭建一个使用lerna管理的多包项目.

上图是我们包的依赖关系,首先我们需要全局安装一下lerna.

项目初始化$gitinitbest-cps&&cdbest-cps$lernainit创建三个package$lernacreateLibA&&lernacreateLibB&&lernacreateBaseUI

创建的每个包的目录结构如下:

LibA├─tests│└─dooring.test.js├─lib│└─dooring.js├─README.md└─package.json安装对应包的依赖

由上文展示的3个包的依赖关系,我们需要针对性的安装,如下:

$lernaaddLibA--scope=LibB

因为LibB依赖LibA,所以我们使用lernaadd时可以通过--scope来指定安装范围.再比如BaseUI同时依赖LibA,LibB两个包,我们可以使用如下命令:

$lernaaddLibALibB--scope=BaseUI

剩下的我们都可以按照上述的方式进行,当我们编写完对应包的代码后,我们还可以使用:

$lernapublish

一键将包发布到npm上,此处根据我们选择的管理模式不同,所有packages的版本号都会根据lerna.json中的版本号进行更新。但我们需要注意的是lerna版本更新支持两种模式:

固定/锁定模式(默认,指定版本号)

这种模式自动将所有packages包版本捆绑在一起,对任何其中一个或者多个packages进行重大改动都会导致所有packages的版本号进行更新。

独立模式(independent)

独立模式,init的时候需要设置选项--independent。这种模式允许使用者对每个package单独改变版本号。每次执行lernapublish的时候,针对所有有更新的package,会逐个询问需要升级的版本号,基准版本为它自身的package.json里面的版本号。这种情况下,lerna.json的版本号不会变化,默认为independent。我们可以在lerna初始化时指定:

lernainit--independent

具体的案例可以参考:https://github.com/MrXujiang/best-cps

如何高效低成本的搭建简单易用的组件文档

对于组件文档,市面上也有很多开源的工具,比如vue-press,storybook,docz等,因为我最近的项目多为react,这里我使用的是dumi.之前在分享实现滑动验证码组件的时候已经和大家分享的dumi的使用,大家可以参考我之前的文章:

从零开发一款轻量级滑动验证码插件

以下是在lerna项目中集成dumi后的文档站点效果:

如何配置eslint代码规范和代码提交规范

eslint代码规范我想每个朋友都不陌生,我们只需要安装对应的插件并编写对应规则的配置文件即可,这里举一个简单的例子:

//.eslintrc.jsmodule.exports={extends:[require.resolve('@umijs/fabric/dist/eslint')],rules:{'import/no-extraneous-dependencies':0,'import/no-unresolved':0,},};

配置好之后我们需要设置检测时机,比如说时运行时检测还是提交时检测,由于个人习惯和效率问题,我采用了提交时检测,也就是当开发者功能开发完成,执行gitcommit的时候进行检测,我们可以利用githook来做预提交检测,这里需要在package.json文件中添加如下命令:

"gitHooks":{"pre-commit":"npmrunlint:js"},

配置好之后我们随便写一行不合规范的代码,然后提交,终端会显示如下信息:

从控制台可以发现代码不合规范的位置和原因,如果我们没有做出调整,代码就无法提交,通过这样的方式可以提高代码质量和出错概率,非常有长远价值.

同时上面提到了githooks,对于githooks的知识也非常有意思,它可以帮我们在代码提交的不同阶段进行自定义操作,比如代码提交前的检测,代码提交信息规范等进行校验,常用的gtihooks有:

pre-commit

prepare-commit-msg

commit-msg

post-commit

pre-rebase

post-merge

pre-receive

update

大家感兴趣的可以访问https://githooks.com获取更多有关githooks的内容.

对于代码提交规范,我们也需要做统一管理,这样能让团队更直观的知道每一次提交的内容是什么,尤其是多人协作的时候.以下是几个常见的提交不规范的例子:

gitcommit-m'添加弹窗'gitcommit-m':update更新'gitcommit-m'fix修复一个bug'

之所以会存在以上提交格式不统一或者提交信息难懂的问题,都是因为缺少了规范的制约,所以说对于大型项目或者多人协作的项目,最好还是统一规范,这样能提前避免很多不必要的麻烦.

要想实现对工程师提交信息的检测,需要用到commit-msg这个githooks,具体配置如下:

$lernacreateLibA&&lernacreateLibB&&lernacreateBaseUI0

剩下的就是commitlint.js做的事情了,它是我编写的一个nodejs脚本,用来检测用户提交的信息是否规范,当然大家也可以基于这个脚本定义自己的提交规范,具体效果如下:

我们可以看到,当我们提交了一个不符合规范的信息之后,终端控制台会打印如下提示信息并终止程序继续进行.

通过以上的配置,团队不同成员的写的代码和提交信息都会非常统一和规范,项目整体的质量也会得到一定的提升.

最后

如果大家对可视化搭建或者低代码/零代码感兴趣,也可以参考我往期的文章或者在评论区交流你的想法和心得,欢迎一起探索前端真正的技术。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
电视般有哪些尺寸 电视有哪些尺寸 寓意生命力顽强的男孩名字 美国产生金融危机了,铁矿石回降价吗? 铁矿石什么情况下会跌 从生物学的角度看,随地吐痰的主要危害是什么 随地吐痰会给我们带来什么样的危害? 痰是怎样形成的,随地吐痰有哪些危害 得力挂钟为什么不走了 人民大学、外交学院、中国政法、北京大学、复旦、华东政法等大学法学... 孩子感冒了应该挂什么科室 小儿病毒咽喉炎吃什么药好 小儿有点发热,眼屎有一些,几天了,吃什么药好? 小儿流黄鼻涕吃什么药 网上出现那些什么省钱的软件的在淘宝上买东西很便宜是不是真的会不会... 如何判断皮鞋是不是真皮的? 油电混合车要充电的吗? 电脑显示器不亮 电源是有的 电脑插上电了。为什么显示器不亮?显卡的那线插严了。显示器也开了。电 ... 伏格列波糖片伏格列波糖片 22年考研21年1月份备考晚吗 考研哪些个阶段 什么时候准备考研最好呢? 法语德语西班牙语哪个好学 法语和西语哪个难 西语 法语 哪个难 哪个小语种好学一点 搬家拿什么东西代表搬家买什么东西比较吉利? 一只耳朵听力是好的,一只耳朵听力不好,这种情况应该不需要两只耳朵都配... 圆的中考常见题型有哪些? django中如何实现轮播图(java轮播图怎么实现) 女性严重缺维生素d的症状 童心未泯造句 珠宝鉴定哪个专业 孩子缺乏维生素D 有哪些症状? 在excel中数字双击一下才会计算结果,怎么办? 求高二课本赤壁赋的重点背诵句子! 如何使用Camtasia制作游戏直播高能短视频 中央电视台春节联欢晚会是哪一年开始使用一号演播大厅的 3米长,3米高,3米宽用多大的排气扇 急!!!寻上海哪里有卖飞机模型的 上海哪里有航模飞机实体店? 长3米宽3米高3米,24墙,需要多少红砖 惠普M1005提示卡纸怎么办 哔哩哔哩知乎永久封号如何解封? 哔哩哔哩账号封禁是什么意思? 电脑用360修复后重启,画面定格在windows无法开机 公婆偏心小儿子,经常出去帮工,还有一个八十多岁的它们的母亲,它们什 ... 公婆都不会管他儿子欠的钱吗,公婆这么有钱,也不管 ...经济还是孩子从来没管过,他们只过自己的,为什么老人不愿意帮...