【Day 27】关於 Deno 以及基础安装

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


<<:  Neo4j 的 GraphQL 计画:GRANDstack

>>:  第42篇-学习 DNS Server - 2

[Day 18] Node.js 的非同步小实验

前言 有在写 node 的人可能听人提过, node 的底层是一个支援非同步 IO 的 thread...

DAY28 Aidea专案实作-AOI瑕疵检测(3/4)

接续上一章的资料前处理後,今天要进入训练模型的流程,让我们继续看下去~ 载入相关套件 import ...

Day1 所以,网路到底是什麽?

在这个人手一机的时代,没接触过网路的人应该不多吧,不管是购物、查资料、追剧都会用到网路,但这个每天都...

Day 29 - 这一年多来的开发问题解析心得分享

今天讨论的主题是关於开发的过程中,问题要怎麽去思考和解决的小技巧,这些内容对於刚开始学习程序或者是新...

拟定 ISMS 程序书撰写方向

确认导入范围 旨在确认企业或机构的决心,与实际要推广的范围。 订定资安目标 资安目标可以参考同业或客...