Node.js的替代品—Deno初体验

Deno是什么

它内置了 V8 引擎,用来解释 JavaScript。同时,也内置了 tsc 引擎,解释 TypeScript。它使用 Rust 语言开发,由于 Rust 原生支持 WebAssembly,所以它也能直接运行 WebAssembly,说简单点就是Node.js的一个替代品。

Deno — A secure runtime for JavaScript and TypeScript.deno.land

为什么会出现Deno

  1. Node.js自己的模块格式CommonJSES模块不兼容。
  2. node_modules和的package.json在项目越来越大后变得难以管理。
  3. Node.js并不完善的功能,导致外部工具层出不穷。

由于上面这些原因,Ryan Dahl决定放弃Node.js,从头写一个替代品,彻底解决这些问题。

deno这个名字就是来自Node的字母重新组合(Node = no + de)表示”拆除 Node.js”(de = destroy, no = Node.js)。

特征

  • 使用TypeScript或者JavaScript
  • 支持ES模块
  • 安全控制(权限管理)
  • 全局await
  • 去中心化Packages
  • 内置测试
  • 标准库
  • 浏览器兼容的API
  • Modern Js
  • 执行Wasm二进制文件

安装

开发工具选择:VScode

img

官网提供了很多种安装方法,这里只说一下我是怎么安装的。

使用WIN(即Ctrl右边的键)+R组合键打开运行窗口,输入powershell,回车即可。

然后在新弹出的窗口中输入下面的命令。

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

img

如果看到这个界面,就说明已经安装成功。

去中心化packages

用过Node.js后都知道,如果随着项目的增长,package.json文件会变得越来越臃肿,而且运行npm install时还会有几率出现未知的错误。

Deno为了解决这个痛点,同时还支持了ES模块,所以可以直接通过import XXX from (URL地址) 的形式来导入包。

标准库模块

Deno官方提供的模块可以直接在官网上面进行查看。

https://deno.land/std

安全控制

在读取脚本的时候必须使用参数,显式打开权限,不然会报错,这一点跟Node.js完全不同,可能才入手Deno时会很不习惯。如:deno run --allow-read index.ts

--allow-read:打开读权限,可以指定可读的目录,比如--allow-read=/temp。
--allow-write:打开写权限。
--allow-net=google.com:允许网络通信,可以指定可请求的域,比如--allow-net=google.com。
--allow-env:允许读取环境变量。

TypeScript

不管你愿不愿意,TypeScript的广泛应用的确是未来前端语言的趋势,现在Vue3.0也使用了TypeScript,而且如果你拥有一种后端语言的基础,上手TypeScript是非常简单的,所以还不赶紧学一波TypeScript。

全局await

await不用再捆绑在async函数中,可以直接在全局进行使用。

const encoder = new TextEncoder();
const greetText = encoder.encode("Hello World");
await Deno.writeFile("Hello.txt", greetText);

上面的代码完成了一个文件写入的操作,可以看到,就算不在async函数中,同样可以使用await。

创建简单服务器

根据官方的提示,我们用Deno来创建一个简单的服务器。

import { serve } from "https://deno.land/std/http/server.ts";
const s = serve({ port: 8000 });
console.log("http://localhost:8000/");
for await (const req of s) {
  req.respond({ body: "Hello World\n" });
}

运行

deno run --allow-net index.ts

记得一定要加上--allow-net权限,不然会直接报错。

运行成功后通过浏览器打开localhost:8000 可以看到Hello World说明我们的服务器已经打开成功。

总结

Deno从体验上来说非常不错,自身就支持TypeScript解析,而且解决了package这个痛点,但是现在作用于生产环境还是太早,因为它的社区还相对不成熟,肯定比不过经过了多年沉淀的Node.js,也许多年后会替代Node.js,但肯定不是现在。

资料参考

https://www.ruanyifeng.com/blog/2020/01/deno-intro.html