簡單聊一下koa,koa 是express的原半人馬打造,所以解決了express中的不少痛點,它的目標是成爲一個更小,更具備表現力,更健壯的基於node的web框架。其主要特色是採用ES6中generator來進一步解決回調函數的問題,因此提醒一下你們,以前你們在看ES6的時候看到generator這章就默默翻過去的同窗要再去翻翻書了。html
額,開始以前先搭一下環境吧!由於實在是太簡單了哈!哈!哈!(感受有點傻)node
1.koa-generatorweb
koa-generator是一款快速生成koa的腳手架工具express
先全局安裝npm
$ npm install -g koa-generator複製代碼
接着進入到咱們的項目文件夾json
koa2 <projectName>複製代碼
你們注意一下,koa1和koa2。瀏覽器
簡單介紹一下koa1是使用generator實現異步的,咱們知道Express是基於ES5的,當新版本的node支持ES6時Express團隊基於ES6的generator編寫了web框架koa1,可是吧koa團隊超前的基於ES7開發了koa2,koa2是經過Promise和async來實現異步的。(唉,大神們的精神果真值得咱們學習)bash
回到正題上來,生成命令執行結束後咱們來安裝依賴服務器
$ npm install複製代碼
依賴安裝完成後咱們來啓動服務app
$ npm start複製代碼
而後打開瀏覽器輸入:http://localhost:3000/
這樣就表明咱們已經安裝完成了
咱們來簡單看下此時的文件結構
bin/www node啓動文件
public目錄下面的爲靜態資源
routes/index.js 路由入口
routes/user.js 開發者配置路由的文件
view目錄下爲頁面文件夾
app.js入口文件
2.接下來咱們來手動安裝一下
進入到工程目錄下初始化一下
npm init複製代碼
接下來添加咱們要安裝的koa版本
打開package.json,添加
"dependencies": {複製代碼
"koa": "2.0.0"複製代碼
}複製代碼
安裝依賴
npm install複製代碼
新建app.js,並添加一下代碼
//在koa2中,咱們導入的是一個class,所以用大寫的Koa表示複製代碼
const Koa = require('koa');複製代碼
// 建立一個Koa對象表示web app自己:複製代碼
const app = new Koa();複製代碼
// 對於任何請求,app將調用該異步函數處理請求:複製代碼
app.use(async (ctx, next) => {複製代碼
await next();複製代碼
ctx.response.type = 'text/html';複製代碼
ctx.response.body = '<h1>Hello, koa2!</h1>';複製代碼
});複製代碼
// 在端口8000監聽:複製代碼
app.listen(8000);複製代碼
console.log('app started at port 8000...');複製代碼
接下來啓動服務
node app.js複製代碼
接着訪問本機的8000端口就會出現信息了
先寫一個最簡單的koa應用程序
const Koa = require('koa');複製代碼
const app = new Koa();複製代碼
app.use(async ctx => {複製代碼
ctx.body = 'Hello World';複製代碼
});複製代碼
app.listen(3000);複製代碼
運行一下
看就這麼幾行簡單的代碼就構建了一個最簡單的應用程序
可是你們可能會問是創建了一個應用程序,可是我寫這麼一個東西徹底沒有用啊!
是的,接下來重點來了,試想一下當用戶訪問咱們的網站時,咱們對於請求要作不少複雜的處理,不多是這麼簡單的返回,在koa中這個概念就是級聯咱們也能夠叫作中間件,再簡單一點說就是中間件就像是一個過濾器,能夠對請求和響應進行處理。
下面來個簡單的例子
let koa = require('koa');複製代碼
let app = new koa();複製代碼
app.use((ctx, next) => {複製代碼
console.log("A");複製代碼
next(); // next不寫會報錯複製代碼
console.log(5)複製代碼
});複製代碼
app.use((ctx, next) => {複製代碼
console.log("B");複製代碼
next();複製代碼
console.log(4)複製代碼
});複製代碼
app.use((ctx, next) => {複製代碼
console.log("C");複製代碼
ctx.body = 'Hello World';複製代碼
});複製代碼
當訪問http://localhost:3000/時終端以下
能夠看到當一箇中間件調用 next() 則該函數暫停並將控制傳遞給定義的下一個中間件。當在下游沒有更多的中間件執行後,堆棧將展開而且每一箇中間件恢復執行其上游行爲。
接下介紹幾個經常使用函數:(接下一些會引用到koa官網中的一些內容)
app.listen()
Koa 應用程序不是 HTTP 服務器的1對1展示。 能夠將一個或多個 Koa 應用程序安裝在一塊兒以造成具備單個HTTP服務器的更大應用程序
const Koa = require('koa');複製代碼
const app = new Koa();複製代碼
app.listen(3000);複製代碼
//實質爲複製代碼
const http = require('http');複製代碼
const Koa = require('koa');複製代碼
const app = new Koa();複製代碼
http.createServer(app.callback()).listen(3000);複製代碼
複製代碼
下面的形式也是能夠的
const http = require('http');複製代碼
const https = require('https');複製代碼
const Koa = require('koa');複製代碼
const app = new Koa();複製代碼
http.createServer(app.callback()).listen(3000);複製代碼
https.createServer(app.callback()).listen(3001);複製代碼
app.callback()
用於 http.createServer() 方法的回調函數來處理請求。
app.use(function)
將給定的中間件方法添加到此應用程序
app.keys=
設置簽名的 Cookie 密鑰。
在node中咱們來對請求進行處理的是request對象和response,在koa中對request和response封裝到了一個對象中,也就是context對象,不過在接收其中咱們通常用ctx,來表示
咱們能夠試着執行下面的代碼:
let koa = require('koa');複製代碼
let app = new koa();複製代碼
app.use(async ctx => {複製代碼
ctx.body = ctx; // 這是 Context複製代碼
// console.log(ctx);複製代碼
});複製代碼
app.listen(3000); 複製代碼
這就是所謂的上下文,至於裏面具體的API你們能夠參考官網