本篇開始,將會針對 Deno 官方文件的子項目逐一介紹:
CLI and Sandbox
TypeScript Options
Import and export Module
Testing
Related Tool
Deno 是一個命令列介面的應用程式,它整合了許多功能,像是:
作為 JavaScript 以及 TypeScript 程式碼的執行環境,並且導入了 Sandbox 。
自帶測試功能,不需要依賴相依套件
自帶類似於 ESLint 的程式檢查工具
以 ESModule 為基準,並且支持 Url Import 導入相關外部套件
DenoLand 上琳瑯滿目的第三方套件
Deno 提供了多種方法讓使用者查詢常見的主要說明:
# 常見說明
deno help
# 更為精簡的指令,功能與上面的指令一樣
deno -h
# 相較前者,該命令會印出更多細節資訊
deno --help
若要查看指定命令的相關資訊,我們可以將上面的 help 參數作為子命令使用。
下面以 deno bundle
為例:
deno help bundle
deno bundle -h
deno bundle --help
如果讀者對其他命令有興趣,可以參考官方文件。
不過筆者是覺得不需要太心急,我會在這幾天把這些項目向讀者交代清楚 XD
Deno 可以抓取不同來源的程式碼,像是:
deno run main.ts
deno run https://mydomain.com/main.ts
cat main.ts | deno run -
與 Deno 的子命列不同, Deno 允許使用者將使用者空間的參數傳送到程式碼並運行:
deno run main.ts a b -c --quiet
在 main.ts 中:
console.log(Deno.args); // [ "a", "b", "-c", "--quiet" ]
這邊要注意的是,若將參數放到腳本名稱後面,會被當作上面的範例一樣被傳入程式碼。
假設:
我們今天要讓執行的程式具有網路權限,應該這麼做:
deno run --allow-net net_client.ts
而不是:
deno run net_client.ts --allow-net
這樣做會讓 --allow-net
被當作參數傳入程式碼:
console.log(Deno.args); // [ "--allow-net" ]
我們可以在運行程式碼時加入 --watch
,如此一來便會啟動內建的檔案監聽程式。
deno run --watch net_client.ts
上面的命令會讓 deno 以 net_client.ts 作為入口點,靜態的導入所有本地檔案,當有任何一個檔案被更動, deno 就會重新啟動 net_client.ts 。
該功能可以讓我們確保任何被用到的相依套件的完整性、一致性。
並且,該旗標可以用在以下命令:
deno run
deno cache
deno test
假設我們的主程式 main.ts 利用 url import 導入其他第三方套件:
// main.ts
export { xyz } from "https://unpkg.com/xyz-lib@v0.9.0/lib.ts";
這時候,我們可以加入 --lock=lock.json --lock-write
去產生或是更新 lock.json :
deno cache --lock=lock.json --lock-write src/deps.ts
在 lock.json 中,會列出所有 main.ts 用到的相依套件以及它的 hash value :
{
"https://deno.land/std@0.71.0/textproto/mod.ts": "3118d7a42c03c242c5a49c2ad91c8396110e14acca1324e7aaefd31a999b71a4",
"https://deno.land/std@0.71.0/io/util.ts": "ae133d310a0fdcf298cea7bc09a599c49acb616d34e148e263bcb02976f80dee",
"https://deno.land/std@0.71.0/async/delay.ts": "35957d585a6e3dd87706858fb1d6b551cb278271b03f52c5a2cb70e65e00c26a",
...
}
為何要有 hash value 呢?理想的 hash function 可以將所有不同的東西經過運算並輸出成獨一無二的值。
因此,我們同樣可以利用 hash 去驗證本地用到的相依套件與目標的相依套件內容是否一致。
上面提到,該旗標也可以用在 deno run
,如此一來便能讓程式碼運行時自動驗證套件的正確性。
注意:這僅針對先前加入到
lock.json
中的相關套件進行驗證。如果是新加入的套件將會被快取起來,不會經過驗證。
若我們希望主程式碼使用的相依套件都是經過本地快取的,可以加入 --cached-only
達成目標:
deno run --lock=lock.json --cached-only main.ts
其他能夠影響 deno run
, deno test
, deno cache
的旗標:
--config <FILE> Load tsconfig.json configuration file
--importmap <FILE> UNSTABLE: Load import map file
--no-remote Do not resolve remote modules
--reload=<CACHE_BLOCKLIST> Reload source code cache (recompile TypeScript)
--unstable Enable unstable APIs
能影響執行環境的旗標:
--cached-only Require that remote dependencies are already cached
--inspect=<HOST:PORT> activate inspector on host:port ...
--inspect-brk=<HOST:PORT> activate inspector on host:port and break at ...
--seed <NUMBER> Seed Math.random()
--v8-flags=<v8-flags> Set V8 command line options. For help: ...
沒想到只對官方文件的 CLI 分頁內容進行介紹就產生了這麼長的篇幅...
看來30天應該不夠筆者完結該系列文了 ORZ
明天會針對 Sandbox 以及相關權限繼續講解,881~
同樣的事情在不同人眼中可能會有不同的見解、看法。
在讀完本篇以後,筆者也強烈建議大家去看看以下文章,或許會對型別、變數宣告...等觀念有更深層的看法唷!