2

复杂项目梳理——Yarn monorepo

 3 years ago
source link: https://zhuanlan.zhihu.com/p/364890521
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

复杂项目梳理——Yarn monorepo

俺,只想跪在床上娇喘,不想隔着网线叫唤

halo,大家好,大家好久不贱,真的好久好久

有人说过,当你瞎了的时候,自然就需要眼镜了,我最初进入携程参与工作的时候,我发现携程小程序最大的痛点是“链路问题”

这其实是每个大型项目都存在的问题,就是分包关系复杂,开发,调试,测试,都很难入手,所以当时为了解决这个问题,我写了 wean,wean 是可以完全删减链路的,然后就失败了

wean 太不成熟了,尤其是 runtime 和 native 部分,还需要很长时间的积累

所以我不得不再次回过头来维护旧版本的携程小程序,我不再企图完全简化链路了,我希望能够适当调整,打通链路

monorepo

monorepo 无法删减链路,但他可以理顺链路,就像眼镜,当你瞎了的时候,自然而言地,就需要它了

事实上,monorepo 是最近才火起来的,比如 vue3,sveltekit 等等,实现 monorepo 的方式有很多,比如

lerna => babel
yarn => vue3
pnpm => sveltekit

首先排除的是 lerna,因为在公司内网,lerna 存在很多权限问题,而且因为我们发版是走 cicd 的,也不会使用 lerna 的 publish 规则……

所以剩下的两个方案就是 yarn 和 pnpm 了,实际上这两者区别不大,pnpm 能优雅一点,但是我最终选择的是 yarn,因为……pnpm 好像 cdn 节点不均,在我们公司内网速度实在太慢了

在将整个项目重构为 monorepo 的同时,我做了很多整理工作,比如更好地拆包,比如删除不用的文件和目录,删除不用的依赖……

经过一番战斗,它干净了,能跑了!

# 全局安装
yarn

# 单独安装
yarn core add xxx
 
# 运行 demo
yarn demo start

# 单独构建
yarn core build

webpack5

要知道,所谓的链路过长,其中很大程度源自 webpack,趁着这次重构,我将过去复杂的 webpack 配置,彻底删减,并更换为 webpack5

而且直接使用 webpack api,不再走配置文件了,其实这里可以换成 rollup,但还为时尚早,有很多东西在我还没有完全理顺之前,我只能移植不能重构

webpack5 有个很骚的功能叫 module federation,这玩意和 monorepo 差不多,可以用来做跨库依赖共享

经过这一波操作,我就可以将 webpack 所有的逻辑,概括出来了

渐进式更新

任何项目都是需要积累的,没人可以一下子就把shi山铲平,但能铲一点是一点

举个例子,今天同事找我维护了一下 scroll-view 组件,这个组件真的超级骚,必须使用特定的 dom 结构和特定的 css 样式和特定的下拉刷新的逻辑

我今天一天就重构了这一个组件,也许一个组件对整体仓库来说不算什么,但我会说真正问题多的,其实就几处而已

有的包可以常年不迭代,有的组件到处都是 bug,做好冷暖的调控,我们不求做到百分百,只求解决九成

wean

最后说一下 wean,wean 虽然现在有点失败,但我还没有放弃啊!

wean 距离生产还要很长的路要走,这不是一下就可以完成的,它需要很长时间的积累

要知道 react 的 concurrent 写了五年都没写好呢

我会花很长一段时间吃透现在的携程小程序架构,然后争取将一些东西沉淀到 wean 上,比如刚刚说的组件

总结

昨天我们开了一个会,我原以为携程小程序已经是很复杂的项目了,我还是太天真

心态真神奇,自从我看到更复杂的项目,我竟然变得特别有耐心了

毕竟……没有对比就没有伤害,哈哈


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK