Deno 是一个安全的 JavaScript 和 TypeScript 运转时,作者是 Ryan Dahl(也是 Node.js 的原作者)。Deno 的诞生之初是为了处理 2009 年初次设计 Node.js 时的一些忽略。我以为这种改造动机很有道理,由于我相信每个程序员都期望有机会能重写他们已有 10 年历史的代码。

deno 刚出的时分就听闻了,传言 deno 是下一代 node.js。不过现在看来,还革不了 node.js 的命。假如要说两者字面上的区别,Deno 的来历是 Node 的字母重新组合(Node = no + de),表示”拆除 Node.js”(de = destroy, no = Node.js)。

趁着假期学了一段时间的 deno(指文档刷了一遍),想分享自己作为 node 开发者在学习 deno 时以为的一些亮点,以及个人对 deno 与 node 见解。

开发环境

Installation | Manual | Deno

默许情况下 deno 会依据不同的体系,挑选相应的装置目录,以及依靠目录,你可以装备环境变量来改动 deno 的默许行为。

这儿我选用 vscode 进行开发,装置deno 官方插件。此刻创立一个项目工程文件夹,打开 vscode,并创立 .vscode/settings.json 内容如下

{
  "deno.enable": true,
  "deno.lint": true,
  "editor.formatOnSave": true,
  "[typescript]": {"editor.defaultFormatter": "denoland.vscode-deno"}
}

在 vscode 中默许会将 ts 代码以为是 node 运转时环境,因此需求在项目工程下手动装备并启用 deno,让 vscode 以 deno 运转时环境来语法解析 ts 代码。

deno 的一些亮点

由于 deno 与 node 相同,都是 javascript 运转时(deno 合理来说是 typescript 运转时)。所以在 javascript 的部分就没什么好说的了,首要比照 deno 相比与 node 的优势,或说我个人觉得一些运用亮点。

官方所介绍的亮点

以下是官方所介绍的亮点,我对其做了翻译

  • 供给web 渠道功用,选用网络渠道规范。例如,运用 ES 模块、Web worker 和支撑 fetch()

  • 默许安全。除非显式启用,否则无法拜访文件、网络或环境。

  • 支撑开箱即用的 TypeScript。

  • 供给单个可履行文件 (deno)。

  • 为编辑器供给内置的开发工具,如代码格式化程序 (deno fmt)、linter (deno lint)、测试运转程序(deno test)和言语服务器。

  • 拥有一组经过检查(审核)的规范模块,确保与 Deno 一同运用。

  • 可以将脚本捆绑到单个 JavaScript 文件或可履行文件中。

  • 支撑运用现有的 npm 模块

以下会针对部分亮点,进行个人的见解。

自带实用工具

deno 则是自带代码格式化(deno fmt)、代码风格(deno lint)、代码测试(deno test)、依靠检查器(deno info)等等的功用。而这些在 node 中,你需求经过第三方的库,如 eslint,jest 才干完成。

你可以在项目工程中增加装备文件 deno.json来定制化代码风格(rust 中也有类似的功用),但在 node 中必需求凭借第三方的库,或是 IDE 才干完成。

不过也能了解,在当时的编程环境背景下,javascript 还首要作为前端的脚本言语运用,又怎能让 node 来做相关规范呢?(这句话或许有点不当)

这点我以为对开发者是否选用你这门言语的一个加分项,并且这些功用也应该作为编程言语所自带的,有官方的背书(确保),对代码风格才更有所保障。

这儿有份 官方小抄 可以知道经过deno xxx等指令可以做到 node 本来需求经过第三方库才干完成的功用。

Node.js Deno
node file.js deno run file.js
ts-node file.ts deno run file.ts
npm i -g deno install
npm i / npm install n/a
npm run deno task
eslint deno lint
prettier deno fmt
rollup / webpack / etc deno bundle
package.json deno.json / deno.jsonc / import_map.json
tsc deno check
typedoc deno doc
jest / ava / mocha / tap / etc deno test
nodemon deno run/lint/test --watch
nexe / pkg deno compile
npm explain deno info
nvm / n / fnm deno upgrade
tsserver deno lsp
nyc / c8 / istanbul deno coverage
benchmarks deno bench

长途导入

与 node 不同,运用 node 一般需求从 npm 官方包来下载并导,有 npm 这样的包办理器来一致办理这些包(package),咱们一般称这种为中心化,而 deno 与 go 的做法很像,你可以将你的封装好的代码界说成一个包,并将其放在任何网络可拜访的地方,比如 github,或是私有地址,然后经过网络读取文件的方法来导入,这种称为去中心化。

:::tip

node 也不一定要用 npm 来下载模块,也可以本地模块或者私有模块。

:::

关于中心化与去中心化办理,各有优缺,这儿不做细致评论。

以下是 deno 官方长途导入的代码示例:

Command: deno run ./remote.ts

import {add, multiply} from 'https://x.nest.land/ramda@0.27.0/source/index.js';
function totalCost(outbound: number, inbound: number, tax: number): number {
  return multiply(add(outbound, inbound), tax);
}
console.log(totalCost(19, 31, 1.2));
console.log(totalCost(45, 27, 1.15));
/**
 * Output
 *
 * 60
 * 82.8
 */

而这儿的 https://x.nest.land/ramda@0.27.0/source/index.js 可以替换成任何 ES module 特性(import/export)的模块。

http 的方法运转代码

既然都能经过 http(cdn)长途导入模块,那长途运转文件天然也不成大问题。有时分像快捷体会一下别人的代码,或是想要在浏览器中运转一下代码,这时分就可以经过 http 的方法来运转代码。

这儿我准备了一段代码,并布置到我的站点上,你可以经过如下指令得到该代码的履行结果(假如你有装置 deno 的话),放心这段代码并无损害,便是一段简略的 console.log 输出。

deno run https://deno.kuizuo.cn/main.ts

在第一次运用时下载并缓存代码,你可以经过

deno info http://deno.kuizuo.cn/main.ts

来检查文件信息,如下

Deno不只是个Javascript运行时

deno info 还可以检查 deno 的相关装备,默许缓存都设置在 C 盘,你也可以设置DENO_DIR 环境变量来更改 deno 目录,可以到 Set Up Your Environment 检查 deno 相关环境变量。

依靠办理

常常运用 node 的开发者应该对 node 的依靠感到无比厌烦,关于这部分强烈主张看 node_modules 困境,你就能知道 node 的 node_modules 设计的是有多少问题。看完你也就能知道为啥越来越多的 node 项目都运用 pnpm 作为包办理。

尽管 node 有了 pnpm 包办理器这种情况会好一些,但本质在项目目录仍是需求 node_modules 文件。或许你用过其他言语的包办理器,你会发现基本都是将一切用到的依靠大局缓存起来,当不同的项目工程需求用到依靠时,直接去大局缓存中找,而不是像 npm 相同,下载到项目工程目录下,存放在 node_modules 里。

而 deno 也是选用这种这种方法,no npm installno package.jsonno node_modules/ ,运用 npm 包可以像下面这样,当你运用 deno run 时便会下载好依靠置大局缓存中。

// @deno-types="npm:@types/express@^4.17"
import express from 'npm:express@^4.17';
const app = express();
app.get('/', (req, res) => {
  res.send('Hello World');
});
app.listen(3000);
console.log('listening on http://localhost:3000/');

deno 刚发布的时分,乃至还不支撑 NPM 软件包,这无非是要告诉用户 deno 社区没有轮子,要求用户自己去造一个。不过 deno 团队仍是做出了比较正确的挑选,支撑 npm 软件包,并且还十分友爱。

不过假如你在 deno 中运用了 npm 包,或许会存在一些兼容性问题,假如遇到了,也可以经过增加 --node-modules-dir 标识,在当前运转目录下创立 node_modules 文件夹。详见 –node-modules-dir flag

安全

Permissions

在 2022 年 npm 呈现过一些恶性的库,如 lodash-utils, faker.js, chalk-next。假如你不小心装置了上面,轻则项目无法运转,输出无意义乱码,重则删去本地文件。

又由于 npm 几乎没有代码审计的机制,任何开发者只需求有一个 npm 的账号就能在上面随意发布他想发布的包。一般来说电脑病毒都是经过随意读取与写入本地文件来到达病毒的意图,但在 deno 中,代码假如测验写入与读入文件,都需求询问开发者是否答应操作。并且在 linux 体系,你可以指定像 /usr /etc 这样非 root 人物来操作该文件,避免真是病毒文件导致删去不该删去的文件。

此外像指令履行,网络拜访,环境变量这些极易损害电脑的权限,deno 都会检测到,并做出提示劝诫开发者是否答应履行。总之你能想到的电脑安全隐患,deno 都为你做好了。

内置浏览器环境(运转时)

这是我以为 deno 最大的亮点。

总所周知,浏览器的 js 代码有很大概率是无法直接在 node 中跑起来的,原因便是 node 的大局目标中没有浏览器的目标,如 window,document,乃至连localStorage 都有!

这说明什么,往常假如你从其他网站扣了一段代码下来,想在 node 运转会发现什么 window is not defined,xxx is not defined。假如想在 node 运转,你有必要需求补齐浏览器的环境,此外可以凭借 js-dom,happy-dom 等 npm 包。而 window,xxx 这些大局只要浏览器才界说的大局目标在 deno 的运转时相同界说了,可以到这儿检查支撑的 Web 渠道 API。

虽然与真实浏览器大局目标有少许差异,但这也满足让开发者少做许多作业。比如 Web 逆向者一般要扣取浏览器的 js 代码,并补齐环境使其可以在 node 中运转,而有了 deno 这将变得十分轻松!

与其说是 javascript/typescript 运转时,我更愿意说是浏览器运转时!

Web 结构

你可以在 Web Frameworks 中看到 deno 官方所引荐的 Web 结构,其间 Fresh 也是最为引荐运用的(后续我也会测验运用该结构)。

而在 node 社区中,你会看到像 express,koa,nestjs 等等这种非 Node 官方或大背景的 web 结构(并且还许多),而这时关于初学者而言,就有点不知道该怎么做出抉择。

而像 java 中你完全可以不用担心该学什么,说学 spring 便是在学 java 这可一点都不为过。或许这也是国内 java,尤其是 spring 的开发者尤为许多的原因。

吐槽归吐槽,但我想表明的是在有官方的支撑下,用户和开发者可以一致运用某个结构,一同维护与运用一个更好的结构。而不是个个 Web 结构的都有各自的优缺点,让运用者去挑选,搞得这个结构是另一个结构的轮子一般。

所以我以为这种支撑是很有必要。

公共保管服务

Project – Deploy (deno.com)

deno 像 vercel/netfily 相同供给了一个代码保管服务,可以将你的 deno 运用布置上去。对,目前来看还无法布置前端运用,由于要指明一个入门文件(main.ts)。

你可以经过 kuizuo.deno.dev/ 来拜访我运用 deno Deploy 所创立的一个在线项目。将会输出一个Hello World! 的页面。

供给一个免费的线上环境体会,对开发者而言尤为重要,尤其是在将自己的项目效果分享给别人展现时,成就感油然而生。

node 转 deno 开发的一些协助

deno 相关的亮点我也差不多介绍完了,或许你对 deno 现已有一丝爱好想测验一番,以下我整理的对你或许有所协助。

  • 假如你是一个 Node 用户,考虑切换到 Deno,这儿有一个官方小抄来协助你。

  • 假如你不想刷 deno 文档,想快速上手 deno 的话,这儿我主张引荐看看 deno 官方所引荐的deno 代码比如 ,可以十分快速有效了直接了解 deno 规范库以及依靠导入导出。

  • deno 是集成了 node 与 npm 的,也便是说答应直接运用 npm 包与 node 规范库,假如你想用 deno 来写 node,也行,详看Interoperating with Node.js and npm。

  • 想要在 deno 中衔接数据库,可看Connecting to Databases。

  • 假如想看 deno 怎么运用 deno 生态的 Web 结构创立一个 Web 服务,引荐fresh结构,并检查该比如fresh/examples/counter

node 火吗?

关于 deno 就暂时落下笔墨,无妨考虑一个问题,node 火吗。

作为 node 开发者,我肯定会说 node 火,不过更多是对 javascript 来说火。

:::info 2022 State of JS 2022 也结束了,无妨检查 2022 State of JS 数据陈述统计,看看 JavaScript 在 2022 年是怎么开展的吧。 :::

现在 typescript 大势所趋,说 javascript 就等同于说 typescript,而 javascript 和 node 绑定已成现实,而前端也与 javascript 所绑定,现在的前端工程师要是不会 node,都不好意思说自己是个前端工程师。就现阶段看,没了 nodejs,前端技术得后退十年(不夸张)。

假如是在 Web 前端,Node 确实现已火的乌烟瘴气了,然而它的诞生并不是为了 Web 前端,而是期望将 javascript 作为服务器端言语开展。仅仅后来没有想到的是 Node.js 在前端范畴却大放异彩,造就了现在大前端的盛世。

所以在 Web 后端的范畴,Node 确实是不温不火,更多的公司都宁可选主流的后端开发言语,而不是优先考虑 Node。不过却是在 Serverless 范畴中,Node 有着一席之地。

所以我想 deno 的呈现,不仅是针对 Node.js 的缺陷,更是针对 Node.js 后端开发的缺乏。至于说 deno 能否完成原先 node 的任务,只要时间能给咱们答案。

总结

从上述看来,你应该会发现 deno 并不好 node 相同是一个纯运转时环境。由于他不仅仅做了 javascript/typescript 运转时环境,还做了许多开发者好评的功用,一个为 javascript/typescript 供给更好的开发支撑的产品。

但好评并不能直接决定销量,这些功用看似可有可无,没有激起用户从 Node.js 切换过来的出色之处。就我体会完发现,如同 deno 能做的东西 node 大部分也能做,仅仅相对繁琐重复一些而已。但人们更倾向于做一件繁琐重复的事情,而不是做一个新的事情。

抚躬自问,我真的很期望 deno 能火,就开发体会而言,比 node 好用太多了,但好用的东西代表不了用的人就多,这个范畴中,生态尤为重要。想要让 node 用户转到 deno 开发还有很长一段路要走。

再来反诘自己,我现在会将 deno 作为 node 替代品吗,我想我和大都 node 开发者相同,都不会将 deno 作为主力言语(由于有许多项目都现已运用node来进行开发与推动)。但作为个人开发者,尤其是 node 开发者,我以为仍是十分有必要去测验一番 deno,亲手目击”下一代Node”。

期望本文能对你了解 deno 有所协助。

相关引荐文章

Deno vs. Node.js 哪个更好 – ()

为什么 Deno 没有人心所向?超越 Node.js 还要做些什么? – ()

连发明人都抛弃 node.js 了,还有出路吗? – 知乎 (zhihu.com)

现已 2022 年了 Deno 现在怎么样了? – 知乎 (zhihu.com)