前言
阅读源码前第一步熟悉工程结构,就像看书前先了解书的结构和作者的思想一样,熟悉了工程结构就不容易盲人摸象。
目录结构
.├── agent.js├── app // koa拓展│ ├── extend│ └── middleware├── appveyor.yml // AppVeyor持续集成博客的配置文件├── config // 默认配置│ ├── config.default.js│ ├── config.local.js│ ├── config.unittest.js│ ├── favicon.png│ └── plugin.js├── docs // egg文档│ ├── _config.yml│ ├── assets│ ├── source│ └── theme├── index.d.ts // 入口文件typescript格式├── index.js // 入口文件├── lib // 工程核心文件所在│ ├── agent.js│ ├── application.js│ ├── core│ ├── egg.js│ ├── jsdoc│ ├── loader│ └── start.js├── package.json // 工程描述├── scripts // 自动化构建相关脚本└── test // 单元测试
文件速览
app
基于koa开发的eggjs,与它的底层框架一样,app对象是 Koa的全局应用对象,全局只有一个,在应用启动时被创建。
eggjs通过app目录中 app/extend 和 app/middleware 目录中的文件,对koa框架进行功能拓展。
app/extend
通过app/extend/{application,context,request,response}.js 扩展了 Koa 中对应的四个对象的原型,因此比koa提供的“工具函数”更多一些,不过事实上也没有多几个。
app/middleware
通过目录中的几个文件,给koa拓展了web开发必备的中间件,相当于egg直接内置了这些中间件。
config
配置文件,与egg使用过程中的config文件其实就是一个东西,相当于默认配置。
config/config.*.js
config/{default,local,unittest}.js 分别对应了默认、本地、单元测试的默认配置。
config/plugin.js
这个文件非常重要,它是除了前面讲的app文件以外拓展koa的地方,甚至比app文件夹中做的事情要多得多。通过egg插件的形式给eggjs进行赋能。
docs
该文件夹存放了eggjs的文档,与官网的内容一致。看到工程目录中的 appveyor.yml 文件可知,egg团队是使用AppVeyor把docs中的文件更新到官网上的。
lib
该文件夹是这个工程的核心,根目录的入口文件 index.js 就是引用了 lib 文件夹中的文件完成了eggjs框架功能的整合。后续的源码阅读,大部分集中在这个文件夹中。
scripts
看里面的文件可知,eggjs是通过 [travis-ci](https://www.travis-ci.org/) 做到自动化构建的,里面的东西都是跟 travis 相关的配置。这跟源码阅读没有太大关系。
test
单元测试文件存储在这里面,代码的调试与重构验证,都可以围绕着它进行。
package.json
通过 package.json 文件可以看到egg的版本号、工程依赖、入口文件、npm脚本等信息,后续对egg提供对npm脚本做一下细致的解读,其它信息无须赘述。
index.js
eggjs的入口文件,可以看到eggjs提供了以下11个对象:
- startCluster
- start
- Application
- Agent
- AppWorkerLoader
- AgentWorkerLoader
- Controller
- Service
- Subscription
- BaseContextClass
- Boot
通过 index.js 这个文件,Eggjs对于koa做的拓展可窥一斑。
