《Deno 鉆研之術(shù)》系列于 Deno v1 正式發(fā)售之日全新推出,每周不定期更新在 Github 中(https://github.com/hylerrix/deno-tutorial)。讓我們一起循序漸進學 Deno,先易后難補 Node,面向未來開發(fā)屬于自己的 Deno Web App。歡迎訂閱,歡迎交流。
學習 Deno 的 N+ 種理由
時隔 Deno 開源兩年整,萬眾期待的 Deno v1 正式版今日正式登場?;蛟S你已經(jīng)聽過 Deno 的大名、或許你在項目中已經(jīng)大量使用 Deno 作者的上一個明星項目 Node.js,亦或許今天才剛剛接觸這一切...總之現(xiàn)在上車,背后是業(yè)界多年 Web App 開發(fā)經(jīng)驗的累加,面前是一片充滿未知與驚喜的 Deno 藍海。
簡單的介紹 Deno?
Deno 是一個基于 Chrome V8 引擎開發(fā)的一個安全的 JavaScript 和 TypeScript 運行時,底層由 Rust 語言編寫(最初選型為 Go),發(fā)起人是 Ryan Dahl。Ry 也是 Node.js 的發(fā)起人,當 Ry 將 Node 交付給社區(qū)一段時間后回看 Node 的現(xiàn)狀,提出了很多無法忽視的缺陷,于是帶來了全新的項目,Deno。
正是 2011 年左右 Node.js 的出現(xiàn),將 JavaScript 正式帶入服務端應用開發(fā)領域;也通過彼時領先的模塊化思想,促進了 Web 前端工程化的火速發(fā)展。同時驗證并促進了 Atwood 定律的發(fā)展——任何可以用 JavaScript 來寫的應用,最終都將用 JavaScript 來寫。
雨后春筍,縱使如今在 Node.js 上構(gòu)建的各大基礎設施(開源庫、框架、腳手架等)支撐著從創(chuàng)業(yè)公司到各大主流互聯(lián)網(wǎng)公司的數(shù)以萬計的核心業(yè)務發(fā)展,但在 Node 本身不那么容易拋開的歷史包袱下,新生的 Deno 依然擁有著很多前瞻性的理念,比如:
- 底層使用 Rust 語言開發(fā):有很多 Rust 的優(yōu)良特性支持;
- 原生支持編譯 TypeScript 語言:無需額外進行繁瑣的手動配置;
- 核心標準庫維護在 Deno 自身中:無需糾結(jié)在各大第三方庫中如何選型的同時無需擔心這些庫的無保障維護問題;
- 獨特的安全沙箱支持:默認情況下腳本不具有讀寫權(quán)限,需要授權(quán);
- 盡可能地支持 Web 標準:無需更多的手動配置,絕大部分功能開箱即用;
- 支持 ES 模塊標準:無需再承擔 Node.js 的 CommonJS “歷史包袱”;
- 重新設計的包管理器:拋棄繁重的 Node Modules,甚至可以很方便地從 URL 中導入模塊;
- 重新思考 package.json:讓逐漸龐大的 package.json 能得到合理的“釋放”;
- 原生支持 JSDoc:并將其用于內(nèi)置的文檔系統(tǒng);
- 更好的工具鏈支持:開發(fā)者真的不想再忙于各種配置過程之中了;
- 內(nèi)置監(jiān)視文件功能:讓熱更新更加方便簡單。
這就是 Deno,一個令人激動的項目。更多具體的知識點,會在本系列后期逐步展開。
下方 Deno 知識體系示意圖的截圖來自基于機器學習的信息抽取和檢索系統(tǒng) Magi.com,“它能將任何領域的自然語言文本中的知識提取成結(jié)構(gòu)化的數(shù)據(jù),通過終身學習持續(xù)聚合和糾錯,進而為人類用戶和其他人工智能提供可解析、可檢索、可溯源的知識體系”。圖中內(nèi)容僅供參考。
優(yōu)秀的生態(tài),Star 量破 50k+
在 Star History 網(wǎng)站上,我們可以看到這兩年來社區(qū)對 Deno 的關注度穩(wěn)增不減。從發(fā)布一個月多便接近 20k+,到現(xiàn)在已經(jīng)達到了 50k+ 的 Star 數(shù)量,這意味著 Deno 已經(jīng)躋身 Github 項目全球排行榜至少前 70 位。
截止目前,誕生兩年的 Deno 貢獻者數(shù)量達到 270+ 位,有 3k+ 的 commit、416/1920 的 issues 解決比例和 42/3273 的 PR 解決比例(2020-05-12)。與此同時,誕生近十年的 Node 有 2690+ 位貢獻者,30k+ 的 commit、977/11585 的 issues 解決比例和 316/21192 的 PR 解決比例。
下圖即為 Deno 目前的 Star History 趨勢圖。
押寶 Deno?
關于為什么學習 Deno,每個人都會有自己的理由。社區(qū)中有一種有趣的聲音:學習 Deno 是一種“押寶”,希望通過學習 Deno 能徹底放棄 Node 并在未來通過 Deno 獲得更好的編程機會。
實則 Deno 還是處于早期階段,且 Node.js 的成功是有時代背景選擇而不可復制。因此將所有學習重心都押寶在 Deno 上尚且過早。
那么如何對待 Deno?Deno 是在開源社區(qū)的“禮物文化”環(huán)境下誕生的,我們一起將 Deno 看成是加入大家庭的新生命,一起從整個 Web 領域的進程中取長補短共同建設 Deno,才是現(xiàn)階段對待這份“禮物”最好的狀態(tài)。
要知道,從 Node 到 Deno,其中有太多的中國開發(fā)者的積極貢獻融入其中。
只是為了好玩
以 Ecma 成員名義發(fā)起,阿里巴巴、騰訊等公司領銜的最新《Node.js 開發(fā)者 2020 年度報告》中指出,越年輕的同學越關注 Deno。因此,這里著重引用一位年輕的谷歌華人實習生,Deno 核心貢獻者之一的 @kevinkassimo 的一句話來看,為什么學習 Deno?
平心而論,我最初參與的主要目的其實最早是想著“我一直在用 Node 但不了解它真實背后的工作原理”,所以最早看到 Deno 的時候在想“了解 Node 原理的比較好的一個方法是干脆自己去做一個新的 Node”。
——@kevinkassimo
這也正是我對于 Deno 的重要心態(tài)。大學初入校園期間正值 Node.js 最火的時刻,自己因為對 Node.js 的喜歡選擇了大前端領域,接下來的幾年也參加、舉辦過很多前端相關活動,但對于 Node.js 的了解因為自己的身份局限一直沒有得到更好的突破。
畢業(yè)這一年來看,Node.js 已經(jīng)發(fā)展出一個十分龐大的生態(tài),我們暢游其中能找到大量解決自身編程需求的 NPM 庫——這也更顯示出自己對于 Node.js 的熟悉差距越來越大?,F(xiàn)在 Deno 嶄新一片,為了更好的了解 Deno,包括了解 Node.js,更包括跟上整個 Web 的發(fā)展進程,我也開始了我的 Deno 之旅。
同時,另一個更大的心態(tài)就像 Linux 之父 Linus Torvalds 的自傳名一樣,“只是為了好玩”。在自身于職場負責的各種各樣前端業(yè)務外,出于好玩的心態(tài),出于嘗鮮的心態(tài),出于一種“Uncharted(神秘海域)”的心態(tài),開啟了這一切。
那么:你,為什么學 Deno?
Deno 在 MacOS 上的多種安裝方式
在開發(fā)者群體中,除了最常見的 Windows 操作系統(tǒng)外,Linux 和 MacOS 環(huán)境也占重大的比重。Deno 的安裝方式在各個平臺都有相關的解決方案,本節(jié)包括以后所有章節(jié)均將默認在 MacOS 上學習 Deno,未來可能會涉及在 Linux 云服務器上部署 Deno Web App。
因此如果你的操作系統(tǒng)是 MacOS,那很方便通過本文進行實戰(zhàn)學習。如果你的本地環(huán)境是 Linux 或者 Windows,除了一些包管理器的不同、安裝目錄的不同、環(huán)境變量的配置方式不太相同外,并不會阻止你深入學習 Deno 的腳步??梢愿鶕?jù)自身操作系統(tǒng)來在 Deno 官方、Deno 社區(qū)或者《Deno 鉆研之術(shù)》系列倉庫的 issues 區(qū)進行搜尋、討論 Deno 的其它多種安裝方式。
從命令行安裝一個軟件包需要注意什么?當然是該軟件包是否安裝成功、安裝的過程有哪些日志、是否能運行成功、是否簡單配置來升級和卸載......基于這個角度,以下的安裝方式會選取 deno -V 來驗證是否安裝成功(產(chǎn)生了個 idea:“命令行安裝軟件檢查清單”,有趣)。
本節(jié)內(nèi)容專注安裝過程,更加深入的安裝原理篇未來會有所涉及,正式開始吧!
安裝方式 1:使用 curl 直接安裝
curl 在命令行或腳本中用于傳輸數(shù)據(jù)。這里,第一種安裝方式便是通過 curl 下載遠程的安裝腳本 install.sh 中的 deno.zip 壓縮包到本地并立即執(zhí)行,如下。
$ 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 命令,需要我們手動配置環(huán)境變量來讓終端知道 deno 命令該在哪執(zhí)行。
注意:${USER_NAME} 是你在自己操作系統(tǒng)下的用戶名,需要手動改為自己的用戶名。
根據(jù)日志提示,執(zhí)行如下命令后,輸入 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/...
安裝方式 2:從 Homebrew 中安裝
如果你剛才通過 curl 已經(jīng)將 Deno 安裝成功了,現(xiàn)在想嘗試 Homebrew 的安裝,可以根據(jù)已知的 deno 目錄和環(huán)境變量值,手動卸載 deno,確保相關目錄(~/.deno)和相關環(huán)境變量(export -p | grep deno 來驗收)都清空。
# 安裝 Homebrew
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
現(xiàn)在我們來使用 MacOS 上最知名的包管理器之一 Homebrew 來安裝 Deno。由于 Homebrew 默認每次執(zhí)行都會自動檢查更新,顯示超慢的 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
從如上終端日志和 https://formulae.brew.sh/formula/deno 中可以看出,Homebrew 上的 Deno 最新版不支持 deno-v1.0.0-rcx 版,只支持 0.42.0。且 Homebrew 會將 Deno 軟件放置在 /usr/local/Cellar/deno 下,并在 /usr/local/bin 中自動更新了環(huán)境變量。
$ 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
安裝方式 3:從 ASDF 中安裝
ASDF 的體驗還不錯,ASDF 是可擴展的版本管理器,支持 Ruby、Node.js、Elixir 和 Erlang 等,我們可以通過 ASDF 來安裝 Deno,包括進行快速的管理 Deno 的多版本。首先安裝 ASDF,可以使用通過 Git 安裝并手動配置環(huán)境變量,也可以通過 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 已經(jīng)成功安裝 Deno,但需要創(chuàng)建軟鏈接,即綁定環(huán)境變量。
# 創(chuàng)建軟鏈接
$ 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)
安裝方式 4:從源碼中安裝
由于篇幅所限,從源碼中安裝可以引申出很多知識,本文先不涉及,未來會有所更新。
該選擇怎樣的安裝方式?
基于自身所要使用的操作系統(tǒng)和想要學習 Deno 的方式,從“命令行快速安裝”、“包管理器單版本安裝”、“包管理器多版本安裝并控制”、“源碼上安裝”等角度決定不同安裝方式即可。
Deno 的簡單實戰(zhàn)
準備一個 Hello World 程序
Brian Kernighan 于 1978 年寫了一本名叫《C 程序設計語言》的編程書,該書中第一次引用了 Hello World 程序,這個傳統(tǒng)便被傳承至今。在此,關于 Deno 的第一個程序也可以從 Hello World 開始。
因為 Deno 內(nèi)置 TypeScript 運行時,這里的示例便是官網(wǎng)提供的 welcome.ts,具體如下。
// welcome.ts
// 從 URL 上導入 server.ts 模塊,并提取(ES6 解構(gòu)賦值)出 serve 對象
import { serve } from "https://deno.land/std/http/server.ts";
// 實例化一個 serve 對象
const s = serve({ port: 8000 });
// 在終端上打印程序監(jiān)聽的端口地址
console.log("http://localhost:8000/");
// 使用 ES9 新特性 for await 語法,當訪問監(jiān)聽端口時,返回一句“Hello World”
for await (const req of s) {
req.respond({ body: "Hello World\n" });
}
如果如上的 welcome.ts 能成功在 Deno 中直接運行成功,說明了什么?短短的幾行代碼,便能看出 Deno 自身提供官方標準庫(解決了尋找對比學習第三方庫的成本),Deno 的模塊可以從 URL 上直接導入(獨特的導入方式),Deno 支持最新的 ES 標準(不用忙于配置各種 ES6+ 語法的轉(zhuǎn)移器),Deno 內(nèi)置 TypeScript 運行時(無需手動安裝配置 TypeScript 轉(zhuǎn)移器)。
Hello World
現(xiàn)在來執(zhí)行 welcome.ts,由于代碼中引入了遠程的 server.ts,server.ts 由引入了其它文件,deno 現(xiàn)在會統(tǒng)一下載到全局目錄上并執(zhí)行文件。
$ 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 的更多實戰(zhàn)
未來持續(xù)更新在《Deno 鉆研之術(shù)》開源電子書倉庫中。
參考資料
- Deno 運行時入門教程:Node.js 的替代品
- https://star-history.t9t.io/
- magi.com
- 《狼書:更了不起的 Node.js》
- deno-1-0-what-you-need-to-know
- https://gitstar-ranking.com/
- Node.js 開發(fā)者 2020 年度報告
- Hello World 程序的起源與歷史
- https://curl.haxx.se/
訂閱 & 待續(xù)
本文屬于《Deno 鉆研系列》的基礎篇,未來計劃逐步展開添加的章節(jié)并填充更多的文章,如:
- 基礎篇:循序漸進學 Deno 基礎知識;
- Node 篇:先易后難補 Node 知識,探索與 Deno 的異與同;
- Rust 篇:探索 Deno 底層有關 Rust 的更多知識;
- 前端篇:探索 Deno Web 前端應用開發(fā)的方式;
- 后端篇:探索 Deno Web 后端應用開發(fā)的方式;
- 架構(gòu)篇:深入到 Deno 底層讀 v8,學架構(gòu)。
歡迎訂閱,一起成長,敬請 Star, Watch & Issue 開源倉庫《Deno 鉆研之術(shù)》!三連一下。