提醒你们:注意文章的时效性,毕竟不一样的时间节点,框架成熟度不一样。分享这篇文章主要是但愿可以让你们认清框架的定位和应对的业务场景,框架没有好坏之分,只有是否适合本身。html
原标题:关于nodejs-web框架的调研java
做者:xingyuzhenode
日期: Feb 25, 2018git
原文: github.com/xingyuzhe/b…github
如下内容实际上是补漏, 算是对1月份一点工做的总结。web
加入了新团队, 初次接触, 粗略的查看了一些项目(nodejs server端), 发现存在几个问题:redis
对于新成立的团队,存在以上问题能够理解, 本次是讨论和解决第一个问题。typescript
对于集团范围内而言,同种技术存在多种不一样规范和框架很正常, 可是对于一个几十人的团队而言, 资源有限,仍是集中力量统一一下效率高些, 有鉴于此, 以为作一个种子项目比较合适: 一个企业定制框架, 共同维护, 同步更新, 信息共享和沉淀最佳实践。express
跟领导聊了一下, 总结了一下当前状态团队对于这块内容的一些主观诉求:npm
根据上面的要求, 筛选出了eggjs和nestjs2个web框架, 其中nestjs是团队一部分同窗比较喜欢和尝试使用了的。
首先从外层信息作些调查。
我通读了eggjs和nestjs的文档,查阅了一些资料, 简单对好比下:
-- | eggjs | nestjs |
---|---|---|
github stars | 7014 | 4291 |
github forks | 720 | 250 |
gitHub dependents | 1591/305 | 0/0 |
npm search results | 565 | 53+ |
github contributors | 101 | 31 |
github core contributors | 4(10+) | 1(2+) |
github releases | 49 | 19 |
github issues | 86/1416 | 20/347 |
基础框架依赖 | koa2 | express |
文档 | 业界良心 | 通常 |
核心原理 | 载入-挂载 | 模块容器-依赖注入(经过装饰器和元数据实现) |
核心理念 | 微内核-插件机制 | 组件树-装饰器-流程控制 |
eggjs的特色和解决的主要问题:
nestjs的特色和解决的主要问题:
从上述状况来看, 2个框架都在123这几项作了工做, 完成了一个框架所应具有的基本诉求; 整体上看eggjs更加成熟和全面, 配套/生态相对完善的多, 低风险; nestjs则比较青涩和单一, 可是在组件树、流程控制、错误层级处理上有本身的特点, 理念上更加OOP,学习并吸取这些理念是很可取的, 但暂时不建议在核心产品线上投入使用。
详细阅读了核心相关代码, 粗略阅读了cluster等一些模块和插件的代码, 代码读起来整体比较流畅, 发现框架的核心实现很是简单明了:
框架基础依赖一个很是独立的loader模块, 功能就是加载代码文件和挂载函数到指定对象。
框架自己核心类只有6个: koa自己的application, context, response, request, egg自身新增的controller, service 这2个类, 后续全部的挂载动做都在这几个类上面进行
框架明确了app, framework, plugin3个概念, 依赖方式大概是这样:
框架启动的核心流程主要是这样:
因为eggjs本身实现了cluster, 自带进程管理和进程间通讯功能, 因此egg自身部署时并不须要pm2这个工具, 官方文档上也对此作了解释。不过因为这块内容的引入(cluster还涉及到schedule、socket等功能),给框架自己带来了大量额外的代码和逻辑, 整体提高了框架的复杂度。
可是有些时候因为某些缘由并不但愿直接使用框架提供的cluster解决方案, 另外我查看了下pm2的API, 也是有进程间通讯的API的, 固然用起来可能没有自定义实现时那样自由, 也还没有据说该API有被普遍使用过, 不过, cluster相关的内容可否做为一个扩展包, 而不是强耦合进框架核心流程中? 这样框架自己更加简单纯洁, 或者更容易被接受一些?
为此尝试抽离了eggjs的核心代码, 目标是仅保留最最核心的代码(移除cluster等周边代码), 具有egg的扩展机制和能正常直接使用eggjs的周边插件, 结果最后只须要几百行代码, 不多几个文件便可完成。后续在此基础上整理了一个上层框架, 预想做为业务项目的基础框架使用,主要涉及如下一些方面:
以后花了点时间用这个上层框架开发了一个抽奖小项目, 开发体验还算流畅, 虽然说是草量级项目, 不过也是五脏俱全, 做为example还挺适合。
粗略查看了下nestjs的源码, nestjs的核心其实就是一个IoC模块管理容器的实现, 这块内容的逻辑实现做者处理的仍是相对复杂的多, 这里吐槽下做者的代码组织方式和略显随意的注释大量的接口引用和糟糕的历史提交记录...,真是额外提升了阅读的难度. TypeScript的加持和做者本人的光环也不能阻挡这一点。言归正传, 这里说下它的核心原理和流程。
要想理解nestjs的源码先要理解和掌握如下知识:
这个IoC容器实现的核心流程是这样: scanner扫描全部module并提取关系存入module->module存入 container-> injector建立实例(依赖注入)-> instanceLoader加载实例
咱们再拿nestjs实现上面eggjs版本lottery的例子, 大概是这样:
结合源码和实际开发体验来讲:
从整体上讲, eggjs相对成熟, 更贴合实际开发需求。 nestjs的优点就是在一些细节上的约束和控制以及理念上的新颖(仅相对node-web框架而言), 可是这些并非核心诉求。
另外eggjs团队作的工做内容相对于nestjs而言至关的多, 这些与人力、时间资源的投入是分不开的。
最后, 对于想要的新框架的处理结论已经有了:
1 社区模式(节省资源)
2 造轮子模式
3 所应具有的特性
补充: 随着各类工具的发展, 加上eggjs使用也有一段时日,最初一些模糊的预感变得清晰: 1 egg内置cluster模式带来的额外麻烦太多, 如今各类配套工具逐渐完善, 这个功能并无什么用
2 egg模块隔离度不够但矛盾的是有时候又有限制, 简单的说就是代码组织模式上做为框架不够好, 须要自行定制上层规范; egg的是plugin模式, 相对于nest的component模式仍是不够用;
3 egg的ts开发的流畅度差那么一点
4 实际的项目, 须要各类配套设施、工具、系统的协做联合,框架只是一个组成部分, 就应该只作它应该作的事就能够了
各有优劣, 诉求不同, 选择就不同: 1 eggjs: 短平快稳,上手极快, 文档完善,配套齐全, 能极大缩短工期。 2 nestjs: 有点追求, 复杂度高的协做项目, 核心诉求是代码组织模式的
以前egg很好的知足了咱们的诉求, 可是下一个项目, 会考虑使用nestjs或者自行开发框架(足够闲的话)。
egg官方维护者atian25的评论:点击详见
atian25补充下几点:
Cluster 里面并无 schedule
Socket 那个是为了实现高级的 IPC
Cluster 仍是很建议使用的,若是有什么特殊的定制需求,何不如提下 RFC/ISSUE 你们讨论下
egg-core + egg-cluster 才成为 egg,你要是想定制,能够相似 egg-core + my-cluster(虽然不建议)
框架复杂度其实反而是下降了,由于 PM2 的代码比 egg-cluster 复杂多了
Egg 的定位是框架的框架,跟 thinkjs/sails/nest 这些是无法直接对比的,由于不是一个层面的概念。就像你只能对比 Express 和 Koa,而不能对比 nest 和 Koa,由于 nest 是在 Express 之上的封装。
基于 Egg 封装的针对某个领域的上层框架,才能对比。譬如彻底能够用官方的 TS 方案,再封装集成几个装饰器,成为一个上层框架。就能够拿来对比了。
关注公众号,发现更多精彩