Nest.js口袋书(1)序言

1,106 阅读8分钟

欢迎订阅Nest.js口袋书专栏

如果您觉得这篇文章有帮助的话!给个点赞和评论支持下吧,感谢~

作者:前端小王hs

阿里云社区博客专家/清华大学出版社签约作者✍/者作问访万百NDSC/B站千粉前端up主

疑问是智慧的开始

为什么要学习nest?

首先,不管是学习什么框架或者说技术栈,我们都要有一个出发点,就是我们为什么去学习这一门框架,是为了升职加薪,还是为了实现自己在技术层面上的突破,又或是别人学了自己不学就感觉out了等等原因...前两种原因还存在着技术突破→升职加薪的一个逻辑

不管原因如何,开发者只有找准这个出发点,才会有动力去完整的学习完这整个技术栈

在个人层面上,学习nest对于前端开发者(使用JavaScript作为主要开发语言)来说,能够有一个使用自己熟悉语言去了解企业级框架1的机会,为成为全栈开发者系统架构师打下坚实的基础。我相信在看此篇文章的都是即将月入30k的准系统架构师

“啊?全栈?我只想专注于前端,不学nest可以吗?”

以目前技术迭代的速度和就业形势下,前端开发者转变为全栈开发者已经是一个大的趋势,在简历上写上“熟练前端三剑客”、“熟练操作Vue/React全家桶”等已经变得不具备竞争力,特别是在如今简历技术优势千篇一律的情况下

“那我在简历上写我是Vue/React框架的contributor呢?”

“阿这...当我没说过(写过)上面那段话”

学习路线上,如果您已经学完了基础的前端知识,并且具备了Vue/React/Angular任何一种或以上的框架及全家桶能力,能够独立完成后台管理系统的前端页面能力,并且有进一步往功能模块是如何实现的的方向探索,想独立开发自己的项目并上线的读者,那么选择在express基础上封装的nest无疑是一个非常好的选择

“直接学Spring不香吗?”

确实!这里可能会有读者问,直接学基于JAVA的Spring框架不是更香吗?但实际情况是,Spring的学习周期比nest更长,且对于没有JAVA基础的同学来说需要重新学习JAVA的基础语言知识(基于其他语言的框架也是如此),对于已经就职或实习的前端开发者来说,往往需要花费大量的时间和精力,可能是一场没有终点的持久战2!但nest在开发形式上与Spring有异曲同工之妙,都是OOP(面向对象编程)。可以说掌握了nest后再学习其他具有OOP、IOC(控制反转)、AOP(面向切面编程)核心思想的框架具有事半功倍的效果

使用率受欢迎程度上,可以用github上的Star作个简单的比较。截止本篇文章发稿前,nest的Star数量已达到63.8k,刚好已超过express的63.6k,如下图所示:

nest

express

可以说nest将会在国内逐渐成为后端开发的主流框架(在北美已经如此),完全值得学习!

nest与B站项目使用的express区别在哪里?

nest的底层是基于express进行封装的,但nest不依赖于express框架,在官方文档中可看到这一句话:

Nest aims to be a platform-agnostic framework

即Nest的目标是成为一个平台无关的框架

nest支持两个开箱即用的HTTP平台3,分别是默认的expressfastify。使用的方法是在创建nest实例时传入对应的interface,它会返回一个专用于该平台的函数,例如传入了NestExpressApplication,那么就可以使用express框架相关的函数,这一流程也称为适配器模式,能够帮助开发者在不同的框架中进行切换,减少了在开发中由于不可抗拒等因素而去切换框架进而导致的额外开销

“王哥听说了吗,项目总监又又又换人了,他习惯使用fastify框架”

“好吧,那我们就换成fastify进行开发吧”

// main.ts
const app = await NestFactory.create<NestExpressApplication>(AppModule);

当然,现在我们无需了解上述代码是何含义,笔者将会在下一章介绍安装nest时进行解释

简单来说,不管是什么框架,我们都可以使用nest提供的接口去实现这些框架的功能

expressnest对比,一个特点就是自由,或者说随心所欲,但成也自由,败也自由,企业级的应用开发往往需要对逻辑流程进行严格控制。nest提供了开箱即用的DTO、管道、守卫、异常过滤器、拦截器等特性,保证了代码的可维护性,使其能够在复杂的企业级应用中保证代码的质量。这在express中通常是需要在路由处理程序(router_handler)进行手动实现或安装第三方模块实现,带来的后果是逻辑可能存在不完善,增加了后期维护成本

可以联想的是,TypeScript的出现不也就是为了提高代码的质量吗?其解决了JavaScript弱类型而带来的潜在隐患。而写JavaScript也比写TypeScript更加的自由。所以对于刚使用TypeScript进行开发的同学来说,总感觉不自在,这种感觉可能来自于需要额外添加不少代码,也可能是这样做像是给JavaScript戴上了金箍

nest的优势还在于提供了容器划重点)去管理各种依赖,这一点笔者将会在后续章节进行介绍

如何高效学习nest?

不少跟着笔者学习后台管理系统项目的同学都咨询过如何去从0开始学习一个框架的问题,对于学习nest也是同理。对于一个开源框架,最好的办法是先学习作者提供的开源文档,通常能够在该框架的readme.md介绍中找到,但由于大部分文档都是英文,对国内的开发者有一定的阅读门槛;而中文文档的质量则参差不齐,如下图(nest官方推荐中文文档)所示:

nest中文文档

阅读起来的感受就是👇

有点拗口

此外文档还存在着大量的专业名词,例如适配器工厂单例模式依赖注入等,这些对于了解OOP和设计模式的开发者来说通俗易懂,但对于刚接触的小白来说无疑是一种折磨。这是因为从框架作者的开发角度来说,该框架本身具有一定的门槛,而这就需要学习者拥有一定的开发基础。综上,如果有一定的面向对象思想的开发基础,读文档是个不错的选择,当读完文档后,可进一步阅读框架源码,深入理解设计思路;而对于小白来说,最好的办法是通过视频+文档的形式,对不理解的内容进行记录和咨询前辈。值得一提的是,笔者即我在开始学Vue时也是看官方文档看的一知半解,而当自己深入理解已经是在开发项目的时候了

所以!笔者也会在近期推出nest的基础入门视频,方便大家入门nest

还有一个问题是,学习的话要跟着视频写代码吗?笔者的建议是,看了不写,等于没看!

“王哥,那我是看完再写还是边看边写呢?”

看完再写!看的时候不要写!但看的时候一定要看懂每一步是在做什么,把流程搞懂!至于看完后需不需要盲写则看情况而定(笔者感觉没必要盲写,毕竟写多了就会写了,一开始写不出来很正常)!

本篇最后

码字不易,这一过程涉及到如何将晦涩的概念以通俗的言语表达出来,如果感觉这篇文章对您有帮助,笔者希望能得到您的评论+关注!您的评论+关注是我更文的最大动力!

如果您发现有错字,还请见谅并给予指正建议,笔者会在最短时间内修改并私聊感谢

如果由于不可抗拒因素导致拖更,还请您见谅!

如果需进一步技术交流,请您在首页联系方式内联系我!

Footnotes

  1. 企业级框架通常指的是一种软件系统架构,专门用于大规模企业级应用,例如基于JAVA的Spring框架。这种框架包含多个子系统和模块,具有高性能、高安全性、高可扩展性的特点

  2. 学习JAVA往往需要7-9个月甚至更长(全职状态)

  3. 框架