Deno 已經被前端圈子說起有很長一段時間了,上個月 Deno 發佈了 1.0 版本,又掀起了一小股 Deno 熱。Deno 究竟是什麼?它能夠用來作什麼呢?它好用嗎?帶着一直以來的好奇心,趁着週末的時間,認真地接觸了一次 Deno。前端
Deno 是一個更安全的 JavaScript 和 TypeScript 運行時,做者 Ryan Dahl 同時也是 Node.js 的建立者。node
運行時是一個運行環境,也叫運行平臺,開發者可使用指定的語言,基於這個環境開發應用。能夠認爲運行時就是一個舞臺,能作什麼事情,取決於舞臺能提供什麼道具。好比瀏覽器就是一個運行時,咱們能夠在瀏覽器上經過 JS 調用瀏覽器提供的 API 操做 DOM。git
Deno 的做用,是讓開發者可使用 JavaScript 語言開發後端服務。github
咱們知道 Node.js 也是一個讓開發者可使用 JavaScript 語言開發後端服務的 JavaScript 運行時。那既然已經有一個 Node.js,並且已經很是成功,爲何還要造另外一個 JavaScript 運行時 Deno ?chrome
兩年前(2018年6月),Ryan Dahl 在德國柏林召開的 JSConf EU 會議上發表了名爲 「10 Things I Regret About Node.js」 的演講,有興趣能夠到這裏下載 PPT 。shell
在分享中,Ryan 回顧了在他看來當初開發 Node.js 時留下的10大遺憾。但因爲Node.js 如今已經普遍應用於各個領域,爲了保證兼容性,對 Node.js 底層進行大規模改造已經不現實。會上,Ryan 宣佈了他決定開發一個全新的 JavaScript Runtime 以解決當初的種種缺陷,這個項目就是 Deno。npm
Deno 的命名頗有意思,就是把 node(no de) 倒過來 deno(de no),很有顛覆 Node 的意味。編程
BTW,上個月(2020年5月15日),Deno 發佈了1.0版本。json
相比 Node.js 使用 C++ 開發,Deno 起初使用的開發語言是 GoLang,後來改成了 Rust。而且隨後把 C++ 寫的 libdeno 換成了 Rust 編寫的 V8 綁定:denoland/rusty_8。vim
Deno 目前是創建在 V8 引擎、Rust 、Tokio、TypeScript 的基礎之上。
Deno 可以在 macOS、Linux 和 Windows 上運行。Deno 是一個單獨的可執行文件,它沒有額外的依賴。
在 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,升級也推薦使用國內加速器安裝指定版原本達到目的。
deno --version
若是打印出 Deno 版本,說明安裝成功。
到這裏,咱們就安裝好 Deno ,而且能夠基於 Deno 進行開發了。
跑一個遠程項目(官方的demo)
deno run https://deno.land/std/examples/welcome.ts
能夠看到在控制檯輸出"Welcome to Deno 🦕」。
起一個最簡單的本地服務
// http.js import { serve } from "https://deno.land/std@0.57.0/http/server.ts"; const s = serve({ port: 8000 }); console.log("http://localhost:8000/"); for await (const req of s) { req.respond({ body: "Hello World\n" }); }
能夠看到 Deno 在引用第三方模塊的方式爲 ES6 的 import 語法,而且直接經過 URL 來引入,版本號也被鎖定在了 URL 中。
另外,Deno 支持 頂層的 await 語法,不用與 async 語法配對使用了。
運行:
deno run http.js
首次引入第三方包,Deno 會去下載這個包和它的依賴,這些包會被緩存到全局,下次再引入的時候,將直接讀取緩存。
這裏報了一個缺乏網絡權限的錯,這是由於 Deno 採用沙箱模式運行代碼,網絡權限必須經過手動添加 flag (--allow-net)來開啓。
帶上網絡權限運行:
deno run --allow-net http.js
打開localhost://8000
能夠看到一個簡單的本地服務就跑起來了。
若是咱們要高效地使用 Deno,最好還須要設置一些開發環境,好比環境變量、命令行自動補全、編輯器等。
DENO_DIR:
這是 Deno 在本地存放生成的代碼和緩存下載的模塊的路徑,默認爲 $HOME/Library/Caches/deno。
NO_COLOR:
這個會關閉輸出的文字顏色。
HTTP_PROXY 和 HTTPS_PROXY :
這兩個變量用來設置 HTTP 和 HTTPS 的代理地址。
Deno 支持的 shell 有 zsh、bash、fish、powershell、elvish。
若是你是其餘編輯器/IDE,能夠參考官網推薦的插件
這也是不少前端者關心的話題,網絡上兩種聲音都有,個人見解是:會共存,但不會取代。
首先,Node.js 的做者之因此開發 Deno 只是爲了兌現他心目中對 JavaScript Runtime 的一個理想實現,並非爲了取代 Node.js;
其次,Node.js 通過十多年的發展,已經很成熟了(雖然在 Ryan 的眼裏不那麼完美),而且已經被普遍應用。我的認爲,未來 Deno 要作的事情,Node.js 都能作,若是沒有特別的因素(好比潛在的安全隱患等),已經使用了 Node.js 的應用,不大會改用 Deno 重構。
因此,以我目前的認知,我認爲 Deno 若是能發展起來,應該會與 Node.js 共生,而不會取代 Node.js。
無論怎樣,我很欽佩 Ryan,在 Node.js 得到如此成功以後,仍然懷揣對做品的理想追求,大膽分享本身在 Node.js 中犯的「錯誤」,開始 Deno 的征程,而且如今 Deno 正在以飛快的速度在迭代。就在昨天,Deno 又發佈了 V1.1.0。
以上是我對 Deno 的一個初探,解答了什麼是 Deno,它有什麼做用,有哪些特色,與 Node.js 有什麼不一樣,以及如何使用 Deno(雖然只淺淺地跑了最簡單的程序,但足以讓我感受到 Deno 與 Node.js 在使用上的不一樣)。如今,總算對 Deno 的有了一個比較清晰的瞭解。
有興趣交流的小夥伴能夠在這裏留言討論:https://github.com/yc111/yc111.github.io/issues/2
Deno 交流QQ羣:698469316
參考
Deno Manual:https://deno.land/manual
Deno Doc:https://doc.deno.land/https/github.com/denoland/deno/releases/latest/download/lib.deno.d.ts
Deno中文社區:https://denocn.org/
Deno中文開發者社區:https://deno.js.cn/
Deno中文手冊:https://nugine.github.io/deno-manual-cn/
Futures 和 Tokio 項目的前世此生:https://rustcc.cn/article?id=8af74de6-1e3d-4596-94ca-c3da45509f58
文章首發于于公衆號「前端手札」,喜歡的話能夠關注一下哦。
本文做者:ChampYin
轉載請註明出處:https://champyin.com/2020/06/14/Deno-初探/