在這篇文章中,我們對Node.js的Hapi和Express框架進行了一次有趣的比較研究,包括代碼的外觀和執行方式。
在Raygun,在我們實施任何新工具之前,我們總是運行性能測試並喜歡分享結果。這次我們將Hapi與Express進行比較,以幫助您在Node.js框架上做出更明智的選擇。
Node已經成為軟件開發行業的主要產品。過去幾年中JavaScript越來越流行,推動了Node在安裝基礎方面的進步。JavaScript和Node可能首次提供使用單一語言開發整個n層應用程序的機會。
節點速度很快,並且JavaScript無處不在。這是一個完美的比賽。
因為它與所有的網絡平臺,節點為應用程序提供的要領:請求和響應對象,方法來操作的HTTP請求,並且多個(但不是太多更多)。“純粹”節點應用程序的速度很快,但缺乏中間件,路由和插件的支持,從而減少了現代Web應用程序所需的代碼量。這是Web框架閃耀的地方。
這是兩個流行框架之間的戰鬥故事:Hapi和Express。
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 |
這些結果對你意味著什麼
該測試與過去的結果一致。Express繼續保持在Hapi上的性能優勢。差異不是很大,但是可以衡量。具有顯著性能要求的應用程序應考慮Express對Hapi的優勢。如果性能不如關注,那麼您可能更喜歡Hapi“開箱即用”提供的額外功能。性能之外,差異的大部分影響取決於應用程序的可讀性和可維護性。
如何複製Hapi與Express測試
如果您想為自己嘗試這些基準,請克隆GitHub 存儲庫,然後執行以下命令:
bash
./install.sh
./run.sh
閱讀更多 愛碼農 的文章
關鍵字: Node.js 編程語言 JavaScript