同当前煊赫一时的Express同样,它是一款更年轻的web应用框架javascript
Koa,是 Express 原班人马基于 ES6 新特性从新开发的框架,主要基于co 中间件,框架自身不包含任何中间件,不少功能须要借助第三方中间件解决,可是因为其基于 ES6 generator 特性的异步流程控制,解决了 "callback hell" 和麻烦的错误处理问题。css
异步流程控制java
Express 采用 callback 来处理异步,Koa v1 采用 generator,Koa v2 采用 async/await。
下面分别对 js 当中 callback、promise、generator、async/await 这四种异步流程控制进行了对比,
generator 和 async/await 使用同步的写法来处理异步,明显好于 callback 和 promise,async/await 在语义化上又要比 generator 更强。node
错误处理
Express 使用 callback 捕获异常,对于深层次的异常捕获不了,
Koa 使用 try catch,能更好地解决异常捕获。git
详细访问:
Node.js 框架对比之 Express VS Koaes6
一张图更好的理解Express & koa 的设计思想web
Koa的思想express
Express的思想,就是把请求当成流,沿着中间件一层一层的过,每一层均可以对请求进行处理,最终处理完成的,返回给客户端,npm
而Koa 的中间件以相似堆栈的方式流动,容许执行下游操做,而后过滤并操纵上游的响应。
它的执行流程是经过es6中的generator来实现的。generator函数能够像打断点同样从函数某个地方跳出,以后还能够再回来继续执行。经过这个例子来理解:json
function* gen() { console.log('begin'); //3.执行到yield会带着后面的数据切出,就是执行这个函数, yield anotherfunc; //6.下次回来时候从这里开始执行 console.log('end!'); } var anotherfunc(){ console.log('this is another function!'); } //1.执行gen函数,不会当即执行它内部的代码,而是返回一个迭代器, var g=gen(); //2.经过迭代器的next()方法,启动迭代器,这里就会进入gen()函数执行, var another=g.next(); //'begin!' //4.another是一个对象,其中value成员就是返回的anotherfunc函数 another.value(); //'this is another function!' //5.再次调用next()方法,这里能够传参数,能够将参数切入(不理解能够先去搞清generator函数) g.next(); //'end!';
这实际上是koa1的实现方式,在koa2中会采用es6的async/await,async/await至关因而generator和yield的语法糖,
详细了解请访问:
深刻探析koa之中间件流程控制篇
安装Koa:
Koa须要支持ES2015和async function的node v7.6.0或更高版本。
1.你能够选择安装最新版的node环境,(卸载重装)
2.利用nvm(node的版本管理)安装指定版本的node环境,nvm不要用命令行安装,须要实际安装
$ nvm install 7
初始化package.json
npm init -y
而且配置script选项为:
"dev": "node koa2.js"
安装依赖
npm i -S koa
新建一个koa2.js,加入官方给的model
const Koa = require('koa'); const app = new Koa(); // x-response-time app.use(async (ctx, next) => { const start = Date.now(); await next(); const ms = (Date.now() - start) * 1000; ctx.set('X-Response-Time', `${ms}ms`); }); // logger app.use(async (ctx, next) => { const start = Date.now(); await next(); const ms = (Date.now() - start) * 1000; console.log(`${ctx.method} ${ctx.url} - ${ms}`); }); // response app.use(async ctx => { ctx.body = 'Hello World'; }); app.listen(3000);
运行
npm run dev
打开浏览器,访问localhost:3000,亲切的hello world映入眼帘。
express有应用生成器,那koa固然也有啊,
仍是安装:
必定要全局安装(koa1.2和koa2都己经支持)
npm install koa-generator -g
koa2 生成一个test项目,切到test目录并下载依赖:
koa2 test & cd test $ npm install
运行
npm start
访问 http://localhost:3000
express和koa生成项目时视图模板默认是用jade,若是要切换为ejs,在生成项目时,添加一个参数,
koa2 -e test
奉上koa2生成器的参数:
-h, --help 帮助
-V, --version 版本号-e, --ejs 添加ejs模板引擎支持(默认是jade) --hbs 添加hbs模板引擎支持(默认是hbs)-H, --hogan 添加hogan.js支持-c, --css <engine> 添加css样式 支持 less sass styus css(默认是css) --git 添加 .gitignore-f, --force force on non-empty directory