Node.js + TypeScript
開發服務端是什麼樣的體驗,和傳統的服務端語言Java
有什麼不一樣,我來講幾點個人感覺。npm
Node.js
和傳統的後端語言 Java
在設計上是有很大區別的。一個是動態語言,一個是靜態語言;一個是單線程模型,一個是多線程模型。編程
Node.js
其實不是一門語言,它是 Javascript
的服務器運行時環境, 在它出現以前 Javascript
只能運行在瀏覽器中。在這裏咱們也能夠這麼說:Node.js
就是能夠寫服務端的Javascript
。後端
Node.js
是單線程模型,而且是事件驅動和異步I/O(底層是基於c語言實現的libuv庫
),這個是它最基本的特色,和它類似的是Nginx。這個特色決定來它適合的場景:I/O密集、少計算的應用。瀏覽器
舉個例子:
Node.js
的線程模型就像是麥當勞店裏面的負責下單的服務員,客人排隊下單,每一個客人下完單就在旁邊等餐,服務員則繼續爲下一個客人下單。同時,期間若是發現餐櫃有客人的快餐準備好了,就端給旁邊等候的客人。
咱們會發現:雖然只有一我的服務,可是整個過程很是高效。服務器
咱們來分析一下緣由:麥當勞的服務員雖然服務的客人很是多,可是花費在每一個客人身上的時間是很是短的,因此總體上很是高效。同時短板也很明顯:若是碰問題顧客,下單很是慢,排隊的客人就會擁堵。多線程
其實還有一個重中之重:麥當勞服務員能如此高效,要依靠後面提供支持的強大的配送和運營系統。閉包
Java
則是多線程模型,與Node.js
相比,它就是高級餐廳,一對一服務,互不影響,固然成本也是高的。框架
以上這些都是基本運行模型的特性,實際使用仍是要看場景給設計。異步
Javascript
是動態語言,用於腳本等場景時,很是靈活高效。可是業務邏輯場景時,規範性和嚴謹性就不足了,主要表如今:變量、參數、返回值的類型不肯定,容易被用錯;模塊之間的調用、對外提供接口時,契約定義不明確。函數式編程
有了TypeScript
,ES6
以後,上述問題就有了明顯改善,同時TypeScript
強大的類型系統,讓設計和編寫仍然擁有很是好的靈活性和設計空間。
Java
有的接口、泛型、類、繼承和多態,TypeScript
包羅萬象,同時TypeScript
還有交叉類型、聯合類型、映射類型、類型推導和條件類型等黑魔法。
另外,由於TypeScript
是 Javascript
的超集,因此它也具有函數式編程的能力。函數式編程的抽象能力很是強大,能提供不少有用的特性:好比反作用消除
,引用透明
,高階函數
,閉包
,模式匹配
,延遲求值
等等。
Node.js + TypeScript
被愈來愈多的公司用於核心業務,好比:國外的Paypal、Linkedin、Walmart、Netflix等,國內的阿里、騰訊、網易等。 npm
託管的包數量已經超越其餘包託管器。
框架方面,國外的Nest.js
,國內的Midway
已經有了不少成熟應用案例。Nest.js
從編程體驗上,也和Spring
很是類似。
Node.js
後續會日趨成熟,應用範圍也會愈來愈普遍。固然,短時間內還不會替Java
的企業服務主力位置,畢竟能力特性不同,而且生態成熟度、基礎設施成熟度仍是差了不止一個量級的。
Node.js
最新版支持了Worker Thread
,診斷報告
,Heap Dump
,這幾個特性讓它在生產環境的使用愈來愈駕輕就熟,同時還有大幅的速度提高,後續表現可期。