共计 3662 个字符,预计需要花费 10 分钟才能阅读完成。
简介
Node.js 是 10 年前首次推出的,目前它已经成为世界上最大的开源项目,在 GitHub 上有 +59,000 颗星,下载次数超过 10 亿。流行度快速增长的部分原因是 Node.js 允许开发人员在应用程序的客户端和服务器端部分使用相同的语言:JavaScript。Node.js 是一个开源和跨平台的 JavaScript 运行时环境,专为构建可扩展的服务器端 WEB 应用而设计,自身具有高并发、扩展性强等特点。由于社区其呈指数级增长和普及,因此创建了许多框架来提高生产力。在本文中,我们将探讨 Node.js 中三个最流行的框架之间的差异:Express,Koa 和 Hapi。在以后的文章中,我们将研究 Next,Nuxt 和 Nest。
-
比较基于:
- GitHub Stars 和 npm 下载
- 安装
- 基本的 Hello World 应用程序
- 好处
- 缺点
- 性能
- 安全
- 社区参与
Express
Express 是一个最小且灵活的 Web 应用程序框架,为 Web 和移动应用程序提供了一组强大的功能,它的行为就像一个中间件,可以帮助管理服务器和路由
-
star
- GitHub star:+43,000
- npm 每周下载 6,881,035
-
安装
确保你已经安装 node 和 npm
// 你可以将 express 安装到项目依赖 npm install express --save // 如果要临时安装 Express 而不是将其添加到依赖项列表,则可以使用 npm install express --no-save
-
Hello World
这是关于如何创建一个侦听端口 3000 并响应“Hello World!”的快速应用程序的最基本示例
// 这里只创建根目录 其他目录返回 404 const express = require('express') const app = express() const port = 3000 app.get('/', (req, res) => res.send('Hello World!')) app.listen(port, () => console.log(`Example app listening on port ${port}!`))
-
好处
- 几乎是 Node.js Web 中间件的标准
- 简单,简约,灵活和可扩展
- 快速开发应用程序
- 完全可定制
- 学习曲线低
- 轻松集成第三方服务和中间件
- 主要关注浏览器,模板和渲染集成开箱即用
-
缺点
尽管 Express.js 是一个非常方便且易于使用的框架,但它有一些可能影响开发过程的小缺点。
- 组织需要非常清楚,以避免在维护代码时出现问题
- 随着代码库大小的增加,重构变得非常具有挑战性
- 需要大量的手工劳动,因为您需要创建所有端点
-
性能
Express 是对 web 应用的一层基本封装,继承了 Node.js 的特性
当天也有一些 express 性能的最佳实践包括:
- 使用 gzip 压缩
- 不要使用同步功能
- 正确记录(用于调试,使用特殊模块,如调试,应用程序活动使用 winston 或 bunyan)
- 使用 try-catch 或 promises 正确处理异常
- 确保您的应用程序使用流程管理器自动重新启动,或使用 systemd 或 upstartinit 等系统
- 在群集中运行您的应用。您可以通过启动进程集群来大大提高 Node.js 应用程序的性能
- 缓存请求结果,以便您的应用不会重复操作以反复提供相同的请求
- 使用负载均衡器运行它的多个实例并分配流量,如 Nginx 或 HAProxy
- 对静态资源使用反向代理。它可以处理错误页面,压缩,缓存,提供文件和负载平衡等
- 更多性能最佳实践
一个简单的“Hello World”应用程序每秒具有以下性能请求:
-
安全
Node.js 漏洞直接影响 Express,因此确保使用最新的稳定版 Node.js
- 查看 express 最佳安全实践
-
社区参与
- 贡献者数量:220
- Pull Requests:821
- Express 社区定期活动包括 Gitter,IRC channel, issues, Wiki 等等
最后,express 可能是 Node.js 最流行的框架,还有许多其他流行的框架都是基于 Express 构建的。
koa
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造,致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理 Koa 并没有捆绑任何中间件而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序
-
star
- GitHub star:+25,000
- npm 每周下载:+ 300K
-
安装
Koa 需要 nodev7.6.0 以上版本支持,因为内部使用了 ES6 的特性
npm i koa node my-koa-app.js
-
Hello World
创建一个 web 服务,监听 3000 端口返回‘Hello World’
const Koa = require('koa'); const app = new Koa(); app.use(async ctx => {ctx.body = 'Hello World';}); app.listen(3000);
-
好处
- Koa 提高了互操作性,健壮性,使编写中间件变得更加愉快。
- 集成了大量的 web API,但是没有绑定中间件
- 非常轻量,核心的 Koa 模块只有大约 2K 行代码
- 拥有非常好的用户体验
- 通过 try / catch 更好地处理错误
- 异步控制流,代码可读性更高
-
缺点
- Koa 社区相对较小
- 与 Express 风格的中间件不兼容(目前还有遇到与其他框架兼容的中间件)
-
性能
Koa 本身是一个非常轻量级的框架, 可以构建具有出色性能的 Web 应用程序。代码可读性和维护性都相对较高
当然一些性能的最佳实践也是必不可少的,例如:
- 集群
- 并行运行
- 在代码中使用异步 API
- 保持代码小而轻
- 以及使用 gzip 压缩 等等
一个简单的“Hello World”应用程序每秒具有以下性能请求:
-
安全
Koa 有大量的中间件,提供相应的功能 贴图一张
-
社区
- 贡献者数量:169
- Pull Requests:577
- 关于 koa 的一些讨论
最后,Koa 专注于核心中间件功能,设计显式地利用了 async/ waiting 使异步代码可读性更高
Hapi
Hapi 是基础功能相对丰富的框架。开发人员更专注于业务,而不是花时间构建基础架构。配置驱动的模式,区别于传统的 web 服务器操作。他还有比一个独特功能,能够在特定的 IP 上创建服务器,具有类似的功能 onPreHandler。再需要的时候你可以拦截特地的请求做一些必要的操作
-
star
_ GitHub Stars: +11000- npm 周下载: +222,293
-
安装
确保你已经安装 node
npm install hapi
-
Hello World
以下示例是使用 hapi 的最基本的 hello world 应用程序:
'use strict'; const Hapi=require('hapi'); // 创建一个服务监听 8000 端口 const server=Hapi.server({ host:'localhost', port:8000 }); // 添加路由 server.route({ method:'GET', path:'/hello', handler:function(request,h) {return'hello world';} }); // 启动服务 const start = async function() { try {await server.start(); } catch (err) {console.log(err); process.exit(1); } console.log('Server running at:', server.info.uri); }; start();
-
好处
- 提供了一个强大的插件系统,允许您快速添加新功能和修复错误
- 可扩展的 API
- 对请求处理有更深层次的控制。
- 创建(REST)api 的最佳选择,提供了路由、输入、输出验证和缓存
- 一次编写适配各端
- 详细的 API 参考和对文档生成的良好支持
- 与任何前端框架(如 React,Angular 和 Vue.js)一起使用来创建单页面应用程序
- 基于配置的伪中间件
- 提供缓存,身份验证和输入验证
- 提供基于插件的扩展架构
- 提供非常好的企业插件,如 joi,yar,catbox,boom,tv 和 travelogue
-
缺点
- 代码结构复杂
- 插件不兼容,只能使用指定的插件如:catbox joi boom tv good travelogue 等
- 端点是手动创建的,必须手动测试
- 重构是手动的
-
性能
2017 年对 Node 框架的研究表明 hapi 相对于其他框架的表现最差
一个简单的“Hello World”应用程序每秒具有以下性能请求:
-
安全
hapi 安全性主要依赖于插件
插件选择- Crumb 反(XCSRF)验证插件。它适用于常规请求和 CORS 请求
- Joi:JavaScript 对象的对象模式描述语言和验证器
- Hapi-rbac 用户的访问权限控制
- Blankie 足够灵活的白名单作机制
- Cryptiles 加密库
-
社区
- 贡献者数量:184
- Pull Requests:1176
最后 Express 仍然是当下最为流行,koa 因拥抱 ES6 正在崛起,hapi 还是大型项目的第一选择
不管是 Express,Koa 还是 Hapi 目前都是非常成熟的框架。几乎都能满足你的需求,没有最好,只有最合适