概述
先说一下 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。