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 # 編譯成單一可執行檔