前言
阅读源码前第一步熟悉工程结构,就像看书前先了解书的结构和作者的思想一样,熟悉了工程结构就不容易盲人摸象。
目录结构
.
├── 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做的拓展可窥一斑。