Deno的出现,也让很多人调侃“论四个字母有多少种组合方式”。deno 这个名字就是来自 Node 的字母重新组合(Node = no + de),表示"拆除 Node.js"(de = destroy, no = Node.js)。

什么是Deno?

  • Deno的创作者是Node.js之父Rean Dahl(瑞安·达尔)
  • Deno是一个基于V8引擎的简单、现代的JavaScript和Typescript安全运行环境。
  • 采用Rust语言编写而成(最初用的是Golang)
No package.json, no npm. Not explicitly compatible with Node.     ————Rean Dahl

下面的截图是Deno目前的star History趋势图:
Deno初识_Deno
我们可以在Magi网站上搜索对比一下Deno和node的知识体系:
最先是Deno的:
Deno初识_Deno_02

然后是node的:
Deno初识_Deno_03

为什么说Deno是node.js的替代品?

有人说Node.js 社区是一片墓地,遍布无人维护的库。
首先来看看node的不足:

  • Node.js 对ES6新语法的支持不够理想。ES6 标准引入了大量新的语法特性。影响最大的语法有两个:Promise 接口(以及 async 函数)和 ES 模块。Node.js 必须支持回调函(callback),导致异步接口会有 Promise 和回调函数两种写法;Node.js 自己的模块格式 CommonJS 与 ES 模块不兼容,导致迟迟无法完全支持 ES 模块。
  • Node.js 的模块管理工具 npm,逻辑越来越复杂;模块安装目录 npm_modules 极其庞杂,难以管理。Node.js 也几乎没有安全措施,用户下载了外部模块,就进行各种读写操作。
  • Node.js 的功能也不完整,外部工具层出不穷,让开发者疲劳不堪:webpack,babel,typescript、eslint、prettier…

再来看看Deno:

  • 使用Typescript或者javascript,可以直接创建对应的js或者ts扩展名的文件,在里面写入对应的代码。
  • 安全控制(权限管理),默认情况下不具有读写权限,否则会出现报错。获取权限需要加入代码–allow -XXX
  --allow-env :允许访问环境变量;

  --allow-hrtime :允许高分辨率时间测量;

  --allow-net= :允许网络访问;

  --allow-plugin :允许加载插件;

  --allow-read= :允许文件系统读取权限;

  --allow-run :允许运行子进程;

  --allow-write= :允许文件系统写入访问;

  --allow-all :允许所有权限(与-A相同)。
  (其中,net、read 和 write 的权限可以是细化的。例如,你可以使用 --allow-read=/dev,允许从特定文件夹中读取。)

  • 去中心化(Package)
1) 没有npm packages/package.json(express框架的时候需要npm来安装一些依赖 -> node moudles中会有成百上千的一些依赖文件)
2) Packages通过URL来统一加载——http://deno.land/x/需要加载的软件包或者库的名称
3) 加载引用时缓存到硬盘
import{Application} from "http://deno.land/x/oak/mod.ts"

  • 标准库(fs,datetime,http,log…)
import{server}from “http://deno.land/std/http/server.ts”

archive :tar 文件归档的实用程序

async :异步工具

bytes :帮助器来操作字节切片

datetime :日期 / 时间解析

encoding :各种格式的编码/解码

flags :解析命令行标志

fmt :格式化和打印

fs :文件系统 API

hash :加密库

http :HTTP 服务器

io :I/O 库

log :日志实用程序

mime :支持多类型数据

node :Node.js 兼容层

path :路径操纵

ws :WebSockets

  • Modern Js,拥有更具现代化的js特征。node.js是09年推出的,从那以后js进行了大量的更新与改进,相对于node而言有更多的更现代化的JavaScript的优势。

  • ES Modules,Deno支持es6的模块,node.js自己的commen.js模块与es模块不兼容。

  • 顶级Await,Deno可以对await的等级进行提升(Top Level Await)。通常我们在使用await的时候,需要和异步进行捆绑。例如标记一个函数为异步的时候,要设置里面的一些值为await来进行等待。Deno中可以在全局的范围内使用await而不用将其包裹在异步函数里面。

  • 内置测试

  • 浏览器兼容API,例如通过提供内置对象 fetch 和全局 window 对象

怎么使用Deno呢?

首先是安装,按照官网来就好:
我使用的是homebrew安装。

Deno初识_Deno_04安装完成进入deno的环境:(>这样一个小尖角号就代表进入deno的环境啦)

Deno初识_Deno_05Deno可以直接运行js:

Deno初识_Deno_06输入deno -help获取deno的环境变量和它的一些子命令:

Deno初识_Deno_07
deno的命令:

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 到最新版本
当然,我们可以运行deno help以获取该子命令的特定文档,例如deno run --help。

写到最后了,我一直在思考几个问题:在现有的项目中引入Deno需要做些什么?例如Deno和vue结合的话怎么使用?替换现有的项目需要哪几步?迁移代价是什么?不过我现在也没有很明确的答案,还需要再深入学习一下,到时候再来更新一波~