是时候学习Deno了

 
Deno logo
我们已经玩了太久的 Node.js 了,是时候玩点新玩意了

Deno 背景

Deno 是一个 TypeScript(JavaScript)的执行器,听名字就能联想到他和 Node 的关系。

Deno 的作者是 Ryan Dahl,如你所料,他也是 Node 的爹。他在一次 JSConf 上发表了一篇题目为《关于 Node 我所后悔的 10 件事》的演讲,其中提到了 Node 他所不满意的设计,比如:

  • 使用了 GYP 作为构建系统
  • 没有使用基于 Promise 的 API
  • 创造出了宇宙黑洞 node_modules 目录
  • 使用了 index.js 作为默认导入入口
  • 没有使用 V8 提供的安全沙箱环境

自己造成的 Bug 在自己看来会显得额外的刺眼,Node 对于我来说的感觉就像指甲划过黑板……

- Ryan Dahl

于是他就重写了一个 Deno,这就是程序员的命运吧💩

与 Node 的区别

Deno 跟 Node 一样的地方,是都用了 V8 引擎来执行 JavaScript。Deno 的主要宣传点,是“安全”。在没有用户授权的情况下,脚本无法访问外部资源,例如网络或者磁盘。Deno 还内建了 TypeScript 编译器,可以直接运行 TS 程序。

其他和 Node 不一样的地方:

  • Deno 只支持 ESM,不直接支持 CommonJS 模块 (ESM 是未来,CommonJS 需要被淘汰)
  • Deno 载入模块位置只支持相对路径或者绝对 url (评论同上)
  • 不需要 npm 这样的包管理器 (也就没有 node_modules 目录,不过代码会在第一次下载时被缓存)
  • 开箱支持 TypeScript (TypeScript 永远的神,反对就是你不客观)
  • 与浏览器兼容,支持 Web API,比如这张图上的对比 (虽然还没想到可以应用在什么地方)

时候到了

Deno 最初是用 Go 语言写的,但是后来改用了 Rust 来编写。第一个 Deno 版本发布于 2018/8/23,1.0 版发布于 2020/5/13,目前在我写这些的时候的最新版是 1.31.1,发布于 2023/2/24。

我在 Deno 早期版本就有研究过,但是当时我认为 Deno 还不能代替 Node。但是今天则有所不同,我认为向 Deno 迁移的时候已经到来了。原因如下:

  • 经过 4 年多的开发,Deno 已经变得比较成熟了,社区也在快速扩张。
  • 这期间 ECMAScript 标准也在快速演进,JS 程序员每天都有新东西可以学。Node 为了兼容性不得不遗留下很多老旧的 API,这些 API 混在一起,在学习上有一定的混乱性。此外调试项目兼容性也可能是个很花时间的事情。而 Deno 只遵循新的 API,不纠结。
  • Deno 更安全,这也是 Deno 一直在强调的事情,这年头,安全这事儿怎么用力过猛都不过分。
  • Deno 规范上与浏览器兼容,作为全栈开发狗,前后端规范一致这事儿难道不香吗?
  • Deno 提供了 npm 以及 package.json 的兼容性,npm 的模块可以导入给 Deno 模块使用。但是未来 npm 存在的意义越来越低,它所提供的服务会被各种 CDN 服务所取代。

新建文件夹

以上是我目前所总结的 Deno 现状优势,但目前我还没有在实际的项目中使用过 Deno,接下来我会在一些业余项目中尝试使用,比如最终幻想XIV中文维基的机器人上,待积累更多经验心得后再来分享。

目前要做的,是先新建个文件夹:

1
2
# 在 Windows PowerShell 下安装 Deno
irm https://deno.land/install.ps1 | iex

然后 VSCode 的插件不可少:点击安装

其他平台和工具的安装就自己去看文档吧:https://deno.land/manual/getting_started

下回见!