Node.js的勁敵來了:Deno是用於在Web瀏覽器之外執行JavaScript和TypeScript的執行環境

banq發表於2020-05-15

 Deno是一個新的javascript非瀏覽器的執行環境,用於在Web瀏覽器之外執行JavaScript和TypeScript。這點非常類似Node.js。
Deno試圖提供一個獨立的工具來快速編寫複雜功能的指令碼。Deno是(並將始終是)單個可執行檔案。就像網路瀏覽器一樣,它知道如何獲取外部程式碼。在Deno中,單個檔案可以定義任意複雜的行為,而無需任何其他工具。

import { serve } from "https://deno.land/std@0.50.0/http/server.ts";
for await (const req of serve({ port: 8000 })) {
  req.respond({ body: "Hello World\n" });
}

在這裡,將完整的HTTP伺服器模組作為依賴項新增到一行中。沒有其他配置檔案,沒有預先安裝deno run example.js。
與瀏覽器一樣,預設情況下,程式碼在安全的沙箱中執行。未經允許,指令碼無法訪問硬碟驅動器,開啟網路連線或進行任何其他潛在的惡意操作。瀏覽器提供了用於訪問相機和麥克風的API,但使用者必須首先授予許可權。Deno在終端中提供類似的行為。除非--allow-net提供命令列標誌,否則上面的示例將失敗。

與Node區別
Node是在JavaScript具有Promises或async / await概念之前設計的。Node所承諾的對手是EventEmitter,它基於重要的API,即套接字和HTTP。除了非同步/等待的人體工程學優勢外,EventEmitter模式還存在背壓問題。以TCP套接字為例。套接字在收到傳入資料包時將發出“資料”事件。這些“資料”回撥將以不受限制的方式發出,從而使事件充滿整個過程。由於Node繼續接收新的資料事件,因此基礎TCP套接字沒有適當的背壓,因此遠端傳送方不知道伺服器已超負荷並繼續傳送資料。為了減輕這個問題,pause()方法已新增。這可以解決問題,但是需要額外的程式碼;而且由於泛洪問題僅在程式非常繁忙時才會出現,因此許多Node程式都可能被資料泛洪。結果是系統的尾部延遲時間很長。
在Deno中,套接字仍然是非同步的,但是接收新資料需要使用者顯式地進行read()。正確構造接收套接字不需要額外的暫停語義。這不是TCP套接字獨有的。系統的最低繫結層從根本上與承諾相關聯-我們稱這些繫結為“ ops”。Deno中以某種形式出現的所有回撥均來自promise。
Rust有其自己的類似於承諾的抽象,稱為Futures。透過“ op”抽象,Deno使將Rust未來的API繫結到JavaScript promise中變得容易。
重要的是:要了解Deno不是Node的分支-它是一個全新的實現。Deno的開發僅兩年時間,而Node的開發已超過十年。考慮到對Deno的興趣,我們希望它會繼續發展和成熟。

我們不斷跟蹤Deno的HTTP伺服器的效能。HelloWorld的Deno HTTP伺服器每秒處理約25,000個請求,最大延遲為1.3毫秒。一個可比的Node程式每秒處理34,000個請求,最大延遲介於2到300毫秒之間。
Deno的HTTP伺服器是在本機TCP套接字頂部的TypeScript中實現的。Node的HTTP伺服器使用C語言編寫,並作為對JavaScript的高階繫結公開。我們一直拒絕將本地HTTP伺服器繫結新增到Deno的衝動,因為我們要最佳化TCP套接字層,更常見的是最佳化op介面。





 

相關文章