原文:What’s Deno, and how is it different from Node.js?javascript
譯者:朱林
閱讀時間:5~7minjava
Node.js的做者Ryan Dahl,過去一年半的時間都在打造一個新的JavaScript運行環境Deno來解決Node的一些內在問題。node
不過不要誤會,得益於JavaScript龐大的社區生態和使用範圍,Node是一個很是不錯的JavaScript運行環境。然而,Dahl 也認可在Node的某些方面他應該考慮得更全面一些,好比:安全性,模塊機制,依賴管理等。webpack
在他的計劃中,他並不會去預想Deno在短期內可以發展成一個多大規模的平臺。固然咯,把時間調回2009年,JavaScript仍是人人都能取笑的一個有些怪異的小語言,也木有如今這麼多語言特性。git
Deno是基於Google V8引擎構建的安全的TypeScript運行環境。 下面是構建Deno的一些物料:github
接下來看看Deno提供了哪些特性。web
Deno最重要的特性就是安全性。shell
相較於Node,Deno默認使用沙箱環境執行代碼,這意味着運行環境沒有操做如下模塊權限:npm
讓咱們瞅一眼Deno的權限系統是如何工做滴。編程
(async () => {
const encoder = new TextEncoder();
const data = encoder.encode('Hello world\n');
await Deno.writeFile('hello.txt', data);
await Deno.writeFile('hello2.txt', data);
})();
複製代碼
這個腳本分別建立了兩個名爲hello.txt
和hello2.txt
的文件,並在其中寫入Hello world
。可是這段代碼運行在沙箱環境中,因此是沒有文件系統的操做權限滴。
還有一點值得注意,在上面的腳本中咱們使用Deno命名空間來操做文件,而不像在Node中使用fs
模塊。Deno命名空間提供了超多基礎方法。不過使用Deno命名空間會致使咱們的代碼失去了對瀏覽器的兼容性,這個問題咱們晚點再聊。
使用下面的命令執行上述腳本:
$ deno run write-hello.ts
複製代碼
執行以後,咱們會收到下面的提示:
Deno requests write access to "/Users/user/folder/hello.txt". Grant? [a/y/n/d (a = allow always, y = allow once, n = deny once, d = deny always)]
複製代碼
實際上,基於上面建立文件的腳本咱們會收到兩次來自沙箱環境的權限提示。不過若是咱們選擇allow always
選項,就只會被詢問一次啦。
若是咱們選了deny
,會拋出一個PermissionDenied
的錯誤,若是咱們沒寫錯誤處理邏輯的話,進程在此時就被終止啦。
若是咱們用下面的命令來執行腳本:
deno run --allow-write write-hello.ts
複製代碼
會在沒有提示的狀況下建立這兩個文件。
Deno針對文件系統的命令行標誌位,除了--allow-write
,還有--allow-net
/--allow-env
/--allow-run
,分別用來開啓針對網絡、系統環境變量和操做子進程的權限。
Deno使用瀏覽器同樣的方式,經過URL來加載模塊。不少人第一次見到在服務端的import語句中見到URL會感到有點困惑,但對我來講這還蠻好理解的:
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";
複製代碼
你以爲經過URL來引入模塊會有啥大不了的嗎?答案其實蠻簡單的:經過使用URL來加載模塊,Deno就能夠避免引入一個相似npm
的中心化系統來發布package,npm
最近受到了不少吐槽。
經過URL來引入代碼,可讓包的做者們使用本身最喜好的方式來維護和發佈本身的代碼。不再會有package.json
和node_modules
了。
當咱們啓動應用以後,Deno會下載全部被引用的文件,並將它們緩存到本地。一旦引用被緩存下來,Deno就不會再去下載它們了,除非咱們使用-- relaod
標誌位去觸發從新下載。
還有幾個問題值得咱們討論一哈:
因爲沒有了一箇中心化的包管理站點,那些存放模塊的站點可能由於各類各樣的緣由掛掉。若是在開發甚至生產環境出現這種狀況是很是危險滴!
咱們在上一節提到,Deno會緩存好已下載的模塊。因爲緩存是存放在咱們的本地磁盤的,Deno的做者建議將這些緩存提交到代碼倉庫裏。這樣一來,即便存放引用的站點掛了,開發者們仍是可使用已經下載好的模塊(只不過版本是被鎖住的啦)。
Deno會把緩存存儲在環境變量$DENO_DIR
所指定的目錄下,若是咱們不去設置這個變量,它會指向系統默認的緩存目錄。咱們能夠把$DENO_DIR
指定咱們的本地倉庫,而後把它們提交到版本管理系統中(好比:git
)
老是敲URL顯得有點XX,還好,Deno提供了兩種方案來避免咱們成爲XX。
第一種,你能夠在本地文件中將已經引用的模塊從新export出來,好比:
export { test, assertEquals } from "https://deno.land/std/testing/mod.ts";
複製代碼
假如上面這個文件叫local-test-utils.ts
。如今,若是咱們想再次使用test
或者assertEquals
方法,只須要像下面這樣引用它們:
import { test, assertEquals } from './local-test-utils.ts';
複製代碼
看得出來,是否是經過URL來引用它們並非最重要的啦。
第二種方案,建一個引用映射表,好比像下面這樣一個JSON文件:
{
"imports": {
"http/": "https://deno.land/std/http/"
}
}
複製代碼
而後把它像這樣import到代碼裏:
import { serve } from "http/server.ts";
複製代碼
爲了讓它生效,咱們還須要經過--importmap
標誌位讓Deno來引入import映射表:
$ deno run --importmap=import_map.json hello_server.ts
複製代碼
版本管理必須由包做者來支持,這樣在client端能夠經過在URL中設置版本號來下載:https://unpkg.com/liltest@0.0.5/dist/liltest.js
。
Deno有計劃作到兼容瀏覽器。從技術上講,在使用ES module的前提下,咱們不須要使用任何相似webpack的打包工具就能在瀏覽器上運行Deno代碼。
不過呢,你可使用相似Babel這樣的工具能夠把代碼轉化成ES5版本的JavaScript,這樣能夠兼容那些不支持全部最新語言特性的低版本瀏覽器中,帶來的後果就是最終文件裏有不少不是必須的冗餘代碼,增大代碼的體積。
結果取決於咱們的主要目的是啥。
不須要任何配置文件就能在Deno中輕易地使用TypeScript。固然咯,你也能夠編寫純JavaScript代碼,並使用Deno去執行它。
Deno,做爲一個新的TypeScript和JavaScript的運行環境,是一個很是有趣的技術項目,而且至今已經穩定發展了一段時間。可是距離在生產環境中去使用它還有比較長的一段路要走。
經過去中心化(或者翻譯成分佈式?)的機制,把JavaScript生態系統從npm這樣中心化的包管理系統中解放了出來。
Dahl但願在這個夏天快結束的時候可以發佈1.0版本,因此若是你對Deno將來的新進展感興趣的話,能夠給它個star。
最後還有一個日誌系統的廣告,你們能夠去原文查看。
關注【IVWEB社區】公衆號獲取每週最新文章,通往人生之巔!