本页使用了标题或全文手工转换

Deno

维基百科,自由的百科全书
跳到导航 跳到搜索
Deno
Deno.svg
原作者瑞安·達爾
開發者Various
初始版本2018年5月13日,​4年前​(2018-05-13[1]
穩定版本
1.28.1
(2022年11月16日,​15天前​(2022-11-16[2]
預覽版本
1.0.0-rc3
(2020年5月12日,​2年前​(2020-05-12[3]
源代码库https://github.com/denoland/deno
编程语言Rust, JavaScript, TypeScript, C++(V8绑定)
操作系统Linux, macOS, Microsoft Windows
类型執行環境
许可协议MIT許可證[4][5]
网站deno.land/ 编辑维基数据

Deno是基於V8引擎和Rust語言所建立的JavaScriptTypeScript執行環境,由Node.js的原始開發者瑞安·達爾所創造。 [6] 達爾在2018年的演講「我爲Node.js感到後悔的十件事」中宣布了Deno。 [7] Deno在單個可執行檔中扮演執行環境和套件管理系統的角色,不需要將其分開。 [8] [9]

歷史[编辑]

Deno於2018年瑞安·達爾的演講「我爲Node.js感到後悔的十件事」中宣佈。[7]在這場演講中,達爾提到他後悔Node.js的設計,例如沒有在API中使用JavaScript的Promise、GYP建構系統、省略文件的副檔名、node_modules與package.json、使用index.js進行模組解析、V8的沙盒環境等等[10]。他在演講的最後提出了Deno的原型,Deno旨在透過如Protocol Buffers之類的序列化工具傳遞訊息來實現綁定系統的呼叫,並提供命令列介面存取控制

Deno初始版本是使用Go語言編寫,並使用Protocol Buffers來實作特權(Go)與非特權(V8)之間的序列化[11]。然而因顧慮到雙重運行與垃圾蒐集,Go在不久後就被Rust取代[12]

爲了讓Deno擁有非同步的事件觸發環境,Tokio也被引進來取代原本的libuv[13]

Deno原本採用Flatbuffers以進行更快的零複製序列化與反序列化[14],在2019年4月發佈序列化的標準之後[15],2019年8月被移除[16]

2018年11月建立了一個以Go標準函式庫爲基底的標準函式庫,並提供了廣泛的工具,解決部分Node.js的dependency問題。[17]

Deno於2020年5月13日正式發佈。[18]

概覽[编辑]

Deno目標是成爲對目前的工程師來說最具有生產力的的腳本環境[8]。Deno強調事件觸發架構,並提供一套非阻塞IO與阻塞IO。

Deno可用於建立網頁伺服器、執行數學的運算等等。

與Node.js的比較[编辑]

Deno與Node.js的相同之處:

  1. 皆運行于V8上。
  2. 擁有相同的事件循環
  3. 提供CLI讓使用者可以執行腳本語言。
  4. 龐大的實用程式

Deno與Node.js的不同之處[8]

  1. 預設模組系統是使用ES Module,而不是CommonJS
  2. 使用URL載入本地端或遠端的dependencies。
  3. 使用內建的套件管理器來抓取資源,因此不需要NPM
  4. 使用具有緩存機制的快照TypeScript編譯器,因此Typescript也能開箱即用。
  5. 兼容具有廣泛Web API的瀏覽器。
  6. 允許控制檔案系統網路存取,以執行沙盒內的程式碼。
  7. 重新利用Promise、ES6、Typescript來設計API。
  8. 最小化核心API的大小,同時提供許多的標準函式庫,因此不需要再使用外部的dependencies。
  9. 使用訊息傳遞通道來呼叫特權系統API。

範例[编辑]

最基本的Deno腳本,沒有任何讀寫網路的權限:

deno run main.ts

若要取得權限,需要相對應的flag:

deno run --allow-read --allow-net main.ts

若要檢視程式碼的dependency tree,使用info子命令:

deno info main.ts

Hello World程式碼(與Node.js相同):

console.log("Hello world");

Deno為瀏覽器中大多數不可用的Deno特定API提供了全域的命名空間。下列是Unix中的cat程式的實作:

/* cat.ts */
// Deno API透過`Deno`命名空間來公開
const { stdout, open, copy, args } = Deno;
// 支援Top-level await
for (let i = 0; i < args.length; i++) {
    const filename = args[i]; // CLI的參數.
    const file = await open(filename); // 開啓相對應的檔案讀取.
    await copy(file, stdout); // 執行從`file`到`stdout`的非同步零複製
}

上面的Deno.copy函式的執行方式與Go的io.Copy相像。Writer的輸出的目標是stdout,file是Reader的輸入來源。

若要執行本程式,我們需要提供讀的權限:

deno run --allow-read cat.ts myfile

下面的Deno程式碼實作了最基本的網頁伺服器

// 使用URL從遠端的Deno標準函式庫引入`serve`
import { serve } from "https://deno.land/std@0.55.0/http/server.ts";
// `serve`函式回傳非同步的iterator, 產生請求的stream
for await (const req of serve({ port: 8000 })) {
    req.respond({ body: "Hello World\n" });

}

當執行這個程式時,Deno會自動下載遠端的標準函式庫並編譯,相似地,我們也可以藉由提供URL當作參數(-A 取得所有權限)來執行標準函式庫裡的程式碼(像是檔案伺服器)而不需要另外下載

$ deno run -A https://deno.land/std/http/file_server.ts
Download https://deno.land/std/http/file_server.ts
Compile ttps://deno.land/std/http/file_server.ts
...
HTTP server listening on http://0.0.0.0:4500/

參考資料[编辑]

  1. ^ Contributors, denoland/deno, Github. [5 July 2019]. (原始内容存档于2019-05-30). 
  2. ^ Releases · denoland/deno. [2022-11-16]. 
  3. ^ Deno 1.0.0-rc3. [12 May 2020]. (原始内容存档于2021-11-16) –通过GitHub. 
  4. ^ deno/LICENSE at master. GitHub. [5 July 2019]. (原始内容存档于2019-05-29). 
  5. ^ The MIT License. Open Source Initiative. 17 September 2018 [17 September 2018]. (原始内容存档于2020-05-09). 
  6. ^ Deno: Secure V8 TypeScript Runtime from Original Node.js Creator. InfoQ. [2019-05-17]. (原始内容存档于2020-01-08). 
  7. ^ 7.0 7.1 JSConf, 10 Things I Regret About Node.js - Ryan Dahl - JSConf EU 2018, 2018-06-06 [2019-05-17], (原始内容存档于2019-05-17) 
  8. ^ 8.0 8.1 8.2 Deno Manual. deno.land. [2019-05-17]. (原始内容存档于2020-01-08). 
  9. ^ Paul Krill. Ryan Dahl’s Node.js regrets lead to Deno. InfoWorld. 2018-06-21 [2020-06-03]. (原始内容存档于2019-06-10). 
  10. ^ Dahl, Ryan. Design mistakes in Node (PDF). Github. 2018-06-06 [2020-06-03]. (原始内容存档 (PDF)于2020-02-22). 
  11. ^ denoland/deno, branch "golang". Github. 
  12. ^ Suggestion: Look into porting to Rust and using Tokio. GitHub. [2020-06-03]. (原始内容存档于2018-08-29). 
  13. ^ Tokio - The asynchronous run-time for the Rust programming language.. Tokio.rs. [2020-06-03]. (原始内容存档于2020-05-20). 
  14. ^ Protobuf seems like a lot of overhead for this use case?. Github. [2020-06-03]. (原始内容存档于2020-12-08). 
  15. ^ Replace flatbuffers. GitHub. [2020-06-03]. (原始内容存档于2020-11-26). 
  16. ^ Remove flatbuffers. GitHub. [2020-06-03]. (原始内容存档于2020-11-26). 
  17. ^ denoland/deno_std: deno standard modules. Github. [2020-06-03]. (原始内容存档于2020-06-15). 
  18. ^ Deno 1.0. deno.land. [2020-05-14]. (原始内容存档于2020-05-14). 

外部鏈接[编辑]

官方网站 在维基数据上编辑此内容页面存档备份,存于互联网档案馆