最新Node.js框架:Koa 2 實用入門

2021-03-02 Node全棧
 Koa2是目前Node.js世界最火的web框架,無論從性能,還是流程控制上,koa 2和它的後宮(中間件)都是非常好的解決方案。本文主要koa 2的文檔解讀和runkoa介紹,讓大家對koa 2有一個更簡單直接的理解Koa 2實用入門

koa2已發布了一段時間,可以考慮入手,參見Node.js最新Web技術棧(2016年4月)

http://nodeonly.com/stack/

本文主要是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 種不同類型的中間件寫法

common function

async function(新增)

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 runkoarunkoa app.jsrunkoa app-async.js     runkoa app-generator.js

測試發起 http 請求

$ curl http://127.0.0.1:3000Hello 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種寫法都是長期支持的

這樣寫不行。。。。

// 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`);
});

這樣寫是可以的

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`);
}));


Babel支持

我本人比較討厭寫babel,對於node sdk不支持的特性持觀望態度,比如async/await這樣的神器是可以用的,其他的是不一定一定要上的,那就觀望好了

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

可是,我還是不想用,就幾行代碼能搞定的事兒,我不想看到babel出現在我的代碼裡,於是就有了前面用到的runkoa,它的原理也是這樣的,不過看起來更clean一些


總結

Node.js 4.x和5.x支持的es特性還是有很大差異的,如果不用到,還好,萬一用到就只能babel去轉換,還有就是async支持,必須要stage-3,那麼也還是需要babel。

Node.js sdk遲遲不更新很討厭,babel更新太快也很討厭

但是,無論從性能,還是流程控制上,koa 2和它的後宮(中間件)都是非常好的解決方案

歡迎關注我的公眾號【node全棧】

如果想參與評論、查看文章url地址,請點擊原文連結,進入國內最專業的cnode論壇

相關焦點

  • ...發布,TypeScript 版的 Node.js Koa 框架 - OSCHINA - 中文開源...
    Tkoa是使用 typescript 編寫的 koa 框架! 儘管它是基於 typescript 編寫,但是你依然還是可以使用一些 node.js 框架和基於 koa 的中間件。安裝TKoa 需要 >= typescript v3.1.0 和 node v7.6.0 版本。
  • TKoa 1.0.1 發布,TypeScript 版的 Node.js Koa 框架
    Tkoa是使用 typescript 編寫的 koa 框架! 儘管它是基於 typescript 編寫,但是你依然還是可以使用一些 node.js 框架和基於 koa 的中間件。安裝TKoa 需要 >= typescript v3.1.0 和 node v7.6.0 版本。
  • 從零開始搭建koa後臺基礎框架
    一、背景結合當前的node比較火的三大框架,Express、Koa、egg。筆者之前用的Express,後面發現回調把我搞死了,實在太無奈了。終於有一天去嘗試了Koa來進行開發,發現實在太舒服了。ES6語法支持很多,同步模式也很到位,但是在學習koa的過程中,發現基本的基礎知識都了解了,也按照官方的文檔走了一遍,但發現好像無從下手。
  • Node.JS快速入門
    >在命令提示符下輸入命令node -v會顯示當前node的版本號2.快速入門2.1 控制臺輸出我們現在做個最簡單的小例子,演示如何在控制臺輸出,在e盤創建文件夾nodedemo ,創建文本文件demo1.js,代碼內容我們在命令提示符下輸入命令node demo1.js ,結果如下:2.2 使用函數我們剛才的例子非常簡單,咱們這裡再看一下函數的使用:我們在命令提示符下輸入命令
  • 學習 koa 源碼的整體架構,淺析koa洋蔥模型原理和co原理
    本文閱讀最佳方式先star一下我的倉庫,再把它git clone https://github.com/lxchuan12/koa-analysis.git克隆下來。不用管你是否用過nodejs。會一點點promise、generator、async、await等知識即可看懂。
  • 如何在Windows系統安裝最新版本的Node.js
    工具windows作業系統Node.js技術JavaScript在使用vue框架、react框架和angularjs框架時,隨著框架版本不斷更新,對應的Node.js版本也在不斷更新;如果版本不對應,搭建框架的項目就啟動不了。
  • Node.js 學習資料和教程(值得收藏)
    JS優化滬 JS 國內講師的 PPT 收集給Node.js新手的7條小建議  模塊導航web伺服器框架最流行的web框架Express>HomePage加裝渦輪,提速expressjs給 connect 的 static 模塊加上url路徑前綴研究nodeclub 登陸驗證邏輯的一些心得Express.js 中文入門指引手冊
  • 復盤node項目中遇到的13+常見問題和解決方案
    src\"" }2.由於nodejs第三方模塊依賴特定node版本導致的報錯解決方案這個情況筆者之前也遇到過, 主要原因是第三方沒有和node版本做到很好的向後兼容, 此時解決方案就是更新此第三方包到最新版本(如果還在維護的情況), 或者使用node包管理工具(n)切換到適配的node版本, 如下:// 更新最新的包
  • Node.js 入門到幹活,10 個項目就夠了
    Node.js 入門到幹活,10 個項目就夠了 Node.js 在很多大公司都有不錯的實踐,比如:淘寶、天貓 Web 版,很多頁面都是在 Node 伺服器上渲染的。還有各種腳手架、前端打包發布工具、構建生態的小工具,也基本都是 Node.js 編寫的。
  • 10 個最適合 Web 和 APP 開發的 NodeJS 框架
    Node.js Express 對於一個已經在使用 node.js 的開發人員來說,Express 或者」node.js express」並不是一個新鮮事。Express 框架提供了對 node.js 原生 API 的比較好的封裝,從而使開發者更加容易地使用node.js。 Express 框架提供了用來開發強壯的 web/移動應用,以及 API 的所有功能。
  • 10+ 最佳的 Node.js 教程結合實例
    以下是Node.js入門的簡單介紹,如果你對Node.js略有了解可以直接跳過此部分。那什麼是Node.js呢?Node.js是迄今運用最多的服務端JavaScript運行時環境,使用JavaScript開發跨平臺的實時WEB應用。Node.js基於Google的V8 JavaScript引擎。
  • 推薦一些Node.js超好用的工具庫
    首先明確一下庫和框架的區別:一般而言,一個工程中可以使用多個庫,但只能使用一個框架,本文只推薦庫,不涉及Express, egg.js, Koa 這類框架。開源地址:https://github.com/axios/axiosnodemailernodemailer是我用過最好用的 node.js 發郵件庫,上代碼!
  • DoraCMS v2.0.2 發布,Node.js CMS 內容管理框架
    群眾的力量是偉大的,近期童鞋們針對目前doracms存在的問題提出來很多建設性的建議,也提出了遇到的問題和存在的bug,在這裡要特別感謝@PirateD 和  @amor520  以及@dolare,提出建議和貢獻代碼,具體修復問題如下:1、升級 log4js
  • Node.js 服務性能翻倍的秘密
    作者:shenfq 來源:更了不起的前端前言前一篇文章介紹了 fastify 通過 schema 來序列化 JSON,為 Node.js 服務提升性能的方法。今天的文章會介紹 fastify 使用的路由庫,翻閱其源碼(lib/route.js)可以發現,fastify 的路由庫並不是內置的,而是使用了一個叫做 find-my-way 的路由庫。route.js這個路由庫的簡介也很有意思,號稱「超級無敵快」的 HTTP 路由。
  • node.js、MongoDB下一代的LAMP
    node.js、MongoDB下一代的LAMP 我們大部分人在做網站時,都用的是LAMP,殊不知LAMP已成過去式,新一代的小生:nix、node.js、MongoDB誕生了,讓我們走進他們,知道他們的故事!
  • 前端開發為什麼要學Node.js?小白如何深入理解Node.js?
    目前Node.js已發展成一個成熟的開發平臺,吸引了許多開發者。有許多大型高流量網站都採用Node.js進行開發,此外,開發人員還可以使用它來開發一些快速移動Web框架。Node.js在企業中的運用有哪些?1、作為中間層。
  • 實戰:在Node.js和Vue.js中構建文件壓縮應用程式
    Node.js為我們提供了一個模塊來協助文件壓縮。在本文中,我們將構建一個應用程式,用戶可以在該應用程式中上傳他們想要壓縮的文件,然後使用Node.js Zlib模塊下載該文件的壓縮版本。現在,我們需要為應用程式安裝必要的軟體包:koa、koa-router:這將有助於設置我們的伺服器以及路由nodemon:當我們對應用程式進行更改時,Nodemon將重新啟動我們的伺服器要安裝所有這些,請在我們創建的 server 目錄中運行以下命令:
  • 「1分鐘--前端06」nodejs,express,koa
    ;(2)路由級;(3)錯誤處理類;(4)內置(5)第三方;4.原理:(1)源碼中與中間件相關的三個文件(2)application.js中的use方法,把我們app.use註冊的中間件和路由方法交給了Router類來處理
  • 編寫 Node.js RESTful API 的 10 個最佳實踐
    全文共 6953 字,讀完需 8 分鐘,速讀需 2 分鐘。翻譯自:RingStack 的文章  10 Best Practices for Writing Node.js REST APIs | @RisingStack ,英文好的同學可以直接閱讀原文,譯文較原文有刪節 。
  • 【 Node.js】你應該知道的 NPM 知識都在這!
    上面的這種當你的包安裝到全局時:npm 會在 /usr/local/bin 下創建一個以 vm2 為名字的軟連結,指向全局安裝下來的 vm2 包下面的 "./bin/index.js"。這時你在命令行執行 vm2 則會調用連結到的這個 js 文件。