【学不动了系列】之 Deno 入门

deno

但愿你们不要被标题吓到,纯属为了吸引眼球😢。。根据笔者这两天的学习感觉,Deno 比 Node 更容易入门,若是你有 Node 的基础那更简单了,不少东西都是能够类比的,学起来豪不费力。我的认为如今正是入门 Deno 的最好时机,随着 v1.0 的发布 Deno 的 API 已趋于稳定,但整个生态圈的繁荣才刚刚开始,因此趁 Deno 仍是个宝宝咱们能够陪它一块儿成长。前端

什么是Deno

Deno是新一代的 JavaScript 和 TypeScript 运行时(runtime),使用 Rusttokio 实现,和 Node 同样内部也使用 V8 引擎,并且Deno 和 Node 的做者是同一我的:Ryan Dahl。他创造Deno的初衷是为了弥补 Node 的某些设计缺陷,但鉴于目前 Node 的生态已经如此繁荣,Deno 暂时还没法彻底取代 Node,Node 应该还将长期稳定存在。node

Deno的主要特色有:git

  • 安全性:默认没有文件、网络、系统的访问权限,除非明确启用。与之相比,Node 是不安全的
  • 天生支持 TypeScript
  • 实现了部分的标准Web APIs,好比:fetchconsole
  • 官方提供包含不少经常使用功能的标准库,摆脱对一些第三方库的依赖
  • 使用ES6的模块系统(Node 使用的是 CommonJS)
  • 依赖可经过远程获取,无需安装到本地

Deno目前还处于早期发展阶段,因此一些功能和API可能还会有变更,同时生态也不完善,社区提供的工具或多或少会有bug,可是这些都是正常的,并不妨碍咱们去提早学习和了解这个更优秀的 Node.js 替代品。github

安装Deno

Shell (Mac, Linux) - 指定版本(推荐):web

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

PowerShell (Windows) - 指定版本(推荐):npm

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

Homebrew (Mac) :编程

brew install deno

Chocolatey (Windows) :json

choco install deno
注意:安装完成后需根据命令行中的提示配置环境变量!

在命令行里面输入 deno 命令能够进入编程模式:缓存

deno command

使用 deno --version 查看 Deno 的版本:安全

deno version

运行js、ts文件

可使用 deno run <filename.js> 命令运行一个本地 js 文件。

run js

或者,一个 ts 文件:

run ts

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

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

remote ts

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

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

remote

若是想从新下载、编译则可使用 -r--reload 参数,进行从新加载:

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。

结果:

fetch

咱们也能够给 --allow-net 指定可访问的域名,则访问未指定的域名就会报错。好比,将上面的命令改成:

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

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

fetch other domain

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 运行就会报错:

read err

由于咱们须要手动赋予读取文件的权限,使用 --allow-read flag:

read

写文件

与读文件对应的,写文件的操做以下:

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

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

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

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/...

相关文章
相关标签/搜索