iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
0
自我挑戰組

玩轉 React 從0到1系列 第 27

【Day 27】關於 Deno 以及基礎安裝

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20201014/20109963EeoAMWDT8V.jpg

關於 Deno

Deno 上一次調整後,為了效能問題,將核心模塊從 Typescript 改回 Javascript,增加了 rusty_v8 和 deno_typescript 兩個 rust 的套件,目前的語言比例大概是:

  • Typescript : 64.7%
  • Rust: 31.9%
  • Javascript: 1.4%

Deno 是以 V8 引擎與 Rust 為底層,建立的 JS、Typescript 的執行環境,搭配 Tokio 處理(異步)事件觸發環境。
以下為架構圖:
https://ithelp.ithome.com.tw/upload/images/20201015/20109963T5HWkAwpev.png

  1. Deno 以 Rust 作為入口,通過 Rust FFI 去執行 C++
  2. 然後在 C++ 中引入 V8 的 API,並且初始化 V8 Object,拿到 V8 Object 後可以用來解析執行 Javascript 程式。
  3. 初始化的過程中,同時會通過 C++ 向 V8 的 Isolate 註冊到外部 C++ 的方法,像是圖中的 deno_recv_cb等
  4. 然後在初始化 Context 的 Javascript 程式,向 V8 注入 Deno Object,也開放 Deno API 給 Javascript
  5. 當 V8 在執行 Context 時,可以通過綁定在 V8 上 C++ 的方法,調用 Rust 方法,執行底層邏輯

關於 Deno 的優與缺

優點

  1. 不需要在安裝 Module,而是改用 url import 的方式 (去除中心模組)
  2. 支持 Typescript 以及 WebAssembly,而且 Deno 自動編譯 Typescript (自帶 bundler)
  3. 內建測試工具
import { assertStrictEquals } from "https://deno.land/std/testing/asserts.ts";
Deno.test("Test Assert Strict Equals", () => {
  assertStrictEquals(1, 1);
  assertStrictEquals("Hello", "Hello");
}); // Test Assert Strict Equals ... ok (2ms)
  1. 良好的 await 語法支持
  2. 支持 Web API,盡可能與瀏覽器一致,提供 window,支持 fetch 等 Web標準,以及 onLoad 等事件
  3. 安全性提升
// 會出錯,因為沒有允許網路的權限
deno run \
https://deno.land/std/examples/curl.ts \
https://example.com 
// 更新後
deno run --allow-net \
https://deno.land/std/examples/curl.ts \
https://example.com

缺點

  1. 與 NodeJS 專案不相容
  2. 無法使用 NodeJS 相關的套件

安裝方法 (MacOS環境)

  1. 使用 curl 抓取與安裝腳本
$ curl -fsSL https://deno.land/x/install/install.sh | sh

此時 Deno 已經成功安裝到使用者的 ~/.deno 之下

  1. 手動配置環境
$ export DENO_INSTALL="/Users/${USER_NAME}/.deno"
$ export PATH="$DENO_INSTALL/bin:$PATH"
$ deno -V
# deno 1.4.6
$ which deno
# /Users/${USER_NAME}/.deno/bin/deno
$ echo $PATH
# /Users/${USER_NAME}/.deno/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/...
  1. 如果需要更新環境
// 嘗試升級,但不是真正的升級,只是做了升級需要的檢查,如果發現不是最新版,會升到最新
$ deno upgrade --dry-run
// 強制升級到最高版本
$ deno upgrade --force 
// 升級到特定版本
$ deno upgrade --version 2.0 

Deno 第一個小程式

新增一個 welcome.ts 檔案:

// welcome.ts
// 從 URL 導入 server.ts 模組,並使用 serve Object
import { serve } from "https://deno.land/std/http/server.ts";
// 建立一個 serve Instance
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" });
}

正式跑起來:

deno run --allow-net welcome.ts

結論

  • 介紹了 Deno
  • 介紹了 如何安裝 Deno

/images/emoticon/emoticon11.gif


上一篇
【Day 26】關於 Deno 與 NodeJS 的這些年和那些事
下一篇
【Day 28】Deno + Oak 建立 Restful API (1)
系列文
玩轉 React 從0到130
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言