从Koa到Egg的感悟
发布于 6 个月前 作者 deadwind4 2761 次浏览 来自 分享

从Koa到Egg的感悟

之前写微服务一直用Koa框架,后来发现阿里大佬们开源了阿里集团通用的底层Web框架Egg。遂用之。本菜自知自己水平并不能全面分析介绍Egg框架,本文只是从自己使用的角度写一些心得。目前只在表层使用阶段,还没深入研究内部。

概要

Egg在Koa基础上进一步封装的一个企业级的Web开发框架。Egg让我代码写的更爽主要有两点。一是它制定了一些规范;二是它封装了很多通用基础功能。

规范

用Koa的时候,没什么规范。各种功能都堆在lib目录下,导致lib目录越来越重。

使用Egg的时候把之前放在lib目录下的功能模块拆分放在以下四个地方

  • controller/
  • service/
  • middlewares/
  • extend/helper.js

刚开始看文档很意外,有Controller为啥还要Service?但是看完后明白了。各种复杂的业务逻辑应该放在Service里,而Controller里仅仅对请求参数进行简单的处理然后调用一个个Service里的功能模块,这样代码更加简洁清晰,与他人合作也更加方便快捷。当然以上Controller和Service的区分仅仅是人为约定并不是强制的,但这种约定很重要。

用Koa时,中间件简单的被我放在router里,复杂的也丢在lib里,很蠢。

换Egg后,统一丢到middlewares/下,一个中间件一个文件。

extend/helper.js里面存放了一些封装好的通用小工具:AES加解密、SHA-256取哈希、Base64编解码等。

这样分割各个模块后,代码清爽多了。Koa虽然也可以人为这样分割目录,但是Egg还有进一步操作。

用Koa的时候,多一个模块就会至少多一个require,然而Egg调用各个模块的时候直接app.middleware.foo.bar、ctx.service.foo.bar就好了。框架启动时自动按照目录结构,把模块加载好绑定到各基础对象下(app、ctx)。特别方便。遂看了下实现原理学习了一波,具体实现原理在egg-core/lib/loader/file_loader.js中。还是要多读大神代码提高知识水平啊。

基础功能

之前使用Koa的时候是把Koa+log4js+config+node-schedule+Mocha+axios+pm2整合到一起。只能以有限的水平,想当然的整合。由于没有约定,一个人或一个项目组整合一个样。Egg自带这些功能后就舒服多了。

Egg内置了Web开发的很多基础功能。配置文件、定时任务、日志打印、单元测试、本地开发、部署、安全等。还有两部分是之前用Koa的时候自己没实现的,本地开发和线上部署。Egg的本地开发可以根据代码的改变reload。线上部署之前借助pm2,现在用Egg内置的egg-scripts和egg-cluster即可。

Egg多进程模型很酷。之前用Koa定时同步配置时,8个进程同时拉取配置,发8次请求。 Egg可以很容易的实现,1个进程拉取配置,然后通过进程间通信,把更新好的配置同步到其他进程中。

感谢

最后由衷的感谢下各位阿里大佬开源了Egg框架,使用Egg不仅帮我更好的完成日常工作,也让我学到更多代码结构组织、框架设计的知识。谢谢。

14 回复

egg 实现了开发规范,对于企业开发很重要

感谢分享和认同

套用下标题,其实你的感悟就是『Node.js 从小工坊走向企业级开发』的一个过程

写了爽的点,也要写不爽的,这样就更好了,哈哈

eggjs架构在现阶段已经很完美,常用的插件也很全。不愧为大厂

@2015-lizaiyang 核心架构那块比较稳定了,插件的话,还是欠缺不少的,一些我们日常工作用的少的插件,如 ORM 啥的,就还有很大的优化空间,欢迎大家加入一起维护

觉得thinkjs更细一些~~~~~

基于egg开发的社区 boxopened.com 已经上线,感觉很不错!

@i5ting 等我再强大点,提pr,狼叔。

@deadwind4 要是能和ts整合到一起就更爽了,就是写.net的即视感

回到顶部