启动过程koa的主要启动过程有以下四个步骤:importkoapackage=>instantiatekoa=>writemiddleware=>monitorserverconstkoa=require('koa');constapp=newkoa();app.use(function1(){})app.use(function2(){})app.use(function3(){})app.listen(port,function(){})导入koa包实际上导入koa包就是引入了一个Application类,继承自node的nativeeventsclassmodule.exports=classApplicationextendsEmitter{constructor(){super();this.proxy=false;这个.middleware=[];this.subdomainOffset=2;this.env=process.env.NODE_ENV||'发展';this.context=Object.create(context);this.request=Object.create(请求);this.response=Object.create(response);}listen(...args){}toJSON(){}inspect(){}use(fn){}callback(){}handleRequest(ctx,fnMiddleware){}createContext(req,res){}onerror(err){}};包括listen、use等原型方法实例化koa执行构造函数,将ctx、response、request等对象封装在koa实例中编写中间件use(fn){if(typeoffn!=='function')thrownewTypeError('中间件必须是一个函数化!”);if(isGeneratorFunction(fn)){deprecate('将在v3中删除对生成器的支持。'+'请参阅文档以获取有关如何转换旧中间件的示例'+'https://github.com/koajs/koa/blob/master/docs/migration.md');fn=转换(fn);}debug('使用%s',fn._name||fn.name||'-');这个.中间件.push(fn);returnthis;}先判断fn的类型,如果不是方法直接抛错,如果是生成器函数就用co封装。如果是asyncfunction,直接放到middleware数组里测试。如果是普通函数,1.X版本会报错,2.X版本可以执行,但是因为没有next,所以只能执行第一个使用。作用是将中间件函数一个一个放入ctx.middleware中,当请求到达时依次调用监听服务器。listen(...args){debug('listen');constserver=http.createServer(this.callback());//节点的请求事件在这里注册returnserver.listen(...args);}koa的监控主要有两个包:封装了原生的node服务器监控包koa.callback(),以及为这个server设置node的请求事件,也就是说每次请求过来都会执行koa.callback()方法,这个是极其关键的一步,是koa中间件原理的基础。下一章会讲解中间件END的原理
