由於Node.js技術債太多,Node.js之父Ryan Dahl乾脆重新建立的專案Deno,經過兩年多的開發,現在終於達到1.0了。

Deno是個JavaScript Runtime,能讓JavaScript和TypeScript程式,在瀏覽器之外的地方執行,並且為了安全起見,所有程式預設在沙盒中執行,而且全面地使用Promises,解決尾延遲(Tail Latency)的問題,不過,Ryan Dahl提到,比起已經發展十年的Node,Deno還很年輕仍有許多限制,開發者在發展專案選擇上要仔細考量。

Node.js在2009年開發,經過了十年發展,現在的JavaScript已經與當時相當不同,Ryan Dahl表示,當時Node必須要發明概念,這些概念被標準組織採納之後,再以不同的實作方式添加到語言中,但隨著JavaScript不斷的發展,還有像是TypeScript出現,管理建置系統和其他繁雜的工具等任務,當使得建構Node.js變成一件困難的事,而且他也認為,Node.js連接外部儲存庫的機制,從根本地整合了NPM儲存庫,這與網頁理想不符。

有鑒於各種因素,Ryan Dahl認為,JavaScript生態系已經發生了巨大變化,是時候進行簡化,他要創造出可用來處理多種任務的高效能腳本環境,而這個產物便是Deno,Deno提供了讓開發者快速編寫複雜功能腳本的獨立工具,可生成單一執行檔,不需要依賴其他工具,在單個檔案就可以定義複雜行為。

和瀏覽器一樣,在預設情況下,Deno會以沙盒執行程式碼,腳本也無法輕易地存取硬碟、開啟網路連接或是任何其他具潛在惡意操作的行為,Deno雖可以讓應用程式存取相機和麥克風API,但是需要經使用者授與權限,其能夠在終端中提供類似的控制,使用者除非在命令列使用--allow-net等特有標籤,應用程式才能使用指定的功能。

由於為了讓Deno適用於更廣泛的領域,因此強調能良好支援JavaScript語言擴展TypeScript,讓開發者能夠選擇性提供類型資訊,Ryan Dahl提到,特別是複雜的伺服器端商業邏輯,類型檢查的需求變得重要,因此Deno在設計時特別考量TypeScript,Deno類型命令的所有內容都提供類型宣告,Deno的標準模組也全部使用TypeScript編寫。

而Ryan Dahl也特別強調了Deno和Promises的深度結合,他提到,當初在發展Node的時候,還沒有Promises或async/await的概念,這些都是之後才出現的,Node是以EventEmitter來提供類似的功能,除了無法獲得async/await的好處之外,EventEmitter模式還會有背壓(Back-Pressure)的問題,而Deno沒有這些問題,Deno從低階繫結層到系統,都緊密的結合Promises。

在發布Deno 1.0的同時,Ryan Dahl也說明了許多Deno當前的限制,他提到,由於Deno不是Node的分支,而是一個全新的實作,從生態系發展角度來說,可能還不適用於部分應用程式,而且Deno與Node套件並不相容,雖然他們提供了一個相容層,計畫逐漸讓Deno能夠直接執行Node程式,不過目前這個專案還只是在初始階段。

而Deno的HTTP伺服器的效能,最大每秒約處理25,000個請求,最大延遲為1.3毫秒,而在類似的Node程式,每秒則可處理34,000個請求,最大延遲介於2到300毫秒之間。Ryan Dahl表示,Deno是一個適當的非同步伺服器,最大延遲的表現比Node更好,而每秒處理25,000個請求應該可以滿足大部分的應用,如果需要更高的處理量,或許不適合採用JavaScript開發。

在擴充套件上,Deno社群正在發展一個全新的套件系統,讓開發者自定義程式來擴展Deno Runtime,不過這個專案也還在初期階段,介面還在開發中未達穩定階段,因此目前要存取Deno提供之外的本機系統還很困難。

熱門新聞

Advertisement