Deno

原作者| 瑞安·達爾
開發者| Various
首次发布| 2018年5月13日，​7年前​（2018-05-13）[1]
当前版本|

* 2.4.1（2025年7月8日；穩定版本）[2]

源代码库|

* github.com/denoland/deno

编程语言| Rust, JavaScript, TypeScript, C++（V8绑定）
操作系统| Linux, macOS, Microsoft Windows
类型| 執行環境
许可协议|

* MIT許可證

网站| deno.com

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

## 歷史

[编辑]

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.4.1. 2025年7月8日  [2025年7月15日].
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）.

## 外部鏈接

[编辑]

官方网站 （页面存档备份，存于互联网档案馆）

* 查
* 论
* 编

JavaScript

代码分析|

* ESLint
* JSHint
* JSLint

編譯器|

* CoffeeScript
* Dart
* Emscripten
* Google Closure Compiler（英语：Google Closure Compiler）
* Google Web Toolkit
* Morfik（英语：Morfik）
* TypeScript
* AtScript（英语：AtScript）
* Opa（英语：Opa (programming language)）
* Haxe
* Clojure
* Elm
* PureScript
* Reason

概念|

* Ajax
* 动态HTML
* JavaScript函式庫
* JavaScript语法
* 非侵入式JavaScript

调试工具|

* Firebug
* Komodo IDE（英语：Komodo IDE）
* Microsoft Script Debugger（英语：Microsoft Script Debugger）
* Microsoft Script Editor（英语：Microsoft Script Editor）
* Opera Dragonfly（英语：Opera Dragonfly）
* Venkman
* Safari

文档生成器（英语：Documentation generator）|

* JSDoc（英语：JSDoc）

編輯器（比较（英语：Comparison of JavaScript-based source code editors））|

* Ace（英语：Ace (editor)）
* Cloud9 IDE
* Atom
* CodeMirror（英语：CodeMirror）
* Light Table
* Brackets
* Koding
* Orion
* Visual Studio
* Visual Studio Express
* Visual Studio Code
* Visual Studio Team Services

引擎|

* ECMAScript引擎列表
* JavaScript引擎
* JavaScript引擎比较

軟體框架|

* JavaScript框架比较（英语：Comparison of JavaScript frameworks）
* JavaScript库列表

相關語言|

* ActionScript
* asm.js
* CoffeeScript
* Dart
* ECMAScript
* JavaScript OSA（英语：JavaScript OSA）
* JScript
* TypeScript
* AtScript（英语：AtScript）
* VBScript
* JSFuck

相關技術|

* CSS
* DOM
* HTML
* JSON
* WebAssembly

軟體套件管理系統|

* Npm
* NuGet

伺服器端|

* Active Server Pages
* Bun
* CommonJS
* Deno
* JSGI（英语：JSGI）
* Node.js
* Wakanda（英语：Wakanda (software)）

單元測試|

* Jasmine（英语：Jasmine (JavaScript framework)）
* Mocha（英语：Mocha (JavaScript framework)）
* QUnit（英语：QUnit）
* JavaScript单元测试框架列表（英语：List of unit testing frameworks#JavaScript）

人物|

* 道格拉斯·克羅克福特
* 布蘭登·艾克
* 約翰·雷西格
* 瑞安·達爾
* 傑西·詹姆士·賈瑞特

* 查
* 论
* 编

ECMAScript

语言|

* ActionScript
* Caja（英语：Caja project）
* JavaScript
* 引擎
* Asm.js
* JScript
* JScript .NET
* QtScript
* TypeScript
* WMLScript（英语：WMLScript）
* Dart
* CoffeeScript

引擎列表
（引擎比较）|

* Carakan
* Futhark
* InScript（英语：InScript (JavaScript engine)）
* JavaScriptCore
* JScript
* KJS
* Linear B
* Narcissus（英语：Narcissus (JavaScript engine)）
* QtScript
* Rhino
* SpiderMonkey
* TraceMonkey
* JägerMonkey
* Tamarin
* V8
* ChakraCore
* Chakra
* JScript .NET
* Nashorn（英语：Nashorn (JavaScript engine)）

框架|

| 客户端|

* Ample SDK（英语：Ample SDK）
* Chaplin.js（英语：Chaplin.js）
* Dojo
* Echo
* Extjs
* Google網頁工具包
* JQuery
* Lively Kernel（英语：Lively Kernel）
* midori（英语：Midori JavaScript Framework）
* MochiKit（英语：MochiKit）
* MooTools（英语：MooTools）
* Prototype
* Pyjs（英语：Pyjs）
* qooxdoo（英语：qooxdoo）
* Rialto（英语：Rialto Toolkit）
* Rico
* script.aculo.us（英语：script.aculo.us）
* SmartClient（英语：SmartClient）
* SproutCore（英语：SproutCore）
* Spry（英语：Spry framework）
* Wakanda框架（英语：Wakanda (software)）
* 雅虎UI库

|

服务器|

* AppJet（英语：AppJet）
* Jaxer（英语：Jaxer#Aptana Jaxer）
* Node.js
* Deno
* WakandaDB（英语：Wakanda (software)）

多種實作|

* Cappuccino（英语：Cappuccino (application development framework)）
* Objective-J（英语：Objective-J）
* PureMVC（英语：PureMVC）

函式庫|

* Backbone.js
* SWFObject（英语：SWFObject）
* SWFAddress（英语：SWFAddress）
* Lodash

人物|

* 布蘭登·艾克
* 道格拉斯·克羅克福特
* 約翰·雷西格
* Scott Isaacs（英语：Scott Isaacs）

其他|

* DHTML
* Ecma国际
* JSDoc（英语：JSDoc）
* JSGI（英语：JSGI）
* JSHint
* JSLint
* JSON
* JSSS（英语：JavaScript Style Sheets）
* Sputnik（英语：Sputnik (JavaScript conformance test)）
* SunSpider（英语：Browser speed test#SunSpider）
* 异步模块定义（英语：Asynchronous module definition）
* CommonJS

JavaScript库列表
Ajax框架（英语：list of Ajax frameworks#JavaScript）

JavaScript框架（英语：Comparison of JavaScript frameworks）
服务器端JavaScript（英语：comparison of server-side JavaScript solutions）
*[查]: 查看该模板
*[论]: 讨论该模板
*[编]: 编辑该模板