《Deno 鑽研之術》系列於 Deno v1 正式發售之日全新推出,每週不按期更新在 Github 中(github.com/hylerrix/de…)。讓咱們一塊兒按部就班學 Deno,先易後難補 Node,面向將來開發屬於本身的 Deno Web App。歡迎訂閱,歡迎交流。html
時隔 Deno 開源兩年整,萬衆期待的 Deno v1 正式版今日正式登場。或許你已經聽過 Deno 的大名、或許你在項目中已經大量使用 Deno 做者的上一個明星項目 Node.js,亦或許今天才剛剛接觸這一切...總之如今上車,背後是業界多年 Web App 開發經驗的累加,面前是一片充滿未知與驚喜的 Deno 藍海。前端
Deno 是一個基於 Chrome V8 引擎開發的一個安全的 JavaScript 和 TypeScript 運行時,底層由 Rust 語言編寫(最初選型爲 Go),發起人是 Ryan Dahl。Ry 也是 Node.js 的發起人,當 Ry 將 Node 交付給社區一段時間後回看 Node 的現狀,提出了不少沒法忽視的缺陷,因而帶來了全新的項目,Deno。node
正是 2011 年左右 Node.js 的出現,將 JavaScript 正式帶入服務端應用開發領域;也經過彼時領先的模塊化思想,促進了 Web 前端工程化的火速發展。同時驗證並促進了 Atwood 定律的發展——任何能夠用 JavaScript 來寫的應用,最終都將用 JavaScript 來寫。git
雨後春筍,縱使現在在 Node.js 上構建的各大基礎設施(開源庫、框架、腳手架等)支撐着從創業公司到各大主流互聯網公司的數以萬計的核心業務發展,但在 Node 自己不那麼容易拋開的歷史包袱下,新生的 Deno 依然擁有着不少前瞻性的理念,好比:github
這就是 Deno,一個使人激動的項目。更多具體的知識點,會在本系列後期逐步展開。typescript
下方 Deno 知識體系示意圖的截圖來自基於機器學習的信息抽取和檢索系統 Magi.com,「它能將任何領域的天然語言文本中的知識提取成結構化的數據,經過終身學習持續聚合和糾錯,進而爲人類用戶和其餘人工智能提供可解析、可檢索、可溯源的知識體系」。圖中內容僅供參考。express
在 Star History 網站上,咱們能夠看到這兩年來社區對 Deno 的關注度穩增不減。從發佈一個月多便接近 20k+,到如今已經達到了 50k+ 的 Star 數量,這意味着 Deno 已經躋身 Github 項目全球排行榜至少前 70 位。編程
截止目前,誕生兩年的 Deno 貢獻者數量達到 270+ 位,有 3k+ 的 commit、416/1920 的 issues 解決比例和 42/3273 的 PR 解決比例(2020-05-12)。與此同時,誕生近十年的 Node 有 2690+ 位貢獻者,30k+ 的 commit、977/11585 的 issues 解決比例和 316/21192 的 PR 解決比例。json
下圖即爲 Deno 目前的 Star History 趨勢圖。後端
關於爲何學習 Deno,每一個人都會有本身的理由。社區中有一種有趣的聲音:學習 Deno 是一種「押寶」,但願經過學習 Deno 能完全放棄 Node 並在將來經過 Deno 得到更好的編程機會。
實則 Deno 仍是處於早期階段,且 Node.js 的成功是有時代背景選擇而不可複製。所以將全部學習重心都押寶在 Deno 上尚且過早。
那麼如何對待 Deno?Deno 是在開源社區的「禮物文化」環境下誕生的,咱們一塊兒將 Deno 當作是加入你們庭的新生命,一塊兒從整個 Web 領域的進程中取長補短共同建設 Deno,纔是現階段對待這份「禮物」最好的狀態。
要知道,從 Node 到 Deno,其中有太多的中國開發者的積極貢獻融入其中。
以 Ecma 成員名義發起,阿里巴巴、騰訊等公司領銜的最新《Node.js 開發者 2020 年度報告》中指出,越年輕的同窗越關注 Deno。所以,這裏着重引用一位年輕的谷歌華人實習生,Deno 核心貢獻者之一的 @kevinkassimo 的一句話來看,爲何學習 Deno?
平心而論,我最初參與的主要目的其實最先是想着「我一直在用 Node 但不瞭解它真實背後的工做原理」,因此最先看到 Deno 的時候在想「瞭解 Node 原理的比較好的一個方法是乾脆本身去作一個新的 Node」。 ——@kevinkassimo
這也正是我對於 Deno 的重要心態。大學初入校園期間正值 Node.js 最火的時刻,本身由於對 Node.js 的喜歡選擇了大前端領域,接下來的幾年也參加、舉辦過不少前端相關活動,但對於 Node.js 的瞭解由於本身的身份侷限一直沒有獲得更好的突破。
畢業這一年來看,Node.js 已經發展出一個十分龐大的生態,咱們暢遊其中能找到大量解決自身編程需求的 NPM 庫——這也更顯示出本身對於 Node.js 的熟悉差距愈來愈大。如今 Deno 嶄新一片,爲了更好的瞭解 Deno,包括瞭解 Node.js,更包括跟上整個 Web 的發展進程,我也開始了個人 Deno 之旅。
同時,另外一個更大的心態就像 Linux 之父 Linus Torvalds 的自傳名同樣,「只是爲了好玩」。在自身於職場負責的各類各樣前端業務外,出於好玩的心態,出於嚐鮮的心態,出於一種「Uncharted(神祕海域)」的心態,開啓了這一切。
那麼:你,爲何學 Deno?
在開發者羣體中,除了最多見的 Windows 操做系統外,Linux 和 MacOS 環境也佔重大的比重。Deno 的安裝方式在各個平臺都有相關的解決方案,本節包括之後全部章節均將默認在 MacOS 上學習 Deno,將來可能會涉及在 Linux 雲服務器上部署 Deno Web App。
所以若是你的操做系統是 MacOS,那很方便經過本文進行實戰學習。若是你的本地環境是 Linux 或者 Windows,除了一些包管理器的不一樣、安裝目錄的不一樣、環境變量的配置方式不太相同外,並不會阻止你深刻學習 Deno 的腳步。能夠根據自身操做系統來在 Deno 官方、Deno 社區或者《Deno 鑽研之術》系列倉庫的 issues 區進行搜尋、討論 Deno 的其它多種安裝方式。
從命令行安裝一個軟件包須要注意什麼?固然是該軟件包是否安裝成功、安裝的過程有哪些日誌、是否能運行成功、是否簡單配置來升級和卸載......基於這個角度,如下的安裝方式會選取 deno -V 來驗證是否安裝成功(產生了個 idea:「命令行安裝軟件檢查清單」,有趣)。
本節內容專一安裝過程,更加深刻的安裝原理篇將來會有所涉及,正式開始吧!
curl 在命令行或腳本中用於傳輸數據。這裏,第一種安裝方式即是經過 curl 下載遠程的安裝腳本 install.sh 中的 deno.zip 壓縮包到本地並當即執行,以下。
$ curl -fsSL https://deno.land/x/install/install.sh | sh
# ######################################################################## 100.0%-#O#- # # ######################################################################## 100.0%
# Archive: /Users/${USER_NAME}/.deno/bin/deno.zip
# inflating: deno
# Deno was installed successfully to /Users/${USER_NAME}/.deno/bin/deno
# Manually add the directory to your $HOME/.bash_profile (or similar)
# export DENO_INSTALL="/Users/${USER_NAME}/.deno"
# export PATH="$DENO_INSTALL/bin:$PATH"
# Run '/Users/${USER_NAME}/.deno/bin/deno --help' to get started
$ deno -V
# zsh: command not found: deno
複製代碼
此時安裝便成功了一半。從安裝成功後的終端日誌能夠看出,Deno 成功安裝在了用戶的 ~/.deno 下,而且進入這個目錄能夠看出裏面只剩下二進制軟件 ~/.deno/bin/deno,解壓前的 deno.zip 已被刪除。接下來輸入 deno -V 並不能運行成功 deno 命令,須要咱們手動配置環境變量來讓終端知道 deno 命令該在哪執行。
注意:${USER_NAME} 是你在本身操做系統下的用戶名,須要手動改成本身的用戶名。
根據日誌提示,執行以下命令後,輸入 deno -V 便能看出 deno 命令已成功配置。
$ export DENO_INSTALL="/Users/${USER_NAME}/.deno"
$ export PATH="$DENO_INSTALL/bin:$PATH"
$ deno -V
# deno 1.0.0-rc2
$ which deno
# /Users/${USER_NAME}/.deno/bin/deno
$ echo $PATH
# /Users/${USER_NAME}/.deno/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/...
複製代碼
這裏安裝到的 Deno 版本是 1.0.0-rc2,截止 2020-05-13 早上最新的版本是 1.0.0-rc3,讓 Deno 自更新版本的命令以下。
$ deno upgrade
# Checking for latest version
# Version has been found
# Deno is upgrading to version 1.0.0-rc3
# downloading https://github.com/denoland/deno/releases/download/v1.0.0-rc3/deno-x86_64-apple-darwin.zip
# downloading https://github-production-release-asset-2e65be.s3.amazonaws.com/133442384/...
複製代碼
若是你剛纔經過 curl 已經將 Deno 安裝成功了,如今想嘗試 Homebrew 的安裝,能夠根據已知的 deno 目錄和環境變量值,手動卸載 deno,確保相關目錄(~/.deno)和相關環境變量(export -p | grep deno 來驗收)都清空。
# 安裝 Homebrew
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
複製代碼
如今咱們來使用 MacOS 上最知名的包管理器之一 Homebrew 來安裝 Deno。因爲 Homebrew 默認每次執行都會自動檢查更新,顯示超慢的 Updating Homebrew...,還不顯示具體進度,須要先臨時關閉 Homebrew 自動更新後正式安裝 Deno。
$ export HOMEBREW_NO_AUTO_UPDATE=true
$ brew install deno
# ==> Downloading https://homebrew.bintray.com/bottles/deno-0.42.0.catalina.bottle.tar.gz
# ==> Downloading from https://akamai.bintray.com/b4/b4f91dd079eee18b85b157bb03b1535935a37d9fb6f078e271a7b48b2afd34ea?__gda__=exp=15
# ######################################################################## 100.0%
# ==> Pouring deno-0.42.0.catalina.bottle.tar.gz
# ==> Caveats
# Bash completion has been installed to:
# /usr/local/etc/bash_completion.d
# zsh completions have been installed to:
# /usr/local/share/zsh/site-functions
# ==> Summary
# 🍺 /usr/local/Cellar/deno/0.42.0: 9 files, 41.4MB
# ==> `brew cleanup` has not been run in 30 days, running now...
# Error: Permission denied @ apply2files - /usr/local/lib/node_modules/expo-cli/node_modules/.bin/detect-libc
複製代碼
從如上終端日誌和 formulae.brew.sh/formula/den… 中能夠看出,Homebrew 上的 Deno 最新版不支持 deno-v1.0.0-rcx 版,只支持 0.42.0。且 Homebrew 會將 Deno 軟件放置在 /usr/local/Cellar/deno 下,並在 /usr/local/bin 中自動更新了環境變量。
$ deno -V
# deno 0.42.0
$ which deno
# /usr/local/bin/deno
$ ll /usr/local/bin/deno
# lrwxr-xr-x 1 ${USER_NAME} admin 30B May 13 10:53
# /usr/local/bin/deno -> ../Cellar/deno/0.42.0/bin/deno
複製代碼
ASDF 的體驗還不錯,ASDF 是可擴展的版本管理器,支持 Ruby、Node.js、Elixir 和 Erlang 等,咱們能夠經過 ASDF 來安裝 Deno,包括進行快速的管理 Deno 的多版本。首先安裝 ASDF,可使用經過 Git 安裝並手動配置環境變量,也能夠經過 Homebrew 來安裝。
$ brew install asdf
# ==> Downloading https://github.com/asdf-vm/asdf/archive/v0.7.8.tar.gz
# Already downloaded: /Users/${USER_NAME}/Library/Caches/Homebrew/downloads/34d73b51ece171e6c4ffe51147d4599c5b7f78749b379dec98ab7dd9174bd595--asdf-0.7.8.tar.gz
# ==> Caveats
# Bash completion has been installed to:
# /usr/local/etc/bash_completion.d
#
# zsh completions have been installed to:
# /usr/local/share/zsh/site-functions
# ==> Summary
# 🍺 /usr/local/Cellar/asdf/0.7.8: 104 files, 219.6KB, built in 18 seconds
複製代碼
以上須要安裝 Deno 前先配置 deno 的 asdf 地址。ASDF 能夠很方便的進行 Deno 多版本控制。
$ asdf plugin-add deno https://github.com/asdf-community/asdf-deno.git
$ asdf plugin list --urls
# deno https://github.com/asdf-community/asdf-deno.git
$ asdf install deno 1.0.0-rc3
# /Users/${USER_NAME}/.asdf/plugins/deno/bin/install: line 27: [: 100-rc3: integer expression expected
# ∗ Downloading and installing deno...
# Archive: /Users/${USER_NAME}/.asdf/installs/deno/1.0.0-rc3/bin/deno.zip
# inflating: /Users/${USER_NAME}/.asdf/installs/deno/1.0.0-rc3/bin/deno
# The installation was successful!
$ which deno
deno not found
複製代碼
可見,經過 ASDF 已經成功安裝 Deno,但須要建立軟連接,即綁定環境變量。
# 建立軟連接
$ ln -s /Users/${USER_NAME}/.asdf/installs/deno/1.0.0-rc3/bin/deno /usr/local/bin
$ deno -V
# deno 1.0.0-rc3
$ which deno
# /usr/local/bin/deno
$ ll /usr/local/bin/deno
# lrwxr-xr-x 1 ${USER_NAME} admin 50B May 11 18:37
# /usr/local/bin/deno -> /Users/${USER_NAME}/.asdf/installs/deno/1.0.0-rc3/bin/deno
# 全局配置 Deno 版本
$ asdf global deno 1.0.0-rc3
# 在當前目錄下設置 Deno 版本
$ asdf local deno 1.0.0-rc3
# 查看全部能夠安裝的 Deno 版本
$ asdf list all deno
# 查看當前 Deno 版本
$ asdf current deno # 1.0.0-rc3 (set by /Users/${USER_NAME}/.tool-versions)
複製代碼
因爲篇幅所限,從源碼中安裝能夠引伸出不少知識,本文先不涉及,將來會有所更新。
基於自身所要使用的操做系統和想要學習 Deno 的方式,從「命令行快速安裝」、「包管理器單版本安裝」、「包管理器多版本安裝並控制」、「源碼上安裝」等角度決定不一樣安裝方式便可。
Brian Kernighan 於 1978 年寫了一本名叫《C 程序設計語言》的編程書,該書中第一次引用了 Hello World 程序,這個傳統便被傳承至今。在此,關於 Deno 的第一個程序也能夠從 Hello World 開始。
由於 Deno 內置 TypeScript 運行時,這裏的示例即是官網提供的 welcome.ts,具體以下。
// welcome.ts
// 從 URL 上導入 server.ts 模塊,並提取(ES6 解構賦值)出 serve 對象
import { serve } from "https://deno.land/std/http/server.ts";
// 實例化一個 serve 對象
const s = serve({ port: 8000 });
// 在終端上打印程序監聽的端口地址
console.log("http://localhost:8000/");
// 使用 ES9 新特性 for await 語法,當訪問監聽端口時,返回一句「Hello World」
for await (const req of s) {
req.respond({ body: "Hello World\n" });
}
複製代碼
若是如上的 welcome.ts 能成功在 Deno 中直接運行成功,說明了什麼?短短的幾行代碼,便能看出 Deno 自身提供官方標準庫(解決了尋找對比學習第三方庫的成本),Deno 的模塊能夠從 URL 上直接導入(獨特的導入方式),Deno 支持最新的 ES 標準(不用忙於配置各類 ES6+ 語法的轉移器),Deno 內置 TypeScript 運行時(無需手動安裝配置 TypeScript 轉移器)。
如今來執行 welcome.ts,因爲代碼中引入了遠程的 server.ts,server.ts 由引入了其它文件,deno 如今會統一下載到全局目錄上並執行文件。
$ deno-tutorial git:(master) deno run --allow-net demos/welcome.ts
# Compile file:///Users/${USER_NAME}/WorkSpace/Hylerrix/deno-tutorial/demos/welcome.ts
# Download https://deno.land/std@0.50.0/http/server.ts
# Download https://deno.land/std@0.50.0/encoding/utf8.ts
# Download https://deno.land/std@0.50.0/io/bufio.ts
# Download https://deno.land/std@0.50.0/testing/asserts.ts
# Download https://deno.land/std@0.50.0/async/mod.ts
# Download https://deno.land/std@0.50.0/http/_io.ts
# Download https://deno.land/std@0.50.0/io/util.ts
# Download https://deno.land/std@0.50.0/path/mod.ts
# Download https://deno.land/std@0.50.0/path/win32.ts
# Download https://deno.land/std@0.50.0/path/posix.ts
# Download https://deno.land/std@0.50.0/path/common.ts
# Download https://deno.land/std@0.50.0/path/separator.ts
# Download https://deno.land/std@0.50.0/path/interface.ts
# Download https://deno.land/std@0.50.0/path/glob.ts
# Download https://deno.land/std@0.50.0/path/_constants.ts
# Download https://deno.land/std@0.50.0/path/_util.ts
# Download https://deno.land/std@0.50.0/fmt/colors.ts
# Download https://deno.land/std@0.50.0/testing/diff.ts
# Download https://deno.land/std@0.50.0/path/_globrex.ts
# Download https://deno.land/std@0.50.0/async/deferred.ts
# Download https://deno.land/std@0.50.0/async/delay.ts
# Download https://deno.land/std@0.50.0/async/mux_async_iterator.ts
# Download https://deno.land/std@0.50.0/textproto/mod.ts
# Download https://deno.land/std@0.50.0/http/http_status.ts
# Download https://deno.land/std@0.50.0/bytes/mod.ts
複製代碼
此時打開 localhost:8000 提示成功。
將來持續更新在《Deno 鑽研之術》開源電子書倉庫中。
本文屬於《Deno 鑽研系列》的基礎篇,將來計劃逐步展開添加的章節並填充更多的文章,如:
歡迎訂閱,一塊兒成長,敬請 Star, Watch & Issue 開源倉庫《Deno 鑽研之術》!三連一下。