為什麼不學基於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進行服務部署等相關的內容。

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