乐趣区

关于deno:学不动了系列之-Deno-入门

心愿大家不要被题目吓到,纯属为了吸引眼球????。。依据笔者这两天的学习感触,Deno 比 Node 更容易入门,如果你有 Node 的根底那更简略了,很多货色都是能够类比的,学起来豪不费劲。集体认为当初正是入门 Deno 的最好机会,随着 v1.0 的公布 Deno 的 API 已趋于稳定,但整个生态圈的凋敝才刚刚开始,所以趁 Deno 还是个宝宝咱们能够陪它一起成长。

什么是 Deno

Deno 是新一代的 JavaScript 和 TypeScript 运行时(runtime),应用 Rust 和 tokio 实现,和 Node 一样外部也应用 V8 引擎,而且 Deno 和 Node 的作者是同一个人:Ryan Dahl。他发明 Deno 的初衷是为了补救 Node 的某些设计缺点,但鉴于目前 Node 的生态曾经如此凋敝,Deno 临时还无奈齐全取代 Node,Node 应该还将长期稳固存在。

Deno 的次要特点有:

  • 安全性:默认没有文件、网络、零碎的拜访权限,除非明确启用。与之相比,Node 是不平安的
  • 天生反对 TypeScript
  • 实现了局部的规范 Web APIs,比方:fetch、console 等
  • 官网提供蕴含很多罕用性能的规范库,解脱对一些第三方库的依赖
  • 应用 ES6 的模块零碎(Node 应用的是 CommonJS)
  • 依赖可通过近程获取,无需装置到本地

Deno 目前还处于晚期倒退阶段,所以一些性能和 API 可能还会有变动,同时生态也不欠缺,社区提供的工具或多或少会有 bug,然而这些都是失常的,并不障碍咱们去提前学习和理解这个更优良的 Node.js 替代品。

装置 Deno

Shell (Mac, Linux) – 指定版本(举荐):

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

PowerShell (Windows) – 指定版本(举荐):

$v="1.2.1"; iwr https://deno.land/x/install/install.ps1 -useb | iex

Homebrew (Mac) :

brew install deno

Chocolatey (Windows) :

choco install deno

留神:装置实现后需依据命令行中的提醒配置环境变量!

在命令行外面输出 deno 命令能够进入编程模式:

应用 deno --version 查看 Deno 的版本:

运行 js、ts 文件

能够应用 deno run <filename.js> 命令运行一个本地 js 文件。

或者,一个 ts 文件:

第一次运行 ts 文件会进行编译,第二次就不必编译了,除非 ts 文件有批改。

Deno 也能够运行一个近程的 ts 文件:

上图文件门路:http://lc-3Cv4Lgro.cn-n1.lcfi…

能够看到,deno 会先下载近程 ts 文件,再编译、运行。如果该近程文件曾经被下载编译过了,再次运行就会从缓存中读取:

如果想从新下载、编译则能够应用 -r--reload 参数,进行从新加载:

Deno 运行时(Runtime)

Deno 的运行时由规范的 Web APIs + Deno global 这两局部组成。

实现 Web APIs 次要是为了遵循已有的 web 规范,提供大家都相熟的接口,以升高学习和应用老本,也让咱们前端同学更容易上手,比方常见的 consolefetchsetTimeout 等办法在 Deno 中仍能够失常应用。Web APIs 的作用域为全局,即能够间接应用或者通过 window.***globalThis.*** 调用。Deno 实现的所有 Web APIs 可参考 Github Repo。

除了 Web APIs,Deno 自有的 API 都放在 Deno 这个命名空间下,比方文件操作、网络连接、过程治理等。

Web APIs

接下来以 fetch API 为例展现 Deno 中 Web APIs 的应用。

Fetch API

比方获取一个近程资源:

fetch.ts:

const res = await fetch('https://jsonplaceholder.typicode.com/posts/1');
const data = await res.json();

console.log(data);

如果应用 VSCode 进行开发,举荐装置 Deno 插件。

运行:

deno run --allow-net fetch.ts

留神:进行网络拜访须要独自受权,应用 --allow-net flag。

后果:

咱们也能够给 --allow-net 指定可拜访的域名,则拜访未指定的域名就会报错。比方,将下面的命令改为:

deno run --allow-net=github.com fetch.ts

后果将获取不到指定资源:

Deno Global

和 Node 一样,Deno 也能操作文件系统,接下来咱们以此为例展现 Deno global API 的应用。

读文件

比方,读取一个 txt 文件:

doc.txt

This is my first deno app.

read.ts

const decoder = new TextDecoder('utf-8');

const data = await Deno.readFile('doc.txt');

console.log(decoder.decode(data));

和 Node 不同,Deno 默认是没有操作文件权限的,如果应用 deno run read.ts 运行就会报错:

因为咱们须要手动赋予读取文件的权限,应用 --allow-read flag:

写文件

与读文件对应的,写文件的操作如下:

write.ts:

const encoder = new TextEncoder();

const txt = 'Deno is awesome!';

await Deno.writeFile('doc.txt', encoder.encode(txt));

同样的,咱们须要手动赋予写文件的权限:

deno run --allow-write  write.ts

重命名文件

rename.ts:

await Deno.rename('doc.txt','readme.txt');

重命名文件须要同时赋予读和写的权限:

deno run --allow-read --allow-write rename.ts

删除文件

delete.ts:

await Deno.remove('doc.txt');

删除文件须要写的权限:

deno run --allow-write delete.ts

Deno 规范库

除了 Web APIs 和 Deno global,Deno 官网团队还提供了一个规范库,即一组高质量的工具集。这个规范库不蕴含任何第三方依赖,而且代码都会由 Deno 外围团队审查,因而能保障高质量和稳定性。

规范库地址:https://deno.land/std

接下来,咱们以几个罕用的模块为例展现规范库的用法。

fs(文件系统)

规范库中的 fs 相当于对 Deno 自带文件操作的扩大,比方减少了对 JSON 文件的读写:

fs.ts:

import {readJson} from 'https://deno.land/std@0.62.0/fs/mod.ts';

const posts = await readJson('./posts.json');

console.log(posts);

规范库的版本 Deno 的版本临时不对立,应用规范库时应该指定稳固的版本号,如本例中的 0.62.0,以防止意外的更新和重大更改导致程序不可用。

运行:

deno run --allow-read --unstable fs.ts

因为波及到一些不稳固 API 的调用,所以要加上 --unstable flag 以启用这些 API

后果:

fs 模块地址:https://deno.land/std/fs

http(网络模块)

和 Node 相似,Deno 的 http 模块也能用于创立一个 web 服务器:

http.ts:

import {serve} from 'https://deno.land/std@0.62.0/http/mod.ts';

const server = serve({port: 3000});

console.log('listening on port 3000');

for await (const req of server) {
  req.respond({body: `<h1>Hello, Deno!</h1>`});
}

运行:

deno run --allow-net http.ts

后果:

http 模块地址:https://deno.land/std/http

uuid(通用惟一识别码)

uuid 的作用是生成一个 128 位的全局惟一的 ID。

uuid.ts:

import {v4} from "https://deno.land/std@0.62.0/uuid/mod.ts";

const myUUID = v4.generate();

console.log(myUUID);

运行:

deno run uuid.ts 

后果:

uuid 模块地址:https://deno.land/std/uuid

第三方模块

尽管诞生不久但勤奋的同行们曾经为 Deno 生态做出了不少奉献,现有的第三方模块在 这里 能够找到。

上面列举几个比拟有用的模块:

  • oak:Deno 版的 koa,面向 http 服务的中间件框架
  • abc:另一个好用的 web 利用框架
  • denon:Deno 版的 nodemon,用于开发时监听文件变动主动重启程序
  • denoify:将 Node 利用转为 Deno 利用

还有一些本来的 npm 包在 Deno 外面还是能够用的,比方:lodash

好了,明天的 Deno 入门就给大家介绍到这里,如果对你有帮忙的话给个赞和关注吧 ????。

本文 Demo 地址:https://github.com/MudOnTire/…

退出移动版