You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
use(fn){// 边界判断if(typeoffn!=='function')thrownewTypeError('middleware must be a function!');// 如注释所示,为了转化generatorif(isGeneratorFunction(fn)){deprecate('Support for generators will be removed in v3. '+'See the documentation for examples of how to convert old middleware '+'https://github.com/koajs/koa/blob/master/docs/migration.md');fn=convert(fn);}debug('use %s',fn._name||fn.name||'-');// 这里是核心this.middleware.push(fn);returnthis;}
经历了一波感觉暗无天日的秋招以后,总算能稍微松口气了,先把自己一直想写的博客,记录一下
源码的入口
首先,可以看到的是koa源码中就只有lib目录里面有四个文件:
按我们的使用方法:
首先第一个疑问就来了:由上面的代码可知
require('koa')
得到了koa的构造函数,那么,koa的构造函数是通过哪个文件暴露出来的呢?换言之,也就是我们阅读koa源码从哪里开始呢?
于是得知道
require('koa')
发生了什么,已知require是node的模块机制于是我们引入的便属于自定义模块:
于是进一步揭晓:先到我们的当前文件目录下的
node_modules
目录查找,找到了查找的地方,然后呢?于是首先,koa这个标识符不包含文件拓展名,Node会按
.js,.json,.node
的次序补足拓展名依次尝试,但是我们可以看自己的node_modules目录里面koa是一个目录...那么是一个包就会有
package.json
,于是:注意这里如果package.json没有main属性,应该也是直接使用index当做默认文件名,例如
koa-compose
的包:module.exports = compose
了)回到koa源码中,正好node_modules的koa目录下的
package.json
中有main
属性:然后再去application.js中去查找:
module.exports = class Application extends Emitter { // code }
答案揭晓:通过
require('koa')
得到的Koa构造函数,其实是lib/application.js
中暴露出来的class Application
!于是,终于走了小小的一步...
参考:《深入浅出Node.js》
开始探索
我们知道了
const Koa = require('koa');
,中的Koa
代表的是,class Application
,接下来回到我们要探索的问题:为什么koa会表现成一个洋葱模型?如下:
所以我们开始从application.js中寻找答案,首先示例代码中使用了
use
,我们可以从application.js中去找到use
方法:由于构造函数中,
this.middleware = [];
,得知应该是把fn放入数组中存储起来于是这里
use
函数就结束了,然后就到了app.listen(3000)
,接着看listen
方法然后我们再看
callback
方法:// todo
The text was updated successfully, but these errors were encountered: