Deno 初探
前言
Deno 已经被前端圈子提及有很长一段时间了,上个月 Deno 发布了 1.0 版本,又掀起了一小股 Deno 热。Deno 到底是什么?它可以用来做什么呢?它好用吗?带着一直以来的好奇心,趁着周末的时间,认真地接触了一次 Deno。
一、什么是Deno?
Deno 是一个更安全的 JavaScript 和 TypeScript 运行时,作者 Ryan Dahl 同时也是 Node.js 的创建者。
什么是运行时?
运行时是一个运行环境,也叫运行平台,开发者可以使用指定的语言,基于这个环境开发应用。可以认为运行时就是一个舞台,能做什么事情,取决于舞台能提供什么道具。比如浏览器就是一个运行时,我们可以在浏览器上通过 JS 调用浏览器提供的 API 操作 DOM。
Deno 的作用
Deno 的作用,是让开发者可以使用 JavaScript 语言开发后端服务。
二、为什么会有Deno?
我们知道 Node.js 也是一个让开发者可以使用 JavaScript 语言开发后端服务的 JavaScript 运行时。那既然已经有一个 Node.js,而且已经非常成功,为什么还要造另一个 JavaScript 运行时 Deno ?
两年前(2018年6月),Ryan Dahl 在德国柏林召开的 JSConf EU 会议上发表了名为 “10 Things I Regret About Node.js” 的演讲,有兴趣可以到这里下载 PPT 。
在分享中,Ryan 回顾了在他看来当初开发 Node.js 时留下的10大遗憾。但由于Node.js 现在已经广泛应用于各个领域,为了保证兼容性,对 Node.js 底层进行大规模改造已经不现实。会上,Ryan 宣布了他决定开发一个全新的 JavaScript Runtime 以解决当初的种种缺陷,这个项目就是 Deno。
Deno 的命名很有意思,就是把 node(no de) 倒过来 deno(de no),颇有颠覆 Node 的意味。
BTW,上个月(2020年5月15日),Deno 发布了1.0版本。
三、走近 Deno
Deno 的开发语言
相比 Node.js 使用 C++ 开发,Deno 起初使用的开发语言是 GoLang,后来改为了 Rust。并且随后把 C++ 写的 libdeno 换成了 Rust 编写的 V8 绑定:denoland/rusty_8。
Deno 目前是建立在 V8 引擎、Rust 、Tokio、TypeScript 的基础之上。
- V8 是 chrome 浏览器内的 JavaScript 运行时。
- Rust 是一门系统编程语言,专注于安全,尤其是并发安全。它的性能和标准C++ 不相上下。
- Tokio 是一个给 Rust 语言使用的异步运行时,提供 event loop 和具体的 I/O 类型。
- TypeScript 是 JavaScript 的超集。
Deno 的特性
- 默认支持 ES Modules
- 默认支持 TypeScript
- 尽可能兼容 Web 标准 APIs
- 默认采用沙箱模式运行代码,更安全
- 去中心化第三方模块机制
- 提供标准库
与 Node.js 的比较
- 使用 ES 模块,不支持 require()
- Deno 不使用 package.json
- Deno 不使用 npm
- Deno 中的所有异步操作返回 promise,因此 Deno 提供与 Node 不同的 API
- Deno 需要显示指定文件、网络和环境权限
- 第三方模块通过 URL 或者文件路径导入
- 当未捕获的错误发生时,Deno 总是会异常退出
- 兼容 Web 的运行时 APIs,更利于前后端的代码同构。
四、如何使用 Deno
Deno 能够在 macOS、Linux 和 Windows 上运行。Deno 是一个单独的可执行文件,它没有额外的依赖。
1.安装
在 macOS 下可以通过Shell命令安装:
curl -fsSL https://deno.land/x/install/install.sh | sh
这个方式在国内安装会很慢,慢到下不下来。。。so,不推荐。
也可以通过HomeBrew 安装:
brew install deno
这个方式可以安装下来,但是,安装的版本是 v0.20.0,很低的版本:
并且这个版本不带 upgrade 命令,升级 deno 的时候很不方便。so,也不推荐。
安利通过国内加速器(镜像源 https://x.deno.js.cn )来安装:
curl -fsSL https://x.deno.js.cn/install.sh | sh
也可以指定版本:
curl -fsSL https://x.deno.js.cn/install.sh | sh -s v1.0.0
首次安装,可以看到提示,需要手动配置一下环境变量,配置语句也已经给出:
$ touch ~/.bash_profile # 创建用户环境变量文件
$ vim ~/.bash_profile # 打开文件,将刚才命令行提示给出的配置语句粘贴进去,保存退出。
让配置立即生效:
$ source ~/.bash_profile
环境变量就设置好了,现在在任何一个新打开的命令行里面都可以使用 deno 命令了。
注意:如果之前使用 brew 安装过低版本的 deno,请使用 brew uninstall deno 卸载 deno 之后,再使用加速器安装高版本,不卸载直接安装高版本不会生效。(别问我为什么知道。。。都是泪。
其他操作系统环境的安装可参考 https://github.com/denoland/deno_install。
如果要升级本地的 Deno,可以运行
deno upgrade
还可以安装指定的版本:
deno upgrade --version 1.1.0
这个命令会从 github.com/denoland/deno/releases 获取最新的发布版本(一个可执行的二进制文件 zip 压缩包),然后解压并替换现有的版本。而 github release 的文件使用的是 aws,在国内访问不稳定。
So,升级也推荐使用国内加速器安装指定版本来达到目的。
2.测试安装
deno --version
如果打印出 Deno 版本,说明安装成功。
到这里,我们就安装好 Deno ,并且可以基于 Deno 进行开发了。
3.运行一个远程的项目
跑一个远程项目(官方的demo)
deno run https://deno.land/std/examples/welcome.ts
可以看到在控制台输出”Welcome to Deno