Deno

以V8 JavaScript引擎與Rust程式語言為基礎開發的JavaScript與TypeScript執行時期環境

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

Deno
原作者瑞安·達爾
開發者Various
首次發布2018年5月13日,​6年前​(2018-05-13[1]
當前版本
  • 2.1.4(2024年12月11日;穩定版本)[2]
編輯維基數據鏈接
源代碼庫 編輯維基數據鏈接
編程語言Rust, JavaScript, TypeScript, C++(V8綁定)
操作系統Linux, macOS, Microsoft Windows
類型執行環境
許可協議 編輯維基數據鏈接
網站deno.com 編輯維基數據

歷史

編輯

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

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

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

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

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

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

Deno Deploy,受Cloudflare Workers[16]的啟發,於2021年6月23日發布。[17] 於2022年5月4日宣布Beta 4改進了儀錶板並增加了計費功能。Deno Deploy預計在2022年第三季度正式發布。[18]

Deno Fresh 1.0於2022年6月28日宣布。[19] 它是一個新的全棧Web框架,用於Deno,它不向客戶端發送任何JavaScript。該框架沒有構建步驟,這使得部署時間可以提高一個數量級。1.1版本於2022年9月8日發布。[20]

Deno SaaSKit beta於2023年4月4日宣布。[21] 它是一個開源的、現代的SaaS模板,使用Fresh和Deno構建。

概覽

編輯

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

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

與Node.js的比較

編輯

Deno與Node.js的相同之處:

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

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

  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。

範例

編輯

Hello World

編輯

在這個JavaScript例子中,Hello [name]的信息被打印到控制台,代碼確保所提供的名字是大寫的。

命令: deno run hello-world.js

/**
 * hello-world.js
 */
function capitalize(word) {
  return word.charAt(0).toUpperCase() + word.slice(1);
}

function hello(name) {
  return "Hello " + capitalize(name);
}

console.log(hello("john"));
console.log(hello("Sarah"));
console.log(hello("kai"));

/**
 * Output:
 *
 * Hello John
 * Hello Sarah
 * Hello Kai
 */

Unix cat程序

編輯

在這個程序中,每個命令行參數都被假定為一個文件名,文件被打開,並打印到stdout(例如控制台)。

/**
 * cat.ts
 */
import { copy } from "https://deno.land/std@0.167.0/streams/conversion.ts";
for (const filename of Deno.args) {
  const file = await Deno.open(filename);
  await copy(file, Deno.stdout);
  file.close();
}

運行該程序:

deno run --allow-read https://deno.land/std@0.167.0/examples/cat.ts /etc/passwd

HTTP網絡服務器

編輯

webserver.ts:

import { serve } from "https://deno.land/std@0.167.0/http/server.ts";

const port = 8080;

const handler = (request: Request): Response => {
  const body = `Your user-agent is:\n\n${
    request.headers.get("user-agent") ?? "Unknown"
  }`;

  return new Response(body, { status: 200 });
};

console.log(`HTTP webserver running. Access it at: http://localhost:8080/`);
await serve(handler, { port });

然後用以下方式運行這個:

deno run --allow-net webserver.ts

融資

編輯

2021年3月29日,Deno Land Inc宣布成立,由Shasta Ventures、Mozilla 公司和其他一些公司提供數百萬美元的支持。它的成立是為了進一步發展 Deno 並為用戶提供商業服務。[22]

一年後,Deno宣布再獲得由紅杉資本領投的2100萬美元A輪融資。[23]

參考資料

編輯
  1. ^ Contributors, denoland/deno, Github. [5 July 2019]. (原始內容存檔於2019-05-30). 
  2. ^ Release 2.1.4. 2024年12月11日 [2024年12月23日]. 
  3. ^ Deno: Secure V8 TypeScript Runtime from Original Node.js Creator. InfoQ. [2019-05-17]. (原始內容存檔於2020-01-08). 
  4. ^ 4.0 4.1 JSConf, 10 Things I Regret About Node.js - Ryan Dahl - JSConf EU 2018, 2018-06-06 [2019-05-17], (原始內容存檔於2019-05-17) 
  5. ^ 5.0 5.1 5.2 Deno Manual. deno.land. [2019-05-17]. (原始內容存檔於2020-01-08). 
  6. ^ Paul Krill. Ryan Dahl’s Node.js regrets lead to Deno. InfoWorld. 2018-06-21 [2020-06-03]. (原始內容存檔於2019-06-10). 
  7. ^ Dahl, Ryan. Design mistakes in Node (PDF). Github. 2018-06-06 [2020-06-03]. (原始內容存檔 (PDF)於2020-02-22). 
  8. ^ denoland/deno, branch "golang". Github. 
  9. ^ Suggestion: Look into porting to Rust and using Tokio. GitHub. [2020-06-03]. (原始內容存檔於2018-08-29). 
  10. ^ Tokio - The asynchronous run-time for the Rust programming language.. Tokio.rs. [2020-06-03]. (原始內容存檔於2020-05-20). 
  11. ^ Protobuf seems like a lot of overhead for this use case?. Github. [2020-06-03]. (原始內容存檔於2020-12-08). 
  12. ^ Replace flatbuffers. GitHub. [2020-06-03]. (原始內容存檔於2020-11-26). 
  13. ^ Remove flatbuffers. GitHub. [2020-06-03]. (原始內容存檔於2020-11-26). 
  14. ^ denoland/deno_std: deno standard modules. Github. [2020-06-03]. (原始內容存檔於2020-06-15). 
  15. ^ Deno 1.0. deno.land. [2020-05-14]. (原始內容存檔於2020-05-14). 
  16. ^ Dahl, Ryan. JavaScript Containers. tinyclouds.org. 4 May 2022. (原始內容存檔於4 May 2022). 
  17. ^ Krill, Paul. Deno Company unveils server-side JavaScript hosting service. InfoWorld. 2021-06-24 [2022-04-14]. (原始內容存檔於27 Jun 2022) (英語). 
  18. ^ Krill, Paul. Deno Deploy moves toward GA, adds paid plan. InfoWorld. 2022-06-03 [2022-07-24]. (原始內容存檔於2023-06-07) (英語). 
  19. ^ Luca, Casonato. Introduction Fresh 1.0 as new full stack web framework for Deno. Deno Blog. 2022-07-22 [2022-07-24] (英語). 
  20. ^ Casonato, Luca. Fresh 1.1 - automatic JSX, plugins, DevTools, and more. Deno Blog. 2022-09-08 [2022-09-10] (英語). 
  21. ^ Jiang, Andy. Announcing Deno SaaSKit: an open-source SaaS template built with Fresh. Deno Blog. 2023-04-04 [2022-04-04] (英語). 
  22. ^ Ryan Dahl, Bert Belder. Announcing the Deno Company. 2021-03-29. 
  23. ^ Deno raises $21M. deno.com. (原始內容存檔於22 June 2022). 

外部鏈接

編輯

官方網站  頁面存檔備份,存於網際網路檔案館