Deno

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

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

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

爲了讓Deno擁有非同步的事件觸發環境，也被引進來取代原本的libuv。

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

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

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

Deno Deploy，受Cloudflare Workers的启发，于2021年6月23日发布。 于2022年5月4日宣布Beta 4改进了仪表板并增加了计费功能。Deno Deploy预计在2022年第三季度正式发布。

Deno Fresh 1.0于2022年6月28日宣布。 它是一个新的全栈Web框架，用于Deno，它不向客户端发送任何JavaScript。该框架没有构建步骤，这使得部署时间可以提高一个数量级。1.1版本于2022年9月8日发布。

Deno SaaSKit beta于2023年4月4日宣布。 它是一个开源的、现代的SaaS模板，使用Fresh和Deno构建。

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

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

 與Node.js的比較 
Deno與Node.js的相同之處：

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

Deno與Node.js的不同之處：

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

 範例 

 Hello World 

在这个JavaScript例子中，的信息被打印到控制台，代码确保所提供的名字是大写的。

命令: 
/**
 * 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 并为用户提供商业服务。

一年后，Deno宣布再获得由红杉资本领投的2100万美元A轮融资。

 參考資料 

 外部鏈接 

Category:运行时系统
Category:软件包管理系统
Category:自由软件
Category:用Rust编程的自由软件