【整理】nodejs框架技术选型

NodeJS 的 Web 框架有很多,目前常见的主要包括 ExpressJS、KoaJS、NestJS、MidwayJS 等,我们做个简单介绍,做个简单的对比。

Express(59K Stars)

基本介绍

Express 是 NodeJS 早期率先出现的一款框架,现在仍然非常流行,包括前端本地开发常用的 WebpackDevServer,底层就是基于它实现的。

核心特性

Express 是基于函数回调实现异步的,采用 Node 中最常见的 Error-First 的模式设计的,和 NodeJS 本身设计非常相似,非常经典。 同时内置许多常用中间件,可谓是大而全,让人省心。

HelloWorld 示例

const express = require('express');
const app = express();// 中间件
app.use((req, res, next) => {next();
});// 路由
const router = express.Router();
router.get('/hello', (req, res) => {res.send('Hello World!');
});
app.use(router);// 静态资源访问
app.use(express.static('./static'));// 端口监听
app.listen(3000);

Koa2(33K Stars)

基本介绍

随着 ECMAScript 的发展,Async Functions(ES2017)同步方式写异步代码的方式开始流行, KoaJS 一个新的 web 框架,由 Express 原班人马打造,诞生了。

核心特性

Koa2 基于 Async Functions 实现,而使用 Try-Catch 来捕获错误。

Koa2 更关注框架本身性能体积以及定制扩展性,可谓是小而精。而对于后端开发常用的 session,视图模板,路由,文件上传,日志管理等方案,更多由社区提供。

HelloWorld 示例

const Koa = require('koa');
const Router = require('koa-router');
const serve = require('koa-static');
const app = new Koa();// 中间件
app.use(async (ctx, next) => {await next();
});// 路由
const router = Router();
router.get('/hello', (ctx) => {ctx.body = 'Hello World!';
});
app.use(router.routes());// 静态资源访问
app.use(serve('./static'));// 端口监听
app.listen(3000);

NestJS(33K Stars)

基本介绍

不同于前两者,NestJS 是一套成体系的 NodeJS 后端开发框架。

核心特性

  • 采用 TypeScript(JS 的超集语言) 提供优秀的类型支持
  • 底层平台依赖无关,默认基于 Express 框架实现,可以使用 Express 提供的 API、对象等;同时通过底层 API 适配器,底层也可以替换成其它平台,比如 fastify、http://socket.io 等(目前已官方支持,但好像还不支持 koa)
  • 装饰器路由,基于装饰器实现某个 API 的定义,包括路径、请求方法、入参等快速定义,实现路由去中心化
  • 支持依赖注入,通过装饰器声明快速实现 Service 依赖注入进其它 Service 或者 Controller 中

HelloWorld 示例

使用 Nestjs 开发 Rest API,主要围绕着以下三个东西:

  • Controller 控制器,主要负责路由验证和管理;
  • Service 服务,主要负责数据库 CRUD 逻辑的封装编写;
  • Module 模块,主要负责整合 controllers 和 Service,也可以导出给其它模块复用。

大致目录结构和写法如下:

// app.controller.ts    ****************************
import { Controller, Get } from "@nestjs/common";
import { AppService } from './app.service';// 路由
@Controller("/")
export class AppController {constructor(private readonly appService: AppService) {}@Get("hello")getHello() {return this.appService.getHello();}
}// app.service.ts    ****************************
import { Injectable } from "@nestjs/common";@Injectable()
export class AppService {async getHello(): string {return "Hello World!";}
}// app.module.ts    ****************************
import { Module } from '@nestjs/common';
import { ServeStaticModule } from '@nestjs/serve-static';
import { AppController } from './app.controller';
import { AppService } from './app.service';@Module({imports: [// 静态资源访问ServeStaticModule.forRoot({ rootPath: './static' }),],controllers: [ AppController ],components: [ AppService ],
})
export class appModule {}// main.ts(约定:src根目录下且必须该文件命名)    ****************************
const app = await NestFactory.create(AppModule);
// 端口监听
app.listen(9000);

Midway(6K Stars)

基本介绍

Midway 是阿里推出的一款基于渐进式理念研发的 Node.js 框架。

核心特性

其设计方向上应该是和 NestJS 对标的,包括 TS、装饰器路由、依赖注入等基本特性基本都支持。

不一样的是,Midway 底层默认依赖的 Koa,而不是 Express。

HelloWorld 示例

使用 Midway 开发 Rest API,使用方式和 NestJS 大同小异。

但有点儿不一样的是,你无需声明 Modules 模块整合 ControllersServices,然后在根 AppModule imports 声明。

在 Midway 中,你只需要在项目内 Controller 控制器实现的地方声明 @Controller("/xxx"),最终路由 /xxx 即可生效,这点还是比较方便的。

大致目录结构和写法如下:

// app.controller.ts    ****************************
import { Controller, Get, Inject } from "@midwayjs/decorator";
import { AppService } from './app.service';// 路由
@Controller("/")
export class AppController {@Inject()appService: AppService;@Get("/hello")getHello() {return this.appService.getHello();}
}// app.service.ts    ****************************
import { Provide } from "@midwayjs/decorator";@Provide()
export class AppService {async getHello(): string {return "Hello World!";}
}// configuration.ts(约定:src根目录下且必须该文件命名)    ****************************
import { App, Configuration } from '@midwayjs/decorator';  
import { ILifeCycle } from '@midwayjs/core';  
import * as koa from '@midwayjs/koa';@Configuration({  
imports: [koa],  
importConfigs: ['./config/config.default')],  
})  
export class ContainerLifeCycle implements ILifeCycle {async onReady() {}
}// config/config.default.ts    ****************************
import { MidwayAppInfo } from '@midwayjs/core'export default (appInfo: MidwayAppInfo) => {koa: {// 端口监听port: 9000,}
}

NextJS和NuxtJS

NextJS和NuxtJS放到一起说,这两个框架主要用于react和vue项目的ssr渲染。

服务器端渲染(ssr):可以极大地提高页面的加载速度和SEO效果。

  • NextJS是一个基于React的前端开发框架,它提供了完整的SSR支持,包括路由、数据获取和代码拆分等功能。
  • NuxtJS是一个基于Vue.js的服务端渲染框架,它同样提供了SSR以及其他高级功能,如状态管理、中间件和API路由等。

总结和对比

ExpressJS、KoaJS属于基础框架,使用于临时开发、demo、和基础。

NestJS、MidwayJSWeb 服务端开发和工作开发使用

NestJS、MidwayJS两者能力和使用方式上大同小异,所以选谁都可以。由于底层依赖框架不同(虽然很少能感知到底层),那么,熟悉 KoaJS 的可以尝试 MidwayJS,熟悉 Express 可以尝试 NestJS

转载说明:此文章是以前从网上收录的文章,现在找不到在哪看到了,仅供参考,如有不便,联系后删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/63156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 绘图工具详解:使用 Matplotlib、Seaborn 和 Pyecharts 绘制散点图

目录 数据可视化1.使用 matplotlib 库matplotlib 库 2 .使用 seaborn 库seaborn 库 3 .使用 pyecharts库pyecharts库 注意1. 确保安装了所有必要的库2. 检查Jupyter Notebook的版本3. 使用render()方法保存为HTML文件4. 使用IFrame在Notebook中显示HTML文件5. 检查是否有其他输…

处理一个MP4视频,检测里面出现的人脸,并根据特征值计算相似度来追踪和显示出每个人脸的ID

使用Mediapipe, opencv 处理一个MP4视频,检测里面出现的人脸,然后使用Mediapipe 计算每个出现的人脸的特征值,并根据特征值计算相似度来追踪和显示出每个人脸的ID import cv2 import mediapipe as mp import numpy as np# 初始化Mediapipe人脸检测和FaceMesh模型 mp_face_de…

【链表】力扣 141. 环形链表

一、题目 二、思路 龟兔进行赛跑 龟的速度是 1,兔的速度是 2龟兔从同一起点出发,若 龟追上兔 则说明 有环 存在;若追不上,则说明无环。 三、代码 /*** Definition for singly-linked list.* class ListNode {* int val;* …

Spring中使用Async进行异步功能开发实战-以大文件上传为例

目录 前言 一、场景再现 1、Event的同步机制 二、性能优化 1、异步支持配置 2、自定义处理线程池扩展 3、将线程池配置类绑定到异步方法 三、总结 前言 在之前的博客中,曾将讲了在SpringBoot中如何使用Event来进行大文件上传的解耦,原文地址&am…

PyTorch 深度学习框架简介:灵活、高效的 AI 开发工具

PyTorch 深度学习框架简介:灵活、高效的 AI 开发工具 PyTorch 作为一个深度学习框架,以其灵活性、可扩展性和高效性广受欢迎。无论是在研究领域进行创新实验,还是在工业界构建生产级的深度学习模型,PyTorch 都能提供所需的工具和…

面试技巧,金字塔原理,思考、表达和解决问题的逻辑方法

目录 一、基本结构 二、思考过程中的应用 三、表达过程中的应用 案例1:项目汇报 案例2:营销策划方案 案例3:员工培训课程设计 金字塔原理是一种思考、表达和解决问题的逻辑方法,由芭芭拉・明托(Barbara Minto&am…

C++中的封装性

概念 在C中,封装性是面向对象编程(OOP)的一个核心特征,它主要通过类和对象来实现。封装性指的是将数据和操作这些数据的方法结合在一起,形成一个自给自足的实体,这种做法有助于提高代码的安全性和可维护性。下面是对C中封装性的详…

MATLAB在生态环境数据处理与分析中的应用

专题一 MATLAB编程入门 要点:介绍、案例演示、软件界面、语法基础、基本运算等 专题二(试听) MATLAB编程入门 要点:脚本编写、函数调用、循环控制、代码调试、文件读写等 专题三 MATLAB可视化与绘图 要点:交互式…

Qt 2D绘图之五:图形视图框架的结构、坐标系统和框架间的事件处理与传播

参考文章链接: Qt 2D绘图之五:图形视图框架的结构和坐标系统 Qt 2D绘图之六:图形视图框架的事件处理与传播 图形视图框架的结构 在前面讲的基本绘图中,我们可以自己绘制各种图形,并且控制它们。但是,如果需要同时绘制很多个相同或不同的图形,并且要控制它们的移动、…

Qt开发技巧(二十四)滚动部件的滑动问题,Qt设置时区问题,自定义窗体样式不生效问题,编码格式问题,给按钮左边加个图,最小化后的卡死假象

继续记录一些Qt开发中的技巧操作: 1.滚动部件的滑动问题 再Linux嵌入式设备上,有时候一个页面的子部件太多,一屏放不下是需要做页面滑动,可以使用“QScrollArea”控件,拖来一个“QScrollArea”控件,将子部件…

基于yolov4深度学习网络的排队人数统计系统matlab仿真,带GUI界面

目录 1.算法仿真效果 2.算法涉及理论知识概要 3.MATLAB核心程序 4.完整算法代码文件获得 1.算法仿真效果 matlab2022a仿真结果如下(完整代码运行后无水印): 仿真操作步骤可参考程序配套的操作视频。 2.算法涉及理论知识概要 在现代社会…

计算机毕业设计项目基于SSM闪光点映像摄影工作室预约系统

源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

vue项目element框架新增和修改弹窗同一个表单清空的问题

弹窗嵌套表单是一个很常见的操作,并且一般这种弹窗表单都兼顾新增和修改两种功能,无非是打开表单数据为空和数据赋值的区别,一个很常见的问题是关闭弹窗怎么让里面的表单清空。 一、注意点击修改时候对象数据的赋值 if(val edit) {// 编辑…

人工智能大模型培训讲师叶梓:Llama Factory 微调模型实战分享提纲

LLaMA-Factory ——一个高效、易用的大模型训练与微调平台。它支持多种预训练模型,并且提供了丰富的训练算法,包括增量预训练、多模态指令监督微调、奖励模型训练等。 LLaMA-Factory的优势在于其简单易用的界面和强大的功能。用户可以在不编写任何代码的…

Creating Server TCP listening socket *:6379: bind: No error

启动redis报错:Creating Server TCP listening socket *:6379: bind: No error 解决方案: 1、直接在命令行中输入 redis-cli.exe 2、输入shutdown,关闭 3、输exit,退出 4、重新输入 redis-server.exe redis.windows.conf&…

qt QSettings详解

1、概述 QSettings是Qt框架中用于应用程序配置和持久化数据的一个类。它提供了一种便捷的方式来存储和读取应用程序的设置,如窗口大小、位置、用户偏好等。QSettings支持多种存储格式,包括INI文件、Windows注册表(仅限Windows平台&#xff0…

Excel中日期格式“年月日 时间”修改为“年月日”

需求: 将Excel中“yyyy-mm-dd hh:mm:ss”格式的时间转换为“yyyy-mm-dd”格式的时间,选中转换后的时间时编辑栏中依然会显示“yyyy-mm-dd hh:mm:ss”格式。 方法一、在原数据列进行转换: 1、选中需要转换的数据列,右键--【设置…

解决Clang 18+不能链接GCC14编译的库的问题

前面笔者的博文MSYS2 MinGW64使用Protobuf新版本踩坑,有提到使用最新的Clang 19.1.4版本在MinGW下无法正常链接使用了Protobuf 28.3的项目,因为MinGW下的项目默认都是使用GCC来编译的,所以如果开发者使用Clang编译器,必然会出现链…

DHCP和DNS

DHCP(动态主机配置协议)和DNS(域名系统)是计算机网络中两个重要的协议,它们在网络的管理和使用中发挥着关键作用。 DHCP(动态主机配置协议) 基本功能 自动分配IP地址:DHCP允许网…

Unity 设计模式-策略模式(Strategy Pattern)详解

策略模式(Strategy Pattern)是一种行为型设计模式,定义了一系列算法,并将每种算法封装到独立的类中,使得它们可以互相替换。策略模式让算法可以在不影响客户端的情况下独立变化,客户端通过与这些策略对象进…