Deno 是什麼?什麼是 Javascript runtime?Deno 會取代 Node.js 嗎? ...
前言
Deno 已經被前端圈子提及有很長一段時間了,上個月 Deno 發佈了 1.0 版本,又掀起了一小股 Deno 熱。Deno 到底是什麼?它可以用來做什麼呢?它好用嗎?帶著一直以來的好奇心,趁著周末的時間,認真地接觸了一次 Deno。
一、什麼是Deno?
Deno 是一個更安全的 JavaScript 和 TypeScript 運行時,作者 Ryan Dahl 同時也是 Node.js 的創建者。
什麼是運行時?
運行時是一個運行環境,也叫運行平臺,開發者可以使用指定的語言,基於這個環境開發應用。可以認為運行時就是一個舞臺,能做什麼事情,取決於舞臺能提供什麼道具。比如瀏覽器就是一個運行時,我們可以在瀏覽器上通過 JS 調用瀏覽器提供的 API 操作 DOM。
Deno 的作用
Deno 的作用,是讓開發者可以使用 JavaScript 語言開發後端服務。
二、為什麼會有Deno?
我們知道 Node.js 也是一個讓開發者可以使用 JavaScript 語言開發後端服務的 JavaScript 運行時。那既然已經有一個 Node.js,而且已經非常成功,為什麼還要造另一個 JavaScript 運行時 Deno ?
兩年前(2018年6月),Ryan Dahl 在德國柏林召開的 JSConf EU 會議上發表了名為 “10 Things I Regret About Node.js” 的演講,有興趣可以到這裡下載 PPT 。
在分享中,Ryan 回顧了在他看來當初開發 Node.js 時留下的10大遺憾。但由於Node.js 現在已經廣泛應用於各個領域,為了保證相容性,對 Node.js 底層進行大規模改造已經不現實。會上,Ryan 宣佈了他決定開發一個全新的 JavaScript Runtime 以解決當初的種種缺陷,這個項目就是 Deno。
Deno 的命名很有意思,就是把 node(no de) 倒過來 deno(de no),頗有顛覆 Node 的意味。
BTW,上個月(2020年5月15日),Deno 發佈了1.0版本。
三、走近 Deno
Deno 的開發語言
相比 Node.js 使用 C++ 開發,Deno 起初使用的開發語言是 GoLang,後來改為了 Rust。並且隨後把 C++ 寫的 libdeno 換成了 Rust 編寫的 V8 綁定:denoland/rusty_8。
Deno 目前是建立在 V8 引擎、Rust 、Tokio、TypeScript 的基礎之上。
- V8 是 chrome 瀏覽器內的 JavaScript 運行時。
- Rust 是一門系統編程語言,專註於安全,尤其是併發安全。它的性能和標準C++ 不相上下。
- Tokio 是一個給 Rust 語言使用的非同步運行時,提供 event loop 和具體的 I/O 類型。
- TypeScript 是 JavaScript 的超集。
Deno 的特性
- 預設支持 ES Modules
- 預設支持 TypeScript
- 儘可能相容 Web 標準 APIs
- 預設採用沙箱模式運行代碼,更安全
- 去中心化第三方模塊機制
- 提供標準庫
與 Node.js 的比較
- 使用 ES 模塊,不支持 require()
- Deno 不使用 package.json
- Deno 不使用 npm
- Deno 中的所有非同步操作返回 promise,因此 Deno 提供與 Node 不同的 API
- Deno 需要顯示指定文件、網路和環境許可權
- 第三方模塊通過 URL 或者文件路徑導入
- 當未捕獲的錯誤發生時,Deno 總是會異常退出
- 相容 Web 的運行時 APIs,更利於前後端的代碼同構。
四、如何使用 Deno
Deno 能夠在 macOS、Linux 和 Windows 上運行。Deno 是一個單獨的可執行文件,它沒有額外的依賴。
1.安裝
在 macOS 下可以通過Shell命令安裝:
curl -fsSL https://deno.land/x/install/install.sh | sh
這個方式在國內安裝會很慢,慢到下不下來。。。so,不推薦。
也可以通過HomeBrew 安裝:
brew install deno
這個方式可以安裝下來,但是,安裝的版本是 v0.20.0,很低的版本:
並且這個版本不帶 upgrade 命令,升級 deno 的時候很不方便。so,也不推薦。
安利通過國內加速器(鏡像源 https://x.deno.js.cn )來安裝:
curl -fsSL https://x.deno.js.cn/install.sh | sh
也可以指定版本:
curl -fsSL https://x.deno.js.cn/install.sh | sh -s v1.0.0
首次安裝,可以看到提示,需要手動配置一下環境變數,配置語句也已經給出:
$ touch ~/.bash_profile # 創建用戶環境變數文件
$ vim ~/.bash_profile # 打開文件,將剛纔命令行提示給出的配置語句粘貼進去,保存退出。
讓配置立即生效:
$ source ~/.bash_profile
環境變數就設置好了,現在在任何一個新打開的命令行裡面都可以使用 deno 命令了。
註意:如果之前使用 brew 安裝過低版本的 deno,請使用 brew uninstall deno 卸載 deno 之後,再使用加速器安裝高版本,不卸載直接安裝高版本不會生效。(別問我為什麼知道。。。都是淚。
其他操作系統環境的安裝可參考 https://github.com/denoland/deno_install。
如果要升級本地的 Deno,可以運行
deno upgrade
還可以安裝指定的版本:
deno upgrade --version 1.1.0
這個命令會從 github.com/denoland/deno/releases 獲取最新的發佈版本(一個可執行的二進位文件 zip 壓縮包),然後解壓並替換現有的版本。而 github release 的文件使用的是 aws,在國內訪問不穩定。
So,升級也推薦使用國內加速器安裝指定版本來達到目的。
2.測試安裝
deno --version
如果列印出 Deno 版本,說明安裝成功。
到這裡,我們就安裝好 Deno ,並且可以基於 Deno 進行開發了。
3.運行一個遠程的項目
跑一個遠程項目(官方的demo)
deno run https://deno.land/std/examples/welcome.ts
可以看到在控制台輸出"Welcome to Deno