[eggjs/egg][RFC] 关于 Egg3 or Egg4 的设想

2024-06-28 541 views
0
背景

Egg 已经保持在 2.x 版本很久了,一开始的想法很简单,我们在企业内部需要同时维护 1.x 和 2.x,如果过早的发布 3.x,会带来较大的升级成本,而且在那个时候看有很多希望放到 3.x 的特性,不如憋着一个大招,但我们就是这样一直在顾虑着很多东西,不知不觉已经好几年了。

到现在这个阶段,Egg3 规划的很多特性在 Artus 去实现了,而它的架构跨度太大,要基于它封装上层框架 Egg3,还有很多事要做,譬如新的 Router、新的 Multipart 等等。

但以此同时,Node.js 版本已经从当年的 8.x 变为 16.x 了,我们的很多底层类库也逐渐不再支持低版本,导致我们一些安全漏洞无法升级。

我们在对待其他类库开发者时,不都经常劝他们不要吝啬版本么,我们也应该反思下,不要太纠结了 3.x 这个版本了。

思路

勇敢点,分 2 个里程碑:

  • 先发一版 Egg3.,目标是在尽量少 Break 的基础上,尽可能小的升级成本,把一些困扰 Egg2.0 较久的问题先解决掉。
  • Egg4 才是基于 Artus 的,这个不追求完全的兼容性,而且面向未来的去勇敢的 Break。

如果不这样的话,一方面基于 Artus 的 Egg 版本会束手束脚,一直要考虑 Egg2 的升级平滑度,另一方面原来 Egg2.0 的用户会一直被锁死。双输。

目前看到可以在 Egg3.0 包含的特性:

  • 升级 Node.js 最低版本为 16.x
    • 16.x 在 2022.10 进入维护期
    • 但 18.x 由于对操作系统有要求,很多存量应用很难升级
  • 升级 loader 支持异步加载配置
    • 这是一个呼吁了很久的特性,只需修改 egg-core 里面的 loader 方法改为 async function
    • 该特性对应用层不算 break,仅仅会影响到上层框架,需对应的修改 async function 即可,影响面相对可控
  • 其他
    • 评论区可以讨论下,譬如要不要默认关闭 static 插件
跟进
  • [ ] some task
  • [ ] PR URL

回答

3

影响面:对于我们企业内部来说,只要在上层框架那修改下最低 Node 版本 和 loader 的 async 即可,几乎对存量应用没有升级成本。而上层框架的维护者能力相对较高,上层框架的数量不多,整个影响面可控,带来的升级成本低。

譬如对 Chair 来说,它底层的 Egg 是发 3.0 了,但 Chair 本身对应进行适配后是没有 Break 的,我们的用户不受影响。

4

那么就先不要做 egg 3,egg 3 就是基于 Artus 的变更版本,困扰 Egg 2 的问题就在 Egg 2 解决。思路参考 Chair 1.5 和 Chair 2

1

上面我列的那 2 个点,不发大版本的话就违反了 Semver 规则。

3

最低诉求是 Node 最低版本升上去, 要么 14.x 要么 16.x,否则参与维护的欲望其实挺受压抑的。

我不确定这样的变更,该发 2.x 还是 3.x

5

Egg 2 不要动了,我们不追求平滑升级。

5

但这样的话 Egg2.0 的用户会一直被锁死在 8.x 版本,这点我觉得是对用户的不尊重。至少要把最低 Node 版本升上去,这样各个底层的插件可以跟着社区升级上去。

如果是这样的话,那我宁愿违反 Semver,发一个最新的 2.x 版本,只升级 Node 版本。

6

用户可以直接使用 node 18 来跑 egg 2

0

但我们 egg2 内置的所有的插件和底层模块,都没法升级,即使有安全漏洞的情况下也没法升级,这并不好。

6

建议升级到14.x

7

如果按上面的讨论,那我最新的建议是:

  • Egg3 还是基于 Artus,不追求平滑升级。
  • Egg2 发一个新的 minor 版本,只做一件事:把最低的 Node.js 版本升级为 14.x 或 16.x (我建议是 16.x)

@fengmk2 @popomore @dead-horse @hyj1991 你们的想法呢?

image

6

+1 Egg3 直接升级 artus,这么长时间如果没有特别吸引力,用户也不会升级?

Egg3 定位不再是框架的框架,可以有更多开发体验的优化,也可能会吸引使用 ts 和依赖注入的新人。

2

midway.js 和egg是怎么关系,感觉有点重复,如果egg全面转向ts的话

1

egg 的初心是框架的框架,但当时做的过程中,实际承载这个职责的是 egg-core 这个库,egg 更像是一个开箱即用的 Http Server 场景的上层框架。

midway 是上层框架,它比起 egg 的其他上层框架的不同点在于,它后面重构时时直接基于 egg-core 的,也不是强捆绑。然后在 midway-faas 里面是贴着 Serverless 一体化的场景去做,是更上层的全家桶框架。

我们在思考 egg3 的过程中,希望把 egg-core 做的更纯粹,能适配更多的场景,但后面发现变化较大,于是就把这个类似 egg-core 的库,独立为 artus,它承载了 egg 的初心。

从而,egg3 更像是一个上层框架,目前还没完全想好它的形态,有可能就是 eggjs/tegg 那样的,把底层换为 artus。它更倾向于 Http Server 场景的 IOC 上层框架。比起 Midway 的话,一方面 TEgg 比较薄,它不是全家桶,不会内置数据库等插件,也不会像 Midway FaaS 那样和前端深度集成。硬要对比的话,它们都是上层框架,由不同的团队维护,大家的品味和服务的场景及目标不太一样,所以有差异性。但相同的是插件生态都是 Egg 生态,这本身也符合我们 Egg/Artus 做框架的框架的初心。

4

那egg3感觉和express这样有点类似,就是规范了MVC的写法而已,同事用下来还是说express这样的好,毕竟灵活到处能写。我这次用了egg2做了2个接口的项目用下来还是很方便的,虽然规矩多了但是后期维护方便很多,部署感好不需要pm2,希望egg3完全支持ts生态插件多一些。