前言
在本文中,我們介紹建置 Deno 開發環境的過程,讓讀者可以開始寫 Deno 程式。
線上試用 Deno
雖然 Deno 是新興軟體,已經有一些網站建置 Deno 線上編輯器了,像是 deno.down 和 repl.it 都有這類編輯器,供 Deno 學習者練習 Deno 程式。目前來說,較建議用 repl.it 來練習,因為內附的 Deno 版本較新。
安裝 Deno
由於 Deno 是以單一執行檔的形式來發佈,建議直接到 Deno 官網下載預編好的執行檔,放到任一 PATH 變數所在路徑即可。
由於 Deno 在開發時,網際網路已經相當於程式設計者的基本資源,Deno 的函式庫都是需要時才從網路上抓取,而且 Deno 可以透過 URL 直接抓取遠端 Deno 命令稿。這項設計是仿造瀏覽器從遠端抓取 JavaScript 命令稿的模式。
如果想用套件管理軟體下載及安裝 Deno,可參考這裡的說明。
選擇適合 Deno 的編輯器
Deno 的語言就是 JavaScript 和 TypeScript,直接使用支援 TypeScript 的編輯器即可。可參考 TypeScript 的編輯器清單,從中選擇適合自己的編輯器。
對於經驗甚少的初學者來說,使用 VSCode 是最簡單的選擇。因為 VSCode 和 TypeScript 同是微軟開發的軟體專案,VSCode 對 TypeScript 有良好的支援。
撰寫第一個 Deno 程式
在本節中,我們以經典的 Hello World 程式來熟悉 Deno 程式的開發流程。以編輯器建立 hello.ts 命令稿,並加入以下內容:
console.log('Hello World');
基本上,這也是 JavaScript 程式,和 TypeScript 程式沒有區分。
以 deno run
指令執行該命令稿:
$ deno run hello.ts
Hello World
Deno 主程式有數個子命令可用,從中可看到向 Golang 敬致的設計。
直接在命令列執行 Deno 程式
以 deno eval
指令即可在命令列直接寫 one liner (行內程式)。參考以下範例指令:
$ deno eval "console.log('Hello World');"
Hello World
由於 JavaScript 在設計時未考慮寫 one liner 的情境,所以這項功能不算很實用。
Deno 的互動式運行環境
執行 Deno 時若不加任何參數,和 deno repl
指令等效,這時候會進入 Deno 的互動式運行環境:
$ deno
Deno 1.0.0
exit using ctrl+d or close()
>
互動式運行環境最早來自於 Lisp,在很多程式語言都有實作這項功能。
可以在此互動式環境輸入一些敘述,會得到即時的回饋:
> 3 + 4;
7
在互動式環境中,不需要使用 console.log
即可輸出值。
如果想離開此互動式環境,可使用 Ctrl + d 或輸入 close()
指令:
> close();
這個互動式環境可以記住輸入的變數,在離開該環境後那些變數會自動消失。
由於 JavaScript 原本是內嵌在網頁內的命令稿,在設計時未考慮互動式環境的情境,所以這項功能沒辦法像 Lisp 或 R 的互動式環境那麼好用。
將 TypeScript 程式碼轉為 JavaScript 程式碼
使用 deno bundle
指令可將 TypeScript 命令稿自動合併並轉為等效的 JavaScript 命令稿。參考以下虛擬指令:
$ deno bundle path/to/src.ts path/to/dest.js
在命令稿合併後,部署程式就更加方便。
當我們要觀察轉出來的 JavaScript 程式碼來觀察 TypeScript 程式實際的行為,deno bundle
指令就很實用。
理論上,轉出來的 JavaScript 命令稿相當於 ES module,可以直接部署在網頁前端。但要小心地避開和網頁前端不相容的 API,而且 ES module 這項特性目前還太新,尚不適合直接用到網頁前端上。
Deno 預設的沙盒模式
Deno 和 Node.js 的其中一項差異就是前者預設即使用沙盒模式。例如,使用 Deno 官網的 cat.ts 命令稿在命令列環境印出剛剛寫的 htllo.ts 的內容:
> deno run https://deno.land/std/examples/cat.ts hello.ts
但這會引發以下錯誤訊息:
error: Uncaught PermissionDenied: read access to "C:\Users\user\hello.ts", run again with the --allow-read flag
at unwrapResponse ($deno$/ops/dispatch_json.ts:43:11)
at Object.sendAsync ($deno$/ops/dispatch_json.ts:98:10)
at async Object.open ($deno$/files.ts:37:15)
at async https://deno.land/std/examples/cat.ts:4:16
因為 cat.ts 有用到讀取檔案的功能,但 Deno 在預設情形下關掉該功能,故引發錯誤。
命令稿使用者要明確地開啟相關權限,才能順利地使用該命令稿:
> deno run --allow-read=. https://deno.land/std/examples/cat.ts hello.ts
沙盒模式並不是很新的概念,對於未受信任的運算環境,使用沙盒來保護系統是常見的措施。
像瀏覽器幾乎隨時都會從遠端下載各種程式,故瀏覽器本身也是在沙盒中運行。但預設即開啟沙盒模式的運行環境不多,Deno 是少數例子之一。由於 Deno 誕生於網路世代,有這樣的考量是相當不錯的。
自動編排程式碼
使用 deno fmt
指令即可自動編排程式碼。參考以下虛擬指令:
$ deno fmt path/to/source.ts
這個指令是從 go fmt
學來的特性。所以,deno fmt
同樣不能調整程式碼的風格,只能用特定註解來避掉自動編排的功能。
deno fmt
可以讓程式碼風格更加一致,對於團隊開發會有幫助。等開發工具更成熟後,應該也會變成編輯器外掛的功能之一。