前言

阅读源码前第一步熟悉工程结构,就像看书前先了解书的结构和作者的思想一样,熟悉了工程结构就不容易盲人摸象。

目录结构

  1. .
  2. ├── agent.js
  3. ├── app // koa拓展
  4. ├── extend
  5. └── middleware
  6. ├── appveyor.yml // AppVeyor持续集成博客的配置文件
  7. ├── config // 默认配置
  8. ├── config.default.js
  9. ├── config.local.js
  10. ├── config.unittest.js
  11. ├── favicon.png
  12. └── plugin.js
  13. ├── docs // egg文档
  14. ├── _config.yml
  15. ├── assets
  16. ├── source
  17. └── theme
  18. ├── index.d.ts // 入口文件typescript格式
  19. ├── index.js // 入口文件
  20. ├── lib // 工程核心文件所在
  21. ├── agent.js
  22. ├── application.js
  23. ├── core
  24. ├── egg.js
  25. ├── jsdoc
  26. ├── loader
  27. └── start.js
  28. ├── package.json // 工程描述
  29. ├── scripts // 自动化构建相关脚本
  30. └── test // 单元测试

文件速览

app

基于koa开发的eggjs,与它的底层框架一样,app对象是 Koa的全局应用对象,全局只有一个,在应用启动时被创建。

eggjs通过app目录中 app/extendapp/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个对象:

  1. startCluster
  2. start
  3. Application
  4. Agent
  5. AppWorkerLoader
  6. AgentWorkerLoader
  7. Controller
  8. Service
  9. Subscription
  10. BaseContextClass
  11. Boot

通过 index.js 这个文件,Eggjs对于koa做的拓展可窥一斑。