【译】Deno是啥?会取代Node.js吗?

原文连接: blog.bitsrc.io/what-is-den…node

Denonode.js 的做者 Ryan Dahl 编写的,这是否意味着 Deno 实际上就是 Node.js 的替代品,咱们是否应该开始计划重构冲刺呢? 若是你想了解更多,请往下看。web

在2018年,Ryan 进行了一次演讲,在演讲中他提出了他认为的有关 Node.js 的十大问题。在演讲结束时,他揭开了 Deno 的面纱。当时 Deno 只是他正在建设中的一个小项目,也许被你们称做 Node.js v2版本,在 Node.js 的基础上进行了改进,而且更加安全。编程

这里是演讲的视频地址,你们最好去看一看。json

两年后,在2020年5月13日,官方正式发布了 Deno 1.0版本。一个全新的让 JavaScript 运行在服务端的开发平台。不像 Node.js 是用 C++ 语言开发,Deno 底层是用基于 Tokio 平台(提供 JavaScript 所需的异步运行环境)的 Rust 语言编写的,仍然运行在 V8 引擎上。缓存

有什么新知识

咱们不仅仅在谈论与当前 Node.js 彻底兼容的新 JavaScript 运行环境,相反的是,RyanDeno 中增长了一些他认为在 Node.js 中所缺乏的东西。安全

安全集成

默认状况下,Node.js 容许你访问任何内容,也就是说,你能够读写文件系统,发送传输请求,访问环境变量等等。 做为开发人员,具备这种访问权限固然是有好处的,但在编写代码时万一不当心,有可能会带来安全风险。bash

所以,Deno 可使用命令行参数来启用或禁用对不一样安全功能的访问。若是你须要脚本可以访问 /etc 文件夹,能够执行如下操做:websocket

deno --allow-read=/etc myscript.ts
复制代码

这样,你的代码就能够从该文件夹中读取任何内容,而且会在没有权限的状况下抛出全异常。 这相似于其余平台处理安全性的方式。若是你是 Android 用户,你确定遇到过不少应用程序曾要求你容许它们读取联系人,电话,文件夹等,这与此相似。 经过在执行脚本的命令行中敲上这些参数,就能够提供代码所需的权限。markdown

更完整的标准库

自从第一个 Node.js 版本以来,JavaScript 就开始改进其标准库。可是与其余语言相比,它还有很长的路要走。 Deno 也致力于改善这一点,并声称其拥有一个很是完整的标准库,容许开发人员使用官方工具来执行基本的任务,只有复杂的任务时才须要使用外部库(好比 NPM )。数据结构

本质上讲,Deno 提供了诸如 为终端文本添加颜色、使用外部数据结构(例如二进制,csvyaml 等)、生成 UUID 甚至编写 websocket 等开箱即用的方法。 还有一些其余的更基本的模块可用,例如访问文件系统,日期转换函数,http 相关函数等等。

集成Typescript

你没有看错,若是你是 TypeScript 的爱好者,那么 Deno 自己就能够知足你的须要,不须要额外引入外部库,默认状况下就能够将 Typescript 转换为 JavaScript

尽管默认状况下,Deno 自身会完成转换,可是你可使用本身的 tsconfig.json 文件来覆盖默认配置:

deno run -c tsconfig.json [your-script.ts]
复制代码

默认配置采用的是严格模式,所以任何不符合规范的编码都会当即获得警告。

再也不须要 NPM 或node_modules 文件夹

Node.js 中, 每个模块和它的祖先模块都有着千丝万缕的依赖关系。是否太臃肿了呢?是不是一个错误的方式来分发管理依赖呢?这绝对是 Node.js 最具争议的方面之一,所以 Deno 决定彻底放弃它。

那么,Deno 是如何处理依赖关系的? 它容许你从任何地方引入模块。换句话说,你能够简单地执行如下操做:

import * as log from "https://deno.land/std/log/mod.ts";
复制代码

今后再也不须要拥有本身的集中式存储库,可是你必须谨慎的进行此操做,由于从没法控制的第三方来源导入模块会使你暴露。

实际上,咱们也再也不须要 package.json,如今经过在名为 deps.ts 的文件中维护模块列表及其各自的URL便可实现依赖管理。 可是版本控制怎么办呢?我知道你就会问。你能够在 URL 上指定软件包的版本,虽然不是很精美,但确管用。

一个简单的 deps.ts 文件也许是这样子的:

export { assert } from "https://deno.land/std@v0.39.0/testing/asserts.ts";
export { green, bold } from "https://deno.land/std@v0.39.0/fmt/colors.ts";
复制代码

这将从新导出模块,若是你想更改其引用版本,简单的更改 URL 就能够了。

顺便说一下,第一次执行代码后,导入的模块就会被缓存下来直到你下一次重启。

还有啥

Deno 还包含其余功能,例如开箱即用的大型工具,包括 test runner, debugger, file watcher 等。 可是有些只是其提供的 API,须要在其基础上写本身的逻辑才能使用它们。

Deno.watchFs 提供的 file watcher API 为例,若是你正在寻找与 nodemon 相似的解决方案,你必须本身编写代码来实现。 下面的23行代码是一个解决这种问题的列子:

function startProcess(args: string[] = []): Deno.Process {
  return Deno.run({ cmd: ['deno', ...args] });
}

const throttle = 500;
let app: Deno.Process = startProcess(Deno.args);
let timeout: number|null = null;

function runApp() {
  app && app.close();
  app = startProcess(Deno.args);
}

for await (const event of Deno.watchFs('.')) {
  if (event.kind !== "access") {
    if (timeout) clearTimeout(timeout);
    timeout = setTimeout(runApp, throttle);
  }
}
复制代码

会取代Node.js吗

咱们中的有些人早在 Node.js 0.10 版本推出的那天起就已经开始使用它了,而且是在生产环境中使用它!真相听起来也许有点吓人,可是咱们正在作,由于没有别的能替代的。 PHP,Python 甚至 Ruby(更不用说 Java.NET)都没法与具备 JavaScript 和异步I/O模型的 Node.js 相提并论。 多年来,Node(和JavaScript)已经发展到能够知足行业要求。 是否是很完美? 可是,就像生活中的任何其余事物同样,编程语言也不是天衣无缝的。

Deno 如今只是一个仅有2年开发迭代的产品。它还没有在生产环境中进行尝试,也还没有编写异常的测试用例来了解其如何处理边界状况。直到作到了这一点,它才能供早期尝试者使用。也许一年后,咱们将看到有些公司开始分享他们的使用经验,他们如何解决新发现的缺点等。最终,社区将对其进行调整让它变得更有用,更受众。它会取代 Node.js 吗?咱们拭目以待。

相关文章
相关标签/搜索