Deno 是面向代碼的瀏覽器?
【CSDN編者按】很多人仍然對Deno的模型感到懷疑,很多新手對其採取的一些策略持反對意見,但真正接觸過Deno並嘗試瞭解它的不同工作方式後,你還這麼認爲嗎?
以下爲譯文:
2018年5月,在Ry發佈Deno的原型後不久,我便開始爲其貢獻代碼。人們最常問的問題是:“打包管理在哪裏?”通常人們都不是以提問的形式,他們會說:“我認爲Deno非常重視安全性,只不過從互聯網上下載資源不是很安全。”或者“我該如何管理依賴關係?”
我認爲,我們需要改變思維模式。無處不在的打包管理器和集中式的代碼倉庫,讓很多人認爲擁有一個軟件包管理器和一個集中式代碼倉庫是必須的。雖然它們存在,但並不意味着它們就是必需品。它們之所以存在,是因爲它們以特定的方式解決了問題,而人們則想當然地認爲它們是解決這個問題的唯一方法。但我認爲這不對。
瀏覽器
假設發佈網站的方法並不是登錄到Google服務器並將網站上傳到服務器上。如果有人想訪問網站,他們需要使用一個命令行工具,該工具會在本地計算機的browser.json文件中添加一個條目,然後把整個網站以及任何該網站鏈接到的網站都下載到本地的websites目錄中,然後再啓動瀏覽器顯示網站。感覺很不可思議,是吧?那麼爲什麼運行代碼需要採用這種模型呢?
Deno CLI的工作方式與瀏覽器類似,只不過它操作的是代碼。只需要導入一個代碼的URL,Deno就會獲取這些代碼,並緩存在本地,就像瀏覽器一樣。此外,與瀏覽器一樣,你的代碼在沙盒中運行,而沙盒對正在運行的代碼的信任度爲零,無論這些代碼來自何處。你(調用代碼的人)從外部告訴代碼可以做些什麼以及不能做什麼。而且,就像瀏覽器一樣,代碼會要求執行操作的權限,而你可以選擇授權或拒絕。
HTTP協議足夠提供有關代碼的信息,而且Deno會設法利用該協議,因此不必創建新協議。
發現代碼
首先要考慮的是,我們希望Deno CLI像瀏覽器一樣對你運行的代碼不持任何意見。它只給出代碼應當怎樣獲取,以及怎樣將代碼放在沙盒中運行。我認爲,運行時應當持有的意見僅此兩點。
在Node.js/npm生態環境中,代碼管理位於本地,再加上一個中心化的代碼倉庫來輔助代碼發現。我認爲這兩者都有很嚴重的缺陷。
在互聯網的早期,我們曾嘗試過npm這種發現機制。那時,你需要把網站添加到雅虎正確的分類下供人們查找,也許會使用搜索功能,但這都是根據內容提供者的意見時構建的,而且不是按照罪有利於消費者的方式構建的。最後終於Google出現了。爲什麼Google能取得勝利?因爲Google對很好用。它會按照簡單的搜索關鍵字對網站進行索引,同時考慮多個因素,包括內容提供商的元數據等。
雖然Deno對於代碼的模型與此不太一樣,但也很好用。此外,我們使用Google的原因是Google能解決我們的問題,而不是別人要求我們“必須使用Google”或者任何Google的替代品。
我在推特上與Laurie Voss討論過一次,他非常瞭解npm生態系統。他認爲Deno需要包管理器,而這篇文章更詳盡地介紹了我的想法,但是Laurie提出的一個觀點很有道理。
我:“git並不會要求遠端代碼位於何處,就像瀏覽器和Deno一樣。無論是Gitlab、BitBucket還是GitHub,git都能使用。”
Laurie Voss:“但我們的代碼還是存放在同一個地方,也就是GitHub。因爲維護軟件生態系統是一項社會工作,需要影響力,這必然導致中心化的系統,這與技術要求無關。”
$ deno info https://deno.land/x/oak/examples/server.ts
local: $deno/deps/https/deno.land/d355242ae8430f3116c34165bdae5c156dca21aeef521e45acb51fcd21c9f724
type: TypeScript
compiled: $deno/gen/https/deno.land/x/oak/examples/server.ts.js
map: $deno/gen/https/deno.land/x/oak/examples/server.ts.js.map
deps:
├── https://deno.land/[email protected]/fmt/colors.ts
└─┬ https://deno.land/x/oak/mod.ts
├─┬ https://deno.land/x/oak/application.ts
│ ├─┬ https://deno.land/x/oak/context.ts
│ │ ├── https://deno.land/x/oak/cookies.ts
│ │ ├─┬ https://deno.land/x/oak/httpError.ts
│ │ │ └─┬ https://deno.land/x/oak/deps.ts
│ │ │ ├── https://deno.land/[email protected]/hash/sha256.ts
│ │ │ ├─┬ https://deno.land/[email protected]/http/server.ts
│ │ │ │ ├── https://deno.land/[email protected]/encoding/utf8.ts
│ │ │ │ ├─┬ https://deno.land/[email protected]/io/bufio.ts
│ │ │ │ │ ├─┬ https://deno.land/[email protected]/io/util.ts
--snip--
// Copyright 2018-2020 the oak authors. All rights reserved. MIT license.
// This file contains the external dependencies that oak depends upon
// `std` dependencies
export { HmacSha256 } from "https://deno.land/[email protected]/hash/sha256.ts";
export {
Response,
serve,
Server,
ServerRequest,
serveTLS,
} from "https://deno.land/[email protected]/http/server.ts";
export {
Status,
STATUS_TEXT,
} from "https://deno.land/[email protected]/http/http_status.ts";
export {
Cookies,
Cookie,
setCookie,
getCookies,
delCookie,
} from "https://deno.land/[email protected]/http/cookie.ts";
export {
basename,
extname,
join,
isAbsolute,
normalize,
parse,
resolve,
sep,
} from "https://deno.land/[email protected]/path/mod.ts";
export { assert } from "https://deno.land/[email protected]/testing/asserts.ts";
// 3rd party dependencies
export {
contentType,
lookup,
} from "https://deno.land/x/[email protected]/mod.ts";