為什麼我推薦使用Angular + Nest.Js

前言

Node.Js問世以來,帶動JavaScript近十年的高速發展。基本上現在以Angular、React.Js、Vue.Js奠定前端三大基礎。
得利於Node.Js,除了前端的網頁開發,也讓JavaScript的觸角延伸至後端、桌面應用、手機APP…
雖然JavaScript本身有許多缺陷,但在微軟推出TypeScript後,讓整體穩健性強化不少!
做為一個獨立開發者,做Side project或有想要打造自己的個人應用,現在各程式語言都有各種方便框架,都能迅速滿足需求!
曾經也嘗試過Python/django、Node.Js/Egg.Js,也去比較過PHP/Lareval、Java/Spring boot、.net Core…
一直嘗試找出一個最適合的組合,才打算開始做自己的東西。結果時間都花在最底層的框架裡,什麼都沒做!

於是開始認真思考獨立開發最需要的是什麼…?

自己獨立開發所期望的…

  1. 好擴展!要加功能時,最好框架本身就具備該功能。不必再花心力選擇要用什麼套件。
  2. 易維護!具有清晰的邏輯分離。雖然都是自己寫的,但難保放個半年後再回頭只想掐死當時的自己
  3. 語言統一!可以一個語言就搞定一切,不要切換寫法,避免開發過程思路打結
  4. 整套框架用法相似或一致!讓開發思路相近!
  5. 使用Reactive Programing!雖然剛開始須花些心力學習,但掌握後,真心覺得RP讓邏輯清晰好讀許多

條件限縮

由於網頁前端直接綁定JavaScript,也就連帶綁定後端得用Node.Js了…
但其實不太喜歡JavaScript本身就有不少缺陷的語言。若非得使用腳本語言,還比較喜歡Python

所幸有TypeScript,至少在IDE可盡量預防掉不少低級的小錯誤。也就是採用的框架至少本身就是TypeScript最佳,不必花心力再行整合
由於自己已經差不多掌握Vue.Js,一開始想說是否就整套採用中國的egg.Js來打造。至少在官方文件上中文還是比較親切的。
而egg.Js是中國阿里已長期採用一段時間,亦可以確定其穩定度。
而自己之前也花了些心力入門Egg.Js了

最後就是Reactive Programing。JavaScript世界裡最具知名度的就是RxJs了!
在Vue.Js、egg.Js上得另花心力融合,且僅能在業務邏輯採用。並非框架底層混然天成的直接使用

而RxJs對於有些混亂的資料整理,提供的函式幾乎可以直接一條龍理出想要的結果集,幾乎不必再另安裝lodash等相關套件輔助
雖然無腦的npm i沒有什麼成本,但越少的外部套件引用,也降低外部套件發生breaking change或放棄維護(如moment…),配合修改程式的問題


提到TypeScript以及RxJs,前端就會想到Angular!
以及近幾年才剛推出不久的Nest.Js--仿造Angular風格打造出來的後端,兩者都是原生直接使用我所期望的東西!

嘗試改寫現有Side Proeject

於是開始試著把以前做好的Side project嘗試用Angular + Nest.Js改寫
開發過程中,不熟悉的部份在其中一端學會了,通常另一端可以依樣畫葫蘆
整體開發流暢度相當順暢!會有一套框架全包前後端的錯覺!

缺點嘛,就是Nest.Js的文件說明有時會不夠清晰,沒辦法迅速理解某些部份的使用方式
現已有熱心的貢獻者將官方文件翻譯成中文 → Nest.Js手冊。雖然是簡體的,至少比英文親切許多

畢竟算是較新穎的框架,若有看不懂的部份,要Google到答案也會比較辛苦些。但照著官方文件推薦套件去做,基本上足以解決大部份使用情境!
(2021/3/12更新,現網路相關資源甚多,幾乎都搜得到答案了!)

雖然Nest.Js似乎沒有官方文件說明可原生直接使用到多核心,但以小Project來說,仍不是主要煩惱的問題
東西先做出來、推廣有成、有人要使用才是比較首要的事吧XD
若真的流量大到需要多核心,也許再配合PM2之類的套件,此部份仍能Google到不少教學

總結

最後決定落腳於Angular + Nest.Js做為未來Side project的主力結構,不在三心二意的去比較框架優劣
也深深感受到網路上高手們所說的:

每個框架都有其適合的場景

而Node.Js採用Google V8 engine,其強大的效能在許多中小型場景下都足以輕鬆應付。
效能面有Google大神當靠山,只要定期更新自己的Node.Js版本,基本上只需要留意自己的業務邏輯是否寫的太差,且配合TypeScript,不必太煩心語言面的問題。

Node.Js的作者已重新打造一套deno,明顯就是要取代Node.Js。雖然現在還處於早期開發階段,無法直接使用。
但此組合已全面使用TypeScript,只需要靜待deno使用量越來越大、其相應框架都成熟後,再跳過去就行。短時間要淘汰掉Node.Js也是不太可能。

Nest.Js相似java/spring boot,其學習經驗亦能幫助並迅速上手java/spring boot。在就業機會上,此選擇相當地多。可避免職涯路線窄化!

最後小小總結一下優缺點:

優點

  1. 前後端結構幾近一致,開發體驗舒適。不熟悉的部份在其中一端學會了,通常另一端可以依樣畫葫蘆
  2. 框架原生且全面採用RxJs
  3. 框架原生且全面採用TypeScript
  4. 邏輯拆分清晰明確
  5. Nest.Js相似java/Spring boot、.net Core,在未來職涯轉換上多一個選擇。基本上語言語法過完,就差不多可以直接用了
  6. 若deno已成熟穩定且幾近取代Node.Js,轉換陣痛期低。因為本來就是TypeScript

缺點

  1. Nest.Js文件省略許多,對於後端經驗不熟悉者會難以快速掌握
  2. Angular對於初學者來說,難以短時間上手。但仍值得花心力學習,其所學到的精神相當受用
  3. Nest.Js不像egg.Js框架直接內置多核心使用。但以Side project來說,Node.Js本身效能應足以應付。若有需要,仍可配合PM2等套件來做到。

2021/03/12 更新

截至Po文後2年回顧,Nest.Js已經完全站穩Node.Js後端代表作
deno正式釋出--仍處於早期階段,目前來說仍是動搖不了Node.Js
畢竟開發最需要的還是充足的資源,npm滿坑滿谷的資源是不可能短時間就消失的

作者也有持續關注deno,當deno站穩腳步後,也會將Nest.Js轉移過去(Nest.Js issue / Support for Deno)

隨著Nest.Js的使用者越來越多,現在各種坑幾乎都可以搜尋到解決方式了
而我自己也將開發過程踩到的坑整理成筆記,縮短大家爬坑的時間XD

若對deno有興趣,想直接當後端使用的,也已經有Dactyl--與Nest.Js一樣的後端框架可以嘗鮮

Nest.Js與Angular的高度相似性,魚幫水、水幫魚的學習歷程,極大化地在短時間上手兩個框架
也讓自己在新手時期寫的混亂程式碼,在其中一端打通任督二脈時,再另一端仍可重新理出、重構成更佳的寫法
使程式碼保持在一個邏輯清晰、乾淨、好維護的狀況

RxJs

不是那麼好上手的RxJs,因在全端使用,也越用越深入
在Angular,因資料集通常是後端取得,取到時都已經是整理後的資料了
不太需要用到太多功能,大部份都是直接subscribe就好
頂多為了解決多component而使用behaviorSubject,或為了部份事件而使用fromEvent…等

而在後端就不是這樣了,後端在資料疏理上,大量地使用groupBymergeMaptap…等
帶來了不一樣的使用感受!
當有必要得在前端才能疏理資料時,完全可以直接複用這些經驗!

這種相輔相成的開發感受,非常舒服!