亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

koa2 從入門到精通(小結)

2019-11-19 11:09:06
字體:
來源:轉載
供稿:網友

koa 發布已經快 6 年的時間,作為繼 express 之后 node 服務框架最大的黑馬,有很多的設計思想值得我們學習,本文從簡到繁逐步介紹 koa,同時適合新老手閱讀。

介紹

這里引用中文官方網站的原文

Koa 是一個新的 web 框架,由 Express 幕后的原班人馬打造, 致力于成為 web 應用和 API 開發領域中的一個更小、更富有表現力、更健壯的基石。 通過利用 async 函數,Koa 幫你丟棄回調函數,并有力地增強錯誤處理。 Koa 并沒有捆綁任何中間件, 而是提供了一套優雅的方法,幫助您快速而愉快地編寫服務端應用程序。

既然是 web 框架大家一定不陌生,通過啟動一個 node http server,監聽一個端口,進而我們就可以通過類似 localhost:3000 在本地訪問我們的服務了,這個服務可以是 web 網站,可以是 restful 接口,也可以是靜態文件服務等等。

Hello Word

任何語言、框架都存在 Hello Word 示例,來表達其最簡單的入門 Demo,代碼如下

此時訪問瀏覽器 localhost:3000,我們會看到打印出了 Hello Word,此時一個基于 koa 的服務就啟動完成了。

上下文

理解 koa 第一步,搞清楚上下文的作用

例如:微信群里面有人說外面下雪了,你跑到窗邊看到的卻是晴空萬里,這時你才意識到同樣是 10 月份,他在寒冷的北方,你在酷暑的南方

類似的,一次請求會包含用戶的登錄狀態,或者一些Token之類的信息,這些信息就是上下文的一部分,用于確定一次的請求環境

Koa 的 Context 把 node 的 request, response 對象封裝進一個單獨對象, 并提供許多開發 web 應用和 APIs 有用的方法. 那些在 HTTP server 開發中使用非常頻繁操作, 直接在 Koa 里實現, 而不是放在更高層次的框架, 這樣中間件就不需要重復實現這些通用的功能。

中間件

先來看一個官方的例子:

簡單解釋下,代碼起始初始化一個 koa 實例,下面分別通過 use 方法載入了三個中間件方法,執行順序:

進入第一個中間件next() 跳到下一個中間件new Data() 記錄當前時間next() 跳到下一個中間件將 ctx.body 賦值回到上一個中間件再次記錄當前時間并計算時間差存到 http header 中回到上一個中間件將 header 中的 X-Response-time 打印出來

這里的執行順序延伸出了十分經典的洋蔥模型

在一次請求的過程中會往返經過同一中間件兩次,允許我們處理不同請求階段的邏輯

源碼解析

上面分別介紹了 koa 里面兩個最重要的概念,下面我們分析下 koa 內部是如何運作的,所謂的洋蔥模型是如何建立的

koa 源碼的 lib 目錄十分簡單

lib |- application.js |- context.js |- request.js |- response.js

Application 類初始化

入口文件是 application.js,我們先從這里入手

Application 是一個 class,這個類繼承了 node 的 Events 這里不詳細展開,在 constructor 中初始化了以下內容:

  • proxy 代理默認不開啟
  • middleware 中間件是個空數組,這里重點注意下
  • env 根據環境變量 NODE_ENV 來判斷
  • context、request、response 分別通過 Object.create 方法將 lib 目錄下對應的文件導入到 this 當前上下文,且不污染引入對象

use 方法

按照正常的編碼順序,在初始化完 koa 實例后(即 const app = new Koa()),我們需要調用 app.use() 去掛載我們的中間件,那么我們看下 use 方法做了什么

判斷中間件為 function,判斷中間件是否為 generator function 類型,只是簡單的將中間件函數 push 到了 middleware 數組中。

此時心中有沒有大寫的 WHAT?

其實就是這么直白,沒什么復雜邏輯,后面也許大家都猜到了,循環調用 middleware 中的方法去執行,此處尚未表明洋蔥模型是怎么來的,我們先不展開,繼續按代碼順序執行。

listen 方法

按照正常的編碼順序,在 use 完我們的中間件之后就是 app.listen(3000)

一起看下這個 listen 干了什么

這里的 http.createServer 就是 node 原生啟動 http 服務的方法,這里稍微擴展下基礎知識,此方法接受兩個參數

  • options[IncomingMessage, ServerResponse] 這里從 node 版本 v9.6.0, v8.12.0 后才支持,這里不贅述
  • requestListener 此參數為 function 類型,每次請求會傳入 req, res 兩個參數

不難理解這里的 this.callback() 方法一定是返回了一個函數,并且接收兩個參數 (req, res),下面看下源碼

這個 callback 中的信息量有點大,代碼本身并不難理解,注釋也有說明,從這里展開從上到下分別解釋

compose 方法

這里的 compose 方法主要負責生成洋蔥模型,通過 koa-compose 包實現,源碼如下

從注釋看得出大致邏輯,這里的巧妙之處在于 fn(context, dispatch.bind(null, i + 1))。

這個 dispatch.bind(null, i + 1) 就是我們通常寫中間件的第二個參數 next

我們執行這個 next() 方法實際上得到的是下一個中間件的執行。

也就不難理解為什么我們 await next() 的時候等待的是后面所有中間件串聯執行后了,回頭再看下上文中間件部分的執行順序就豁然開朗了。

createContext 方法

callback 中的展開解釋,看下 const ctx = this.createContext(req, res) 做了什么

這里主要是將 req, res 及 this.request, this.response 都掛載到了 context 上,并通過賦值理清了循環引用層級關系,為使用者提供方便。

handleRequest 方法

還是 callback 中的展開解釋,看下 this.handleRequest(ctx, fn) 這部分做了什么

分別拿到 ctx 和 compose 生成的洋蔥模型,開始逐一消費中間件。

context.js 文件

上面理清了整體框架,下面看下 context.js 內部的細節,在文件結尾有兩大段的代理

這里可以看到所有的 req 及 res 的方法集合,那么哪些方法可讀,哪些可寫,哪些既可讀又可寫,哪些方法不允許修改

這就是 delegates 這個庫做的事情。

delegates 內部利用了,__defineGetter____defineSetter__ 方法控制讀寫,當然我們可以從中學習思想,也不能盲從

這兩個 api 去 MDN 上搜索會給出相同的警告信息

This feature is deprecated in favor of defining setters using the object initializer syntax or the Object.defineProperty() API.

其實還是建議我們使用 vue 的代理方式 Object.defineProperty(),不過這個庫有四年沒更新了依然穩定運行著,還是深受 koa 開發者認可的。

其它

request.jsresponse.js 文件沒什么可以講,就是具體的工具方法實現,方便開發人員調用,感興趣可以自行閱讀源碼。

應用

智聯前端架構整體的 node 服務都基于 koa 實現,包括我們的 vue 服務端渲染和 node restful api 等等。

我們選擇 koa 的原因是其本身輕巧,可擴展性良好,支持 async、await 的異步,徹底擺脫了回調地獄。

市面上也有成熟基于 koa2 的企業級解決方案,如 eggjs 和 thinkjs。

總結

揭開 koa 的神秘面紗,讓開發者關注業務邏輯同時也關注下框架本身,有利于問題排查和編寫擴展,與此同時可以學習 express、hapi 等同類型框架的思想,結合現有企業級解決方案,選一款適合你的框架,總之框架不論好壞,只論場景。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产视频精品免费播放| 狠狠久久五月精品中文字幕| 色爱av美腿丝袜综合粉嫩av| 91超碰中文字幕久久精品| 国产在线日韩在线| 7m第一福利500精品视频| 大伊人狠狠躁夜夜躁av一区| 亚洲成人黄色在线观看| 波霸ol色综合久久| 91亚洲精品在线观看| 国产成人免费av| 亚洲视频综合网| 精品一区电影国产| 秋霞av国产精品一区| 久久精品视频va| 国产午夜精品视频免费不卡69堂| 国产精品亚洲美女av网站| 日韩成人在线视频| 国产精品高潮呻吟久久av黑人| 97av视频在线| 中文在线资源观看视频网站免费不卡| 欧美午夜视频一区二区| 国产一区二区三区中文| 亚洲精品国产精品久久清纯直播| 久久久久久69| 国产午夜精品理论片a级探花| 精品久久久久久久久中文字幕| 91亚洲午夜在线| 最新69国产成人精品视频免费| 91美女高潮出水| 91视频8mav| 国产精品自拍视频| 国产精品久久久久久久久久久久久| 午夜剧场成人观在线视频免费观看| 一本色道久久综合狠狠躁篇怎么玩| 久久久99久久精品女同性| 最近的2019中文字幕免费一页| 欧美在线一区二区视频| 欧美大片在线免费观看| 92版电视剧仙鹤神针在线观看| 欧美色欧美亚洲高清在线视频| 日韩av在线最新| 国产在线观看精品一区二区三区| 亚洲美女精品成人在线视频| 亚洲自拍欧美另类| 欧美性理论片在线观看片免费| 欧美在线视频一区二区| 欧美在线视频网| 欧美性xxxx极品高清hd直播| 亚洲人成亚洲人成在线观看| 日韩电影免费在线观看| 一区二区中文字幕| 欧美日韩在线影院| 国产亚洲视频在线| 亚洲最新av网址| 色偷偷av一区二区三区| 国产精品普通话| 国产成人在线播放| 91久久久久久久久久久| 国产精品夜色7777狼人| 国产成人精品久久久| 狠狠综合久久av一区二区小说| 一区二区三区回区在观看免费视频| 中文一区二区视频| 在线观看不卡av| 这里只有精品视频| 激情懂色av一区av二区av| 亚洲精品久久久久中文字幕欢迎你| 国产欧美在线观看| 国产免费一区二区三区在线观看| 午夜精品久久久久久99热软件| 午夜精品久久久久久久久久久久| 狠狠躁夜夜躁人人躁婷婷91| 亚洲电影中文字幕| 超碰91人人草人人干| 欧美日韩国产一中文字不卡| 国产精品久久久久77777| 欧美又大又粗又长| 91九色国产社区在线观看| 国内伊人久久久久久网站视频| 亚洲自拍小视频| 国产激情视频一区| 久久久久久久久久久91| 国产精品成人一区二区三区吃奶| 97福利一区二区| 久久久久免费视频| 国产激情视频一区| 黑人精品xxx一区| 亚洲bt欧美bt日本bt| 97视频在线观看亚洲| 日韩电影中文字幕| 日韩精品视频三区| 一区二区三区 在线观看视| 欧美精品制服第一页| 日韩国产中文字幕| 91视频九色网站| 色与欲影视天天看综合网| 成人综合网网址| 亚洲一区二区在线播放| 欧美性猛交99久久久久99按摩| 亚洲欧美中文另类| 热99精品只有里视频精品| 欧美日韩免费观看中文| 国产亚洲视频中文字幕视频| 日韩午夜在线视频| 色偷偷噜噜噜亚洲男人的天堂| 国产精品草莓在线免费观看| 亚洲人成网站免费播放| 国产高清视频一区三区| 最新日韩中文字幕| 亚洲专区国产精品| 亚洲欧美变态国产另类| 久久99久国产精品黄毛片入口| 成人乱色短篇合集| 久久91精品国产91久久跳| 欧美激情a在线| 欧美日韩国产麻豆| 97在线视频精品| 亚洲福利在线播放| 久久九九精品99国产精品| 精品国产乱码久久久久久天美| 久久亚洲精品小早川怜子66| 亚洲一区免费网站| 日韩亚洲综合在线| 久久久久久成人精品| 欧美孕妇毛茸茸xxxx| 欧美激情一区二区久久久| 精品国内亚洲在观看18黄| 亚洲欧美色婷婷| 久久99视频免费| 久久99久国产精品黄毛片入口| 5566成人精品视频免费| 日韩有码在线视频| 欧美一级淫片videoshd| 亚洲电影免费观看高清完整版在线观看| 不卡伊人av在线播放| 美日韩精品免费观看视频| 久久久精品影院| 欧美性做爰毛片| 欧美视频一二三| 日韩欧美在线看| 久久免费精品日本久久中文字幕| www国产精品视频| 欧美丰满老妇厨房牲生活| 亚洲aⅴ日韩av电影在线观看| 欧美自拍视频在线观看| 欧美最猛黑人xxxx黑人猛叫黄| 97超碰国产精品女人人人爽| 91成人精品网站| 亚洲人成伊人成综合网久久久| 欧美中文字幕在线播放| 精品福利在线观看| 国产美女主播一区| 国产ts一区二区| 亚洲伊人久久综合| 久热在线中文字幕色999舞| 亚洲人成77777在线观看网| 精品伊人久久97| 欧美成人精品在线视频| 欧美日韩高清区| 日韩中文字幕在线视频播放| 成人性生交大片免费看小说| 久久久噜噜噜久久中文字免| 91禁国产网站|