跳轉到

2020:Deno 1.0 問世#

事件#

2020年5月13日,Deno 1.0 正式發佈:由 Ryan Dahl(Node.js 原作者)以 Rust 重寫的 JavaScript/TypeScript 運行時,內建 V8 與 Tokio 非同步執行器。

為何重要#

  • TypeScript 開箱即用:直接執行 .ts 檔,無需 tsconfig 與建置流程。
  • 安全預設:程式碼預設無檔案、網路、環境存取權,需以旗標明確授權——史上第一個內建權限模型的 JS 運行時。
  • URL 匯入與去中心化模組:import { serve } from "https://deno.land/std/...",不需中央 registry 與 node_modules(後來也妥協支援 npm 相容層 npm: 指定符,2022)。
  • 標準 API 對齊瀏覽器:內建 fetch、WebSocket、ESM,單一可執行檔。

理論與實用原因#

  • 理論原因:實踐「瀏覽器與伺服器同一套標準 API」的願景,以及最小權限原則(least privilege,Saltzer & Schroeder, 1975)。
  • 實用原因:單檔部署、零設定、內建測試與格式化(deno test、deno fmt),把工具鏈收斂為一個執行檔。

彌補了什麼缺陷#

彌補了 Node.js 的歷史包袱(見 2018-Deno構想):安全、模組、TypeScript 支援三大缺陷。其影響是「競爭迫使進步」——Node 之後陸續原生支援 fetch(Node 18, 2022)、ESM、測試執行器(node:test)。

相關條目#

程式範例#

1. Deno 1.0 的Hello World:零設定、單檔#

// server.ts —— TypeScript 直接寫,不需 tsconfig
import { serve } from "https://deno.land/std@0.200.0/http/server.ts";

serve((req) => new Response("Hello from Deno"), { port: 8000 });
deno run --allow-net server.ts   # 一個執行檔 + 一個授權旗標,跑起來

2. 權限模型:最小權限原則的實現#

deno run script.js            # 💥 預設無任何權限
deno run --allow-read=/etc script.js        # 只能讀 /etc
deno run --allow-net=api.example.com script.js   # 只能連特定網域
deno run -A script.js         # 全開(不建議)

3. Promise API 對齊 async/await 時代#

// 全部 API 都是 Promise——沒有 error-first callback
const text = await Deno.readTextFile("./data.txt");
const json = JSON.parse(text);

// 環境與進程
const port = Deno.env.get("PORT") ?? "8000";   // 需 --allow-env,搭配 ?? 空值合併

4. 內建工具鏈:一個執行檔取代四套工具#

deno fmt server.ts     # 格式化(對照 prettier)
deno lint              # lint(對照 eslint)
deno test              # 測試(對照 jest)
deno compile server.ts # 編譯成單一可執行檔