为什么不学基于TypeScript的Node.js服务端开发?

  • 2019 年 11 月 4 日
  • 笔记

为什么不学?学不动了吗?!别躺下啊,我扶你起来!

我们早就知道,如今的JavaScript已经不再是当初那个在浏览器网页中写写简单的表单验证、没事弹个alert框吓吓人的龙套角色了。借助基于v8引擎的Node.js Runtime以及其他一些JavaScript Runtime的平台能力,JavaScript已经成长为在桌面端、移动端、服务端、嵌入端全面开花的妖艳明星。

使用JavaScript做服务端开发,是我一直非常喜欢的一件事情。记得第一次使用JavaScript开发服务端程序,还是在我读大学的时候,那时学习编写古老的ASP页面程序,默认是用VBScript编写的,可是我不太喜欢VBScript的语法,我就去看微软的MSDN文档,发现居然也可以用JScript(微软开发的一种ECMAScript规范的实现)来编写ASP,非常兴奋,果断连夜把之前所有的VBScript代码用JScript替换了一遍。

到后来参加工作,JavaScript也渐渐进入Ajax流行、封装工具库横行的时代。我们使用着各种JS工具库(Prototype,jQuery,Mootools,YUI,Dojo等等等等),前端的开发工作开始慢慢出现了独立化、专业化的趋势,一些软件工程师们(不分前后端,写代码的都叫软件工程师)以及美工师傅们(对,美工!那时候的美工其实很能干的,既做平面设计,也做HTML、JS、CSS的编写)也开始有点跟不上前端的发展速度了,开始各自做各自擅长范围内的事情了,即所谓的纵向发展。而我也是Java和JavaScript都在做,但是用JavaScript来统一做前后端的想法一直存在,并一直关注着这块的动向。没过多久,还真的出现了一个!这就是开发了当时非常流行的前端开发工具Aptana Studio的公司所开发的服务端框架Apatana Jaxer。用这个框架写出来的代码跟当初的ASP还有点像呢:

<script runat="server">    var rs = Jaxer.DB.execute('SELECT * FROM products');    var price = rs.rows[0].price;  </script>

我还用Jaxer写了一些小项目呢,用起来还是非常不错的。只可惜,Jaxer在开发圈子里还是没有真正火起来。

后来,Node.js出现了。由于它基于v8所带来的性能,模块化系统,比较丰富的原生API以及原生扩展能力,以及npm包管理,让整个围绕它形成的生态体系真正的火了起来。而Node.js凭借它异步IO的优异性能、快速开发部署能力、前后端技术栈统一、以及最近流行的SSR风潮,使得它在服务端开发领域真正的占有了一席之地。并且,Node.js的异步思想也带动了其他各种语言下服务端框架的进步与创新,比如Java的Vert.x,WebFlux,Scala的AKA等等。

随着JavaScript在各种前后端项目中的使用量越来越大,开发团队间需要的协作越来越多,JavaScript本来的动态性、灵活性由一个人见人爱的小可爱,变成了一只吃人的大老虎,不仅四处撕咬着缺乏足够经验的开发者,偶尔也会给高级开发者挖个坑埋个雷。这种时候,做过静态语言开发的开发者们会想念起曾经用过的那些C/C++、Java、C#,虽然静态类型检查在开发过程中带来了一些的额外工作量,但也真实的带来了开发质量的提高,以及更好的开发工具支持。

新事物总是在遇到问题和矛盾当中产生,一些拥有类型检查特性的工具或可转译语言诞生了,比如Flow、Dart、还有TypeScript。尤其是TypeScript,凭借着其高富帅背景(MicroSoft)以及自身的优质特性,经过多年的发展,社区越来越大,应用越来越广,着实是受人欢迎,它已经成为了JavaScript生态圈后续发展的一种明显趋势。各种前端框架和Node.js后端框架,都竞相加入对TypeScript的支持,看着不用TypeScript都对不住他们的热情啊!

说来,我第一次使用TypeScript做实际的项目,还是3、4年前的时候。因为那个时候一直在用Angular 1.x作为主要的前端框架,后面Angular发布了全新的Angular 2版本,所以我们团队就顺其自然的开始研究并实践Angular 2。我们都知道,Angular 2完全使用TypeScript来编写,整体编程理念设计上来说也非常的OOP,且内置了RxJS作为响应式编程的基础,以及引入了Java界非常引以为傲的依赖注入机制(IoC),在当时的前端界产生了很大的争议。但是从现在来看,它还是非常有前瞻性的和先进性的。

该来的它还是会来,不该来的它来了也会走。

Angular 2+的设计理念继而对Node.js服务端框架的设计也产生了很大的影响,NestJS算是把Angular的衣钵都成套抢过去的一位了。

NestJS这个框架算是到目前为止,对TypeScript支持的最好的一个Node.js服务端框架了,它的上层框架实现了一套通用的框架机制如:模块、自定义装饰器、依赖注入、控制器、过滤器、管道、守卫、中间件和拦截器等功能;在框架下层,通过适配器适配到其他一些符合其理念的基础HTTP框架如Express、Fastify等。NestJS的这套设计理念使其不光可以作为Web框架使用,也可以用于非Web类程序的开发。

先瞄一瞄用NestJS写的一段代码吧:

import { Controller, Get } from '@nestjs/common';    @Controller('products')  export class ProductsController {      @Get()    findAll(): string[] {      return ['iPhone', 'iMac', 'iPod'];    }  }

上面这段代码就是一个简单的控制器代码,它通过使用2个装饰器 @Controller() 和装饰 @Get() ,将一个普通的class类,变成了一个可以提供Rest API的后端控制器服务。假如这段代码运行起来,它可以被通过这样的URL进行访问:http://use-your-domain/products

是不是挺有意思?今天我就这么简单的扯一通,我准备在后面的文章或视频教程中,一点一点和大家深入探讨TypeScript和NestJS的各种功能特性。不光如此,由于要学习和掌握服务端开发的话,需要涉及的内容还是非常多的,所以我准备再加入一些后端开发过程中会经常用到的东西,比如MySQL、Redis、MongoDB、RabbitMQ;如何在前后端的应用开发中使用GraphQL;以及如何使用Docker进行服务部署等相关的内容。

希望你搬好小凳子,坐等我更新吧!