Deno介绍
Deno是一个简单、现代、安全的
JavaScript和TypeScript运行时环境,它使用V8,内置在Rust中用来运行。从官网中可以了解到它有以下特点:
- 环境是安全的。
- 支持
TypeScript的开箱即用。 - 只需要一个可执行文件。
- 具有内置的工具(eg:依赖检查器、代码格式化器)。
- 内含一组审核的标准模块。
上述是官文中着重突出的几点,当我们查看功能列表时,发现还有以下方面优势之处:
Deno基于最新的JavaScript语言;Deno具有覆盖面广泛的标准库;Deno以TypeScript为核心,配以更多独特的方式从而带来了巨大的优势,其中包括一流的TypeScript支持(Deno自动编译TypeScript而无需你单独编译);Deno大力拥抱ES模块标准;Deno没有包管理器;Deno具有一流的await语法支持;Deno内置测试工具;Deno旨在尽可能地与浏览器兼容,例如通过提供内置对象fetch和全局window对象。
tips:
Question:可能有些人会有疑问?为什么有了
node之后还会出现deno。以及他们之间的差值在哪里?
Answer:因为Node的API是基于回调机制的,因为Node是在Promise和Async / Await定义在标准之前编写的。Node中无法对此机制进行全新的更改,因为此类更改将产生“毁灭性”的影响。因此,在Node中我们陷入了回调大量API的困境。但是这里只是说明了存在的问题,并不代表Deno就可以取代Node。
实战Demo
通过上面的简单介绍,想必我们对其有了大致的印象,让我们用一个小的
Demo让大家快速入门其中。
环境准备
操作系统:Mac OS
安装软件: Homebrew(安装方式很多,详情看官网)
命令介绍
bundle:将项目的模块和依赖项捆绑到单个文件中;cache:缓存依赖项;completions:generate shell completions;doc:显示某模块的文档;eval:运行一段代码,例如 deno eval "console.log(1 + 2);fmt:内置的代码格式化程序(类似于 Go 语言中的 gofmt);help:打印某消息或某给定子命令的帮助信息;info:显示有关缓存的信息或与源文件有关的信息;install:将脚本安装为可执行文件;repl:开启 REPL 环境(默认子命令);run:运行给定文件名或 URL 的程序;test:运行测试;types:打印运行时的 TypeScript 声明;upgrade:升级 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 app.ts之前,必须要先执行deno run --allow-net app.ts。
如果未执行后面的代码,则下面下载依赖的时候会报错,出现以下这种问题:
原因:
Deno 安全沙箱(Sandbox)
有时候你想在 Web 浏览器之外运行一个 JavaScript 程序,却不想让它肆意在你的系统中访问任何它想要的东西,比如你电脑上面本身的秘钥的等。
这个时候Deno 的解决方案是试图大量借鉴浏览器实现相同的权限模型——除非你明确允许,否则在浏览器中运行的任何 JavaScript 都不能在你的系统上做不正当的事情。
运行结果:
除了以上运行网络访问之外,还有以下权限控制(可以理解为RAM)。
--allow-env:允许访问环境变量;--allow-hrtime:允许高分辨率时间测量;--allow-net=<allow-net>:允许网络访问;--allow-plugin:允许加载插件;--allow-read=<allow-read>:允许文件系统读取权限;--allow-run:允许运行子进程;--allow-write=<allow-write>:允许文件系统写入访问;--allow-all:允许所有权限(与-A相同)。
以上文件是整个一大块填代码填充进去的,我们可以运行
deno fmt app.ts来将文件里面的代码格式化。
结束语
以上是对于一个
Deno项目的简单介绍,当然Deno的出现也不仅仅只是多了一个Hello World的,总的来说对于node中不满足并且无法进行向后兼容而出现的。当然并不代表Deno也是很完美的,向后兼容的层面发展到底会变成什么样子,只能跟随时代走走看了。
目前Deno正在做的事情:
Deno提供了一个内置的fetch实现,该实现与浏览器中可用的匹配。Deno正在进行与Node.js stdlib的兼容层。
更多的内容请小伙伴们访问deno.land/官网查看哦~