美文网首页
koa加载解析记录

koa加载解析记录

作者: 马贞晓 | 来源:发表于2018-08-08 11:16 被阅读0次
    > 因项目需要使用koa模拟服务器返回接口,研究下koa加载过程
    

    1、nodejs下的require, 一切node模块的加载都是从node_modules开始的,打开koa模块package.json ,仅关注入口main属性对应的启动项,和dependencies 属性的依赖项,npm模块的依赖会检查如果dependencies下对应的文件是否存在,如果不存在则加载,参考朴灵深入浅出nodejs

     {
      "main": "lib/application.js",
      "dependencies": {
        "accepts": "^1.3.5",
        "cache-content-type": "^1.0.0",
        "content-disposition": "~0.5.2",
        "content-type": "^1.0.4",
        "cookies": "~0.7.1",
        "debug": "^3.1.0",
        "delegates": "^1.0.0",
        "depd": "^1.1.2",
        "destroy": "^1.0.4",
        "error-inject": "^1.0.0",
        "escape-html": "^1.0.3",
        "fresh": "~0.5.2",
        "http-assert": "^1.3.0",
        "http-errors": "^1.6.3",
        "is-generator-function": "^1.0.7",
        "koa-compose": "^4.1.0",
        "koa-convert": "^1.2.0",
        "koa-is-json": "^1.0.0",
        "on-finished": "^2.3.0",
        "only": "~0.0.2",
        "parseurl": "^1.3.2",
        "statuses": "^1.5.0",
        "type-is": "^1.6.16",
        "vary": "^1.1.2"
      },
      "devDependencies": {
        "eslint": "^3.17.1",
        "eslint-config-koa": "^2.0.0",
        "eslint-config-standard": "^7.0.1",
        "eslint-plugin-promise": "^3.5.0",
        "eslint-plugin-standard": "^2.1.1",
        "jest": "^20.0.0",
        "supertest": "^3.1.0"
      }
    }
    
    

    2、app.use 中间件, 其实就是做了个记录,把传入会掉push到middleware,callback函数会在http.createServer中以高阶函数的形式返回,注入ctx和之前push到middleware中的回调。所以当改变url触发了http.createServer ,会执行use中的函数。

    //中间件  
    use(fn) {
        if (typeof fn !== 'function') throw new TypeError('middleware must be a function!');
        if (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);
        return this;
      }
    //监听
      listen(...args) {
        debug('listen');
        const server = http.createServer(this.callback());
        return server.listen(...args);
      }
    //监听回调
     callback() {
        const fn = compose(this.middleware);
    
        if (!this.listenerCount('error')) this.on('error', this.onerror);
    
        const handleRequest = (req, res) => {
          const ctx = this.createContext(req, res);
          return this.handleRequest(ctx, fn);
        };
    
        return handleRequest;
      }
    

    3、自己开发use

    //class router
    let data = {}
    class router {
      
      constructor(str,fun){
        Object.defineProperty(router,"data",{value:{}})
      }
       get(str,fun){
        router.data[str] = fun;
       }
       async main(params,next){  
            await next();
           let reg = /\/.*/g;
           let {path} = params;
           router.data[path](params);
        }
    
    }
    module.exports=new router;
    
    //执行
    
    const Koa = require('koa');
    const app = new Koa();
    const router = require("./router");
    router.get("/getData",async arg=>{
        
        arg.body="hello world"
    })
    app.use(router.main); //响应
    app.listen(3000);
    

    相关文章

      网友评论

          本文标题:koa加载解析记录

          本文链接:https://www.haomeiwen.com/subject/cnqavftx.html