zoukankan      html  css  js  c++  java
  • Koa2实用入门

    koa2已发布了一段时间,可以考虑入手,参见Node.js最新Web技术栈(2016年4月)

    本文主要是koa 2的文档解读和runkoa介绍,让大家对koa 2有一个更简单直接的理解

    一.依赖Node.js 4.0+

    Koa requires node v4.0.0 or higher for (partial) ES2015 support.

    部分特性需要ES2015,大家可以自己比对一下es6在node不同版本里的支持特性

    http://kangax.github.io/compat-table/es6/

    二.hello world

    const Koa = require('koa');
    const app = new Koa();
    
    // 此处开始堆叠各种中间件
    //...
    
    app.use(ctx => {
      ctx.body = 'Hello Koa';
    });
    
    app.listen(3000);

      注意注释部分,此处开始堆叠各种中间件

    三.中间件:Middleware

      Koa 是一个 middleware framework, 它提供了 3 种不同类型的中间件写法

      a.common function
      b.async function(新增)
      c.generatorFunction
      中间件和express的中间件类似,是有顺序的,注意,大部分人都坑死在顺序上

      下面以写一个logger中间件为例,一一阐明

    四.最常见的写法

      node sdk就支持的,就是最常见的

    app.js

    const Koa = require('koa');
    const app = new Koa();
    
    app.use((ctx, next) => {
      const start = new Date();
      return next().then(() => {
        const ms = new Date() - start;
        console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
      });
    });
    
    
    // response
    app.use(ctx => {
      ctx.body = 'Hello Koa in app.js';
    });
    
    app.listen(3000);

    五.async/await 函数 (Babel required)

      async/await是异步流程控制更好的解决方案,很多潮人都已经玩起来了,目前node sdk不支持,所以需要babel来转换一下

    app-async.js

    const Koa = require('koa');
    const app = new Koa();
    
    app.use(async (ctx, next) => {
      const start = new Date();
      await next();
      const ms = new Date() - start;
      console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
    });
    
    // response
    app.use(ctx => {
      ctx.body = 'Hello Koa in app-async.js';
    });
    
    app.listen(3000);

    六.Generator函数

      Generator是node 4(严格是0.12)开始支持的es6特性里的非常重要的一个,用generator和promise实现流程控制,让co充当执行器这一个角色,也是个不错的解决方案

    千万别把generator叫成生成器,我们一般习惯把scaffold叫成生成器。

    app-generator.js

    const Koa = require('koa');
    const app = new Koa();
    const co = require('co');
    
    app.use(co.wrap(function *(ctx, next) {
      const start = new Date();
      yield next();
      const ms = new Date() - start;
      console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
    }));
    
    // response
    app.use(ctx => {
      ctx.body = 'Hello Koa  in app-generator.js';
    });
    
    app.listen(3000);

    七.测试

      启动执行

    npm i -g runkoa
    
    runkoa app.js
    runkoa app-async.js     
    runkoa app-generator.js 

      测试发起http请求

    $ curl http://127.0.0.1:3000
    Hello Koa in app.js

    八.v3将移除单纯的以generator作为中间件的写法

      Old signature middleware (v1.x) support will be removed in v3
      实际是koa核心包含了一个叫koa-convert的模块,它里面warning说,以generator作为中间件的写法将在koa@3里不支持

      但是用co或koa-convert转过的还是可以的,本文的3种写法都是长期支持的

      如下这样写不行:

    const Koa = require('koa');
    const app = new Koa();
    const co = require('co');
    
    const convert = require('koa-convert');
    
    app.use(convert(function *(next) {
      const start = new Date();
      yield next;
      const ms = new Date() - start;
      console.log(`${this.method} ${this.url} - ${ms}ms`);
    }));
    
    // response
    app.use(ctx => {
      ctx.body = 'Hello Koa  in app-convert.js';
    });
    
    app.listen(3000);

      这样写是可以的

    const Koa = require('koa');
    const app = new Koa();
    const co = require('co');
    
    // Koa will convert
    app.use(function *(next) {
      const start = new Date();
      yield next;
      const ms = new Date() - start;
      console.log(`${this.method} ${this.url} - ${ms}ms`);
    });
    
    // response
    app.use(ctx => {
      ctx.body = 'Hello Koa  in app-noconvert.js';
    });
    
    app.listen(3000);

    九.Babel支持

      我本人比较讨厌写babel,对于node sdk不支持的特性持观望态度,比如async/await这样的神器是可以用的,其他的是不一定一定要上的,那就观望好了

      如果在koa 2里用到async/await就需要babel支持了

      a.es2015-node5(nodejs 5.x里支持的es6特性)
      b.stage-3(包含async/await)
      可是,我还是不想用,就几行代码能搞定的事儿,我不想看到babel出现在我的代码里,于是就有了前面用到的runkoa,它的原理也是这样的,不过看起来更clean一些

    十.总结

      Node.js 4.x和5.x支持的es特性还是有很大差异的,如果不用到,还好,万一用到就只能babel去转换,还有就是async支持,必须要stage-3,那么也还是需要babel。

      Node.js sdk迟迟不更新很讨厌,babel更新太快也很讨厌
      但是,无论从性能,还是流程控制上,koa 2和它的后宫(中间件)都是非常好的解决方案

    文章来源:https://cnodejs.org/topic/5709959abc564eaf3c6a48c8

    koa2的官方文档资料详见http://www.koacn.com/#contexthttps://koa.bootcss.com/#

  • 相关阅读:
    【Unity3D】使用MD5值,确保本地Sqlite数据库内容没有被篡改
    《Unity3D》通过对象池模式,管理场景中的元素
    NGUI制作 《九宫格》 图片
    NGUI混合FingerGesture《卷二》分离触摸事件
    js的各种获取大小
    sass基础
    js面向对象开发基础
    正则表达式(进阶篇)
    正则表达式(基础篇)
    jquery源码学习(三)—— jquery.prototype主要属性和方法
  • 原文地址:https://www.cnblogs.com/flyingeagle/p/9164887.html
Copyright © 2011-2022 走看看