deno入门

882 阅读3分钟

概述

先说一下 Deno 这个词怎么发音。 两种发音,"德诺"和"蒂诺",我都听到过。看起来,"蒂诺"这个发音应该更合适一些,因为 Deno 的标志是一只恐龙。恐龙(dinosaur)的英文缩写正是 dino。

Deno 是 Ryan Dahl 在2017年创立的。 Ryan Dahl 也是 Node.js 的创始人,从2007年一直到2012年,他后来把 Node.js 移交给了其他开发者,不再过问了,转而研究人工智能。

Deno的目标是为现代程序员提供高效且安全的脚本环境。

deno特点

  • Deno 也是一个服务器运行时,但是支持多种语言,可以直接运行 JavaScript、TypeScript 和 WebAssembly 程序。
    • 它内置了 V8 引擎,用来解释 JavaScript。
    • 同时,也内置了 tsc 引擎,解释 TypeScript。
    • 它使用 Rust 语言开发,由于 Rust 原生支持 WebAssembly,所以它也能直接运行 WebAssembly。
    • 它的异步操作不使用 libuv 这个库,而是使用 Rust 语言的 Tokio 库,来实现事件循环(event loop)。
  • 它支持跨平台(Mac、Linux、Windows)。
  • Deno 具有安全控制,默认情况下脚本不具有读写权限。
  • Deno 支持 Web API,尽量跟浏览器保持一致。Deno 所有的异步操作,一律返回 Promise。
  • Deno 只支持 ES 模块

安装

使用Shell:

curl -fsSL https://deno.land/x/install/install.sh | sh

或使用PowerShell:

iwr https://deno.land/x/install/install.ps1 -useb | iex

使用Homebrew (Mac或Linux):

brew install deno

使用Chocolatey (Windows):

choco install deno

有关更多安装选项,请参阅deno_install。

测试一下

deno --version
deno 0.31.0
v8 8.1.108
typescript 3.7.2
hello World
deno run https://deno.land/std/examples/welcome.ts
//Download https://deno.land/std/examples/welcome.ts
//Compile https://deno.land/std/examples/welcome.ts
//Welcome to Deno 🦕

缓存➜deno run https://deno.land/std/examples/welcome.ts
 W//Welcome to Deno 🦕

进入REPL

deno
>1+1
2

Bundling编译ts为js

可以像Deno中的任何其他模块一样运行:

deno bundle https://deno.land/std/examples/colors.ts colors.bundle.js
Download https://deno.land/std/examples/colors.ts
Download https://deno.land/std/fmt/colors.ts
Bundling "https://deno.land/std/examples/colors.ts"
Emitting bundle to "colors.bundle.js"
7.5 kB emitted.

deno colors.bundle.js

Hello world!

Import maps依赖配置文件

编辑json文件

//import_map.json
{
    "imports": {
       "http/": "https://deno.land/std/http/"
    }
 }

编写index.js

import { serve } from "http/server.ts";

const body = new TextEncoder().encode("Hello World\n");
for await (const req of serve(":8000")) {
  req.respond({ body });
}

执行命令run

deno run --reload --allow-net --importmap=import_map.json index.js

测试下

curl localhost:8000
//Hello World

reload更新依赖模块

有时我们只想升级一些模块。您可以通过将参数传递给--reload标志来控制它。

重新加载所有内容 --reload

重新加载所有标准模块 --reload=https://deno.land/std

要重新加载特定的模块(在本示例中为颜色和文件系统实用程序),请使用逗号分隔网址 --reload=https://deno.land/std/fs/utils.ts,https://deno.land/std/fmt/colors.ts

WAMS支持

 //index.js
 const wasmCode = new Uint8Array([
    0, 97, 115, 109, 1, 0, 0, 0, 1, 133, 128, 128, 128, 0, 1, 96, 0, 1, 127,
    3, 130, 128, 128, 128, 0, 1, 0, 4, 132, 128, 128, 128, 0, 1, 112, 0, 0,
    5, 131, 128, 128, 128, 0, 1, 0, 1, 6, 129, 128, 128, 128, 0, 0, 7, 145,
    128, 128, 128, 0, 2, 6, 109, 101, 109, 111, 114, 121, 2, 0, 4, 109, 97,
    105, 110, 0, 0, 10, 138, 128, 128, 128, 0, 1, 132, 128, 128, 128, 0, 0,
    65, 42, 11
  ]);
  const wasmModule = new WebAssembly.Module(wasmCode);
  const wasmInstance = new WebAssembly.Instance(wasmModule);
  console.log(wasmInstance.exports.main().toString());
 

deno run index.js //42

程序生命周期

Deno支持与浏览器兼容的生命周期事件:load和unload。您可以使用这些事件在程序中提供设置和清除代码。 load事件侦听器支持异步功能,并将等待这些功能。unload事件侦听器仅支持同步代码。这两个事件均不可取消。

//index.ts
import "./imported.ts";

const handler = (e: Event): void => {
  //4
  //7
  console.log(`got ${e.type} event in event handler (main)`);
};
window.addEventListener("load", handler);

window.addEventListener("unload", handler);

window.onload = (e: Event): void => {
  //2
  console.log(`got ${e.type} event in onload function (main)`);
};

window.onunload = (e: Event): void => {
  //5
  console.log(`got ${e.type} event in onunload function (main)`);
};
// imported.ts
const handler = (e: Event): void => {
    //3
    //6
    console.log(`got ${e.type} event in event handler (imported)`);
  };
  
  window.addEventListener("load", handler);
  window.addEventListener("unload", handler);
  
  window.onload = (e: Event): void => {
    console.log(`got ${e.type} event in onload function (imported)`);
  };
  
  window.onunload = (e: Event): void => {
    console.log(`got ${e.type} event in onunload function (imported)`);
  };
  
  //1
  console.log("log from imported script");

同时使用window.addEventListener和 window.onload/ window.onunload来定义事件的处理程序。它们之间有一个主要区别, 使用window.addEventListener都跑, 但 window.onload和window.onunload定义main.ts中定义重写处理程序imported.ts。

参考文章

deno.land/std/manual.…

www.ruanyifeng.com/blog/2020/0…