NestJS 使用体验 | 不如 Spring Boot

news2024/11/15 12:04:29

阿里云推广

本博客站点已全量迁移至 DevDengChao 的博客 https://blog.dengchao.fun , 后续的新内容将优先在自建博客站进行发布, 欢迎大家访问.

文章目录

  • 前言
  • 正文
    • 开发体验
    • 运行体验
  • 总结
  • 相关内容
  • 推广

前言

公司里近期在尝试部署一些业务到阿里云的函数计算上, 受之前迁移已有的 Spring Boot 应用到 FC 上的体验影响, 因此尝试使用 NodeJS 来作为新服务的主要运行环境. 几番尝试后得出了一些感悟, 在此记录一下, 以供大家参考.

正文

开发体验

  • 受 NodeJS 生态圈的影响, 基于 NestJS 框架开发的工程也无处不体现着 NodeJS 生态的繁荣与杂乱…
    你的工程文件夹下散落着各式各样的配置文件, 例如: .eslintrc.js, .nvmrc, .prettierrc, jest.setup.ts, nest-cli.json, tsconfig.json … …
    工程根目录

    基于 Gradle 或 Maven 构建的 Spring Boot 工程与之相比, 则基本上不需要考虑 lint 与转义等问题.
    (当然, 与 C/C++ 工程相比还是好很多了… 毕竟人家大把的源文件都列在根目录下呢.

  • 开发语言方面使用 TypeScript 来弥补 JavaScript 在类型定义方面的不足, 但即便如此, IDE 提供的类型推断与自动补全功能依然十分有限, 按 Ctrl + Space 后等待 IDE 反馈的时间基本上够你打完需要补全的内容了…

  • DI/IoC 能力有限, 需要你自己使用各式各样的 @Module()去构建依赖图, 各个模块之间需要主动暴露组件, 并主动声明需要注入哪些组件才能运行.
    CertificateRunModule

  • 约定大于配置的理念基本不存在.

    • 想加载配置文件? 你得自己定义配置文件的位置和加载顺序.
      在这里插入图片描述
    • 想连接数据库? 你得自己定义从配置文件里加载哪几项配置.
      在这里插入图片描述
  • NestJS 社区首推 Passport.js 来实现用户的身份认证相关的功能, 但这个包的主体目前是 一个由个人维护的项目, 主要维护人员除了基础的接口定义外, 还同时维护着基于这个接口的大量功能实现, 例如基于 Basic , JWT, Token 等实现的认证功能.
    由于人力的缺失与长跨度的开发/维护周期, 导致其部分功能实现由于时间先后的差异, 出现风格不统一, PR 长时间无人受理等问题.
    同时 NestJS 对 Passport.js 进行了包装, 导致部分 Passport.js 的功能实现不能直接适用于 NestJS 工程.

    更让开发体验直线下降的是这一部分的代码没有提供 TypeScript 编写的源文件, 而是基于各式各样的 index.d.ts + index.js 来提供的, 这导致开发团队在学习/调试相关功能时, IDE 的 Ctrl + B (查看接口实现) 功能完全失效, 需要手动定位到指定的 js 文件才能了解其内部的工作流程.
    NestJS 对 Passport.js 的封装更让这一部分陷入难以理解的回调地狱:
    PassportStrategy

    请简述 PassportStrategy 的功能
  • 不得不说, NestJS 还是很良心的给了开发者一个做单元测试的包. TestingModule 里能直接拿到运行环境中的对象, 可以直接对 service 进行测试, 也可以利用 Jest 的 spyOn() 方法对 service 对象的方法进行拦截, 然后通过 SuperTest 对 NestJS 的控制器进行端到端测试.
    另外, Jest 是基于文件进行单元测试的, 而不是基于类进行的, 导致有一部分通用的测试用例 setUp()tearDown() 需要写在单独的文件里, 然后再在需要的测试文件的 setUp()tearDown() 里去调用这个公用的辅助函数. 这一点我觉得 OOP 做的更好一些, JUnit 就可以通过继承抽象类的方式来自动加载公共的 setUp()tearDown() .

运行体验

  • NestJs 在运行时解析依赖图, 构建上下文真的要花很长时间 ( await NestFactory.create(AppModule, config) )… 下一个服务我们决定尝试一下 Quarkus 了.
  • 本来想着 NodeJS 项目打包后体积小一点, 函数的冷启动时间能更短一些, 结果开发完打包一看也有 127Mb … 我有这个产物体积为什么不直接用 Spring Boot …

总结

只能说, 体验不如 Spring Boot, 硬要说的话, 与 Spring Framework 相当.

相关内容

  • NestJS
    • 数据库集成
    • 配置方式
    • 身份认证
    • 单元测试
  • 阿里云 函数计算

推广

欢迎大家领取 阿里云优惠券, 新购续费更优惠, 更有最高 10 %
返现,详询 钉钉:
限量阿里云优惠券

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

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

相关文章

TestStand-调试VI

文章目录调试VI调试VI 在LabVIEW PASS/FAIL TEST步骤中放置一个断点。 ExecuteRun MainSequence。执行在LabVIEW PASS/FAIL处暂停测试步骤。 3.完成以下步骤来调试LabVIEW PASS/FAIL TEST VI步骤。 a.在TestStand的调试工具栏上单击step into(步进)…

System V IPC+消息队列

多进程与多线程 使用有名管道实现双向通信时,由于读管道是阻塞读的,为了不让“读操作”阻塞“写操作”,使用了父子进程来多线操作, 1)父进程这条线:读管道1 2)子进程这条线:写管道2…

【二叉树的顺序结构:堆 堆排序 TopK]

努力提升自己,永远比仰望别人更有意义 目录 1 二叉树的顺序结构 2 堆的概念及结构 3 堆的实现 3.1 堆向下调整算法 3.2 堆向上调整算法 3.3堆的插入 3.4 堆的删除 3.5 堆的代码实现 4 堆的应用 4.1 堆排序 4.2 TOP-K问题 总结: 1 二叉树的顺序结…

分享几招教会你怎么给图片加边框

大家平时分享图片的时候,会不会喜欢给照片加点装饰呢?比如加些边框、文字或者水印之类的。我就喜欢给图片加上一些边框,感觉加了边框的照片像裱在相框中的感觉似的,非常有趣。那么你知道如何给图片加边框吗?不知道的话…

【Nginx】01-什么是Nginx?Nginx技术的功能及其特性介绍

目录1. 介绍1.1 常见服务器的对比1)IIS2)Tomcat3)Apache4)Lighttpd1.2 Nginx的优点(1) 速度更快、并发更高(2) 配置简单、扩展性强(3) 高可靠性(4) 热部署(5) 成本低、BSD许可证2. Nginx常用功能2.1 基本HTTP服务2.2 高级HTTP服务…

华为数通2022年11月 HCIP-Datacom-H12-821 第二章

142.以下关于状态检测防火墙的描述,正确是哪一项? A.状态检测防火墙需要对每个进入防火墙的数据包进行规则匹配 B.因为UDP协议为面向无连接的协议,因此状态检测型防火墙无法对UDP报文进行状态表的匹配 C.状态检测型防火墙只需要对该连接的第一…

性能测试-CPU性能分析,IO密集导致系统负载高

目录 IO密集导致系统负载高 使用top命令-观察服务器资源状态 使用vmstat命令-观察服务器资源状态 使用pidstat命令-观察服务器资源状态 使用iostat命令-观察服务器资源状态 IO密集导致系统负载高 stress-ng -i 10 --hdd 1 --timeout 100-i :有多少个工作者进行&#…

函数的极限:如何通过 δ 和 ϵ 来定义一个连续的函数

连续的定义 维基百科给出的定义: 连续函数(英语:Continuous function)是指函数在数学上的属性为连续。直观上来说,连续的函数就是当输入值的变化足够小的时候,输出的变化也会随之足够小的函数。 所以不要直…

51单总线控制SV-5W语音播报模块

单总线控制SV-5W语音播报模块SV-5W语音播报模块SV-5W语音播报模块简介工作模式说明模块配置接线驱动部分代码效果展示SV-5W语音播报模块 SV-5W语音播报模块简介 DY-SV5W是一款智能语音模块,集成IO分段触发,UART串口控制,ONE_line单总线串口控…

macOS monterey 12.6.1安装homebrew + nginx + php + mysql

效果图 主要步骤 安装homebrew使用brew安装nginxphpmysql详细步骤 参考“Homebrew国内如何自动安装(国内地址)(Mac & Linux)”安装brew, 命令: /bin/zsh -c "$(curl -fsSL https://gitee.com/cu…

[附源码]java毕业设计网上学车预约系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

教你十分钟在Linux系统上快速装机并安装Ansible

PS:本教程建立在VMware软件上的使用上,Linux版本为centos7或者centos8都可以。 一、看发行版本 cat /etc/redhat-release 二、修改主机名 hostnamectl set-hostname centos8 三、自动获取IP地址 nmcli connection modify ens160 autoconnect yes 四、设置…

软件设计(一):统一建模语言基础知识

1.UML简介 1.1 UML简介 UML语言是一种可视化的标准建模语言,它是一种分析和设计语言,通过UML可以构造软件系统的蓝图。 1.2 UML的结构 1.2.1 视图(view) 1.2.2 图(daigram) 用例图 类图 对象图 包图…

C/C++ 语言怎么保留n位小数并且四舍五入

1、普通的printf输出打印 printf()函数的用例 float date=123.456; printf("date=%.2f\n", date);//保留2位 printf("date=%.1f\n", date);//保留1位 输出 2、获取四舍五入后的数据 1、使用round函数 C ++ round()函数 (C++ round() function) round(…

ELK技术栈简介

ELK技术栈简介ELK是什么ELK组件ElasticsearchES基本概念ES适用场景LogstashInput插件Filter插件Output插件CodecsKibanaBeatsELK是什么 ELK 即 Elasticsearch Logstash Kibana,是指Elastic公司开发的三种免费开源软件。其中,Elasticsearch是一个基于A…

基于PHP+MYSQL在线小说阅读网的设计与实现

随着互联网信息的发展,人们在闲暇的时候更多的原因选择小说来进行阅读,一方面扩展自己的阅读圈,另一方面消磨闲暇时光,但是当下的很多小说网站,要么是要收取高昂的阅读法,要么就是整个网站多充斥着大量的广告,为了给广大网友一个健康,免费的阅读空间我们开发了本系统 本在线小说…

【JS】数据结构之树结构

文章目录树结构二叉树二叉搜索树平衡树(AVL树)红黑树回顾其他数据结构(每种数据结构都有自己特定的应用场景): 数组:通过下标查询很快,插入和删除数据的时候,效率会很低,…

新品上线 | 企企通推出达人管理系统,助力达人营销提效增速

01、直播市场发展迅速 企企通达人管理系统应运而生 近年来,直播凭借其即时性、互动性、多样化的优势,迅速在互联网占据一席之地,“直播”模式不断扩展,直播电商应运而生。 在技术发展与市场需求双重驱动下,中国直播市…

day04 springmvc

day04 springmvc 第一章 SpringMVC运行原理 第一节 启动过程 1. Servlet 生命周期回顾 生命周期环节调用的方法时机次数创建对象无参构造器默认:第一次请求 修改:Web应用启动时一次初始化init(ServletConfig servletConfig)创建对象后一次处理请求se…

嵌入式Linux系统中ARM汇编语言的使用方法

大家好,今天主要大家聊一聊,如何在ARM中使用汇编语言的方法。 目录 第一:汇编基础简介 第二:处理器内部数据传输指令 第三:存储器访问指令 第一:汇编基础简介 我们在学习嵌入式Linux开发的时候是绝…