2018年Hapi vs. Express:Node.js框架比較

在這篇文章中,我們對Node.js的Hapi和Express框架進行了一次有趣的比較研究,包括代碼的外觀和執行方式。

在Raygun,在我們實施任何新工具之前,我們總是運行性能測試並喜歡分享結果。這次我們將Hapi與Express進行比較,以幫助您在Node.js框架上做出更明智的選擇。

Node已經成為軟件開發行業的主要產品。過去幾年中JavaScript越來越流行,推動了Node在安裝基礎方面的進步。JavaScript和Node可能首次提供使用單一語言開發整個n層應用程序的機會。

節點速度很快,並且JavaScript無處不在。這是一個完美的比賽。

因為它與所有的網絡平臺,節點為應用程序提供的要領:請求和響應對象,方法來操作的HTTP請求,並且多個(但不是太多更多)。“純粹”節點應用程序的速度很快,但缺乏中間件,路由和插件的支持,從而減少了現代Web應用程序所需的代碼量。這是Web框架閃耀的地方。

這是兩個流行框架之間的戰鬥故事:HapiExpress

Hapi與Express:比較

這兩個框架比共同點有更多共同之處。但是,如果您在項目之間做出選擇,則應考慮一些關鍵差異。

Hapi(簡稱HAPP API,發音為“happy”)是一個抽象了現有Node API的新框架。Express更老,更成熟。Express代碼看起來更像本地Node。

Hapi的核心更多

在某些情況下,Express需要中間件來執行Hapi內部處理的任務。表格處理就是一個很好的例子。

Hapi解析表單數據並將其公開在請求對象上。相反,Express需要body-parser中間件提供相同的功能。

速度更接近節點

Express比Hapi少一些觀點,因為它不像Node那樣抽象。這兩個框架都具有可擴展性和適應性。但是,Express“感覺”更像是一個本地Node應用程序。Hapi提供了更多來自Node的抽象。長時間的節點開發人員可能更喜歡Express的熟悉程度,或者他們可能會喜歡Hapi提供的抽象。

Hapi使用插件和快速使用中間件

Express使用中間件

為開發人員提供訪問請求/響應管道的權限。開發人員可以訪問節點req和res請求/響應對象。Express應用程序將中間件“鏈接”在一起,以處理請求和響應。每個中間件組件都有一個明確定義的工作,將關注點隔離在每個組件中。

相比之下,Hapi使用插件來擴展其功能。插件在運行時通過代碼進行配置。有各種各樣的Hapi插件,其功能包括路由,身份驗證,日誌記錄等等。每個Express中間件組件通常都有一個Hapi插件,這使得Express和Hapi在功能方面或多或少相同。

表達 Hello World

這是一個簡單的快速應用程序:

var express = require('express');

var app = express();

app.get('/', function (req, res) {

res.send('Hello World!');

});

app.listen(3000, function () {

console.log('Example app listening on port 3000!');

});

它簡短而又甜蜜,可以完成工作。該app.get函數為/請求定義一個處理程序,該處理程序返回文本“Hello World!”處理程序獲取req(請求)和res(響應)參數。最後一行啟動服務器。

以下是使用一箇中間件的示例:

var express = require('express');

var cookieParser = require('cookie-parser');

var app = express();

app.use(cookieParser());

app.get('/', function (req, res) {

console.log("Cookies: ", req.cookies);

res.cookie("greeted", "true").send('Hello World!');

});

app.listen(3000, function () {

console.log('Example app listening on port 3000!');

})

此示例包含cookie-parserExpress中間件,用於從請求中讀取和寫入Cookie。中間件res使用與cookie相關的方法和屬性擴展對象。

Hapi Hello World

'use strict';

const Hapi = require('hapi');

// Create a server with a host and port

const server = Hapi.server({

host: 'localhost',

port: 8000

});

// Add the route

server.route({

method: 'GET',

path: '/hello',

handler: function (request, h) {

return 'Hello World!';

}

});

// Start the server

async function start () {

try {

await server.start();

}

catch (err) {

console.log(err);

process.exit(1);

}

console.log('Server running at:', server.info.uri);

};

start();

Hapi比Express快一點。Hapi應用程序圍繞著server對象。應用程序的行為通過設置該對象的屬性進行配置。相比之下,快速應用程序app.get和Hapi公開了一個server.route集合。

現在,我們來看看如何處理cookie。

'use strict';

const Hapi = require('hapi');

// Create a server with a host and port

const server = Hapi.server({

host: 'localhost',

port: 8000

});

server.state('myCookie', {

ttl: null,

isSecure: true,

isHttpOnly: true,

encoding: 'base64json',

clearInvalid: false, // remove invalid cookies

strictHeader: true // don't allow violations of RFC 6265

});

// Add the route

server.route({

method: 'GET',

path: '/hello',

handler: function (request, h) {

const cookie = request.state.myCookie;

console.log(cookie);

return response('Hello World!').state('myCookie', { greeted: true });

}

});

// Start the server

async function start () {

try {

await server.start();

}

catch (err) {

console.log(err);

process.exit(1);

}

console.log('Server running at:', server.info.uri);

};

start();

Hapi在其核心中包含cookie處理 - 我們甚至不需要插件來設置和讀取cookie。該cookie使用server.state屬性進行配置,然後在GET處理程序中讀取和寫入/路由。

Express和Hapi通常同樣有能力。他們的分歧主要是哲學的。一些應用程序可能受益於Hapi提供的抽象。使用Express的“接近金屬”方式,其他應用可能會更好。

儘管兩者同樣有能力,但Hapi和Express並非同等表現。我們來看看他們如何比較基準,以及純粹的Node應用程序。

性能測試:他們是如何做的?

Hapi vs. Express性能測試是在運行Ubuntu的D系列Azure虛擬機上進行的。通常,我們會在本地系統上添加一個測試。不幸的是,Linux的Windows子系統中的套接字錯誤使測試無效。

像往常一樣,該測試使用Apache Bench來衡量請求性能。每個框架基準重複五次,下面的最終結果是五次測試的平均值。

我測試了以下版本:

  • Node.js v9.11.1
  • Express.js v4.16.3
  • Hapi.js v17.3.1

結果

以下是測試的結果:

Azure D系列Ubuntu VM | Framework | req/s | |–|–| | Node| 7770.042 | | Express| 4570.692 | | Hapi | 3992.902 |

2018年Hapi vs. Express:Node.js框架比較

這些結果對你意味著什麼

該測試與過去的結果一致。Express繼續保持在Hapi上的性能優勢。差異不是很大,但是可以衡量。具有顯著性能要求的應用程序應考慮Express對Hapi的優勢。如果性能不如關注,那麼您可能更喜歡Hapi“開箱即用”提供的額外功能。性能之外,差異的大部分影響取決於應用程序的可讀性和可維護性。

如何複製Hapi與Express測試

如果您想為自己嘗試這些基準,請克隆GitHub 存儲庫,然後執行以下命令:

bash

./install.sh

./run.sh


分享到:


相關文章: