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

Denonode.js 的作者 Ryan Dahl 编写的,这是否意味着 Deno 实际上便是 Node.js 的替代品,我们E # : , o是否应该初步方案重构冲刺呢? 假s U c e m J如你想了解更多,请往下看。

在2018年,Ryan 进行了一次演说,在演说中他提? : 8 $ –出了他认为的有关 Node.js 的十大问题。在演说结束时,他揭开了 Deno 的面纱。其时 Deno 只是他正在建设中的一个小项5 { v x t M V 目,或许被我们( ? s N 6称作 Node.js v2版别,在 Node/ F L G.js 的基础上进行了改进,并且愈加安全。

这里是演说的视频地址,我们最好去看一看。

两年后,在2020年5月13日,官方正式发布了 Deno 1.0版别。一个全新的让 JavaScript 工作在服务端的开发渠S u 2 k J a道。不像 Node.js 是用 C++ 言语开发,Deno 底层是用基于 Tokio 途径(供应 JavaScript 所需的异步工作环境)的 Rust 言语编写的,依然工作在 V8 引擎上。

有什W L l X么新知识( E G _ L D ] z 9

2 0 e n ]们不单单在议论与当时 Node.js 完全兼容的新 JavaScript 工作环境,相反的是,RyanDeno 中增加了一些他认为在 Node.js 中所短少的东西。

安全集成

默许情况下 1 C v ENode.js 容许你访问任何内容,也就K , 9 : 9 D是说,你可以读写文件系统,发送传输请求,访问环境变量等等。 作为开发人员,具有这种访问权限当然是有长处的,但在编写代码时万一不小心,有可能会带来安全风险。

因此,Deno 可以运用命令行参数来启用或禁用对不同安全功用的访问。假设你需求脚本可以访问 /etc 文件夹,可以实行以下操作:} 7 k h ~

deno --allow-read=/etc myscript.ts

这样,你的代码就可以从该文件夹中读取任何内容,并且会在没有权限的情况下抛出全失常。 这类似于其他途径处M , P V D X理安全性的方法Z J b P N y。假设你是 Android 用户,你必定遇到过许多应用程序曾要求你容许它们读取联络人,电Q j { A z F 5话,文件夹等,这与此类似。 通过在实行脚本的命令行中敲上这些参数J 7 ? = , U9 [ ? /_ V w U i [ 5可以供应代码所需的权限。

更无缺的8 G T ! P标准库

自从第一个 Node.js 版别以来,JavaScript 就初步改进其标准库。但是} G # 2与其他言语比较,它还有很长的路要q j t W u ;走。 Deno 也致力于改进这一点,并宣称其具有一个非常无缺的标准库,H % #容许开发人员运用官方东西来实行底子的任务,只要杂乱的任务时才需求运用外部库(比方 NPM )。

本质上讲,Deno 供应了比方 为终端文本添加色彩、运用外部数据结构(例A _ H | n如二进制,csvyaml 等)、生成 UUID 乃至编写 websockb ) ! Y ! C Uet 等开箱即用的方法。 还有一些其他的更底子的模块可用,例如访问文件系统t L 3 S m t,日期转化函数,http 相关函数等等。

集成TypeG B e n v f (script

你没有看错,假设你是 TypeScript 的爱好者,那么 Deno 自身就可以满足你的需) A = e ; 9 e ; 9求,不需求额定引进外部库,默许情况下就可以将 Tyq 2 y T ipescript 转化为 JavaScript

虽然默许情况下,Deno 自身会完成转化,但是你可以运用自己的 tg p / a e Osconfig.T ; ; * S y I = ,json 文件来掩盖默许装备:

deno run -c t_ p v v ` [ 7sconfig.) x 3 Ejson [your-script.ts]

默许装# 0 t s备选用的是严厉形式,因此任何不符合标准的编码都会当即得到警告。

不再需求 NPM 或node_modules 文件夹

Node.js 中, 每一个模块和它的祖先模块都有着千丝万缕的依托联络。是否太臃肿了( m q W H B h呢?是否是一个差错的方法来分发办理依托呢?这绝+ 3 S对是 Node.js 最具争议的方面之一,因此 Deno 决议完全放弃它。

那么,Deno 是怎样处x 3 n , ) = p :理依托联络Q 9 @ ;的? 它容许你从任何地方引进模块。换句话说,你可以简略地实行以下操作:

import * as log from "http/ G - M / = u !s://d : A l : p 1eno.land/std/log/mod.ts";

F @ P s E [ J %此不再需求具有自己的集中式存储库,但是你有必要慎重的进行此操作,由c C ( $ k于从无法操控的第三方来源导入模块会使你暴露。

实际上,我们也不再需求 package.json,现在通过在名为 deps.ts 的文件中保护模块列表及其各自的URL即可完成依托办理。 但是版别操控怎样办呢?我知道你就会问。你可以在 URL 上指定软件包的版别,虽然不是很精巧,但确管用。

一个简略的 deps.ts 文件或许是这样子的:

export { assert } frl H - $ .om v 0 a ? p / l"https://deno.lat J M  $nd/std@v0.39.0/testing/asserts.ts";
export { gr o ! c D *reen, bW c m & g r }old } from "https://denP . P K _ A x m Zo.land/std@v0.39.0/fmt/colors.ts";

这将重新导出模块,假设你想更改其引用版别,简略的更改 URL 就可以了。

趁便说t N : . –一下,第一次实行代码后,导入的模块就会被缓存下来直到你下一次重启。

还有啥

Deno 还包括其他功用,例如开箱即用的大型东西,包括 test runner, debugger, file watcher 等。 但是有些仅r N , k F S ~ h R仅其供应的C 3 g / f API,需求在其基础上写自己的逻辑才华运用它们。

Deno.watchFs 供应的 file watcher API 为例,假设你正在寻觅与 nodemons 0 G k 类似的处理方案,你有必要自己编写代码来完成。 下面的23行代码是一个处理这种问题的列子:

function startProcess(a/ D G W Vrgs: string[] = []): Deno.Process {
return Deno.run({ cmd: ['deno', ...args] });
}
const throtz ? w ; . p .tle = 500;
l/ ^ u Net 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(tim! ? $ d L ~ xeoD X b & ] 3 qut);
timeout = setTimeoutK * H U(runApp, t7 7 . ] . -hrottle);
}
}

会替代Node.js吗

我们中的有些人早在 Node.js 0.10 版别推出的那天起就现已初步运用它了,并且是在出产环境中运用它!真相听起来或许有点吓人,但是我们正在做,由于没有其他能替代的。 PHP,Python 乃至 Ruby(更不用说 Jav[ j . Ja.NET)都无法与具有 JavaScript 和异步I/O模型的 Node.js 相提并论。 多年来,Node(和J; & y 3 r havaScript)现已发展到可以满足职业要求。 是不是= v B e V很完美? 但是,就像日子中的任何其他事物相同,编程言语也不是白璧无瑕的。

Deno 现在只是一个仅有2年开发迭代的产品。它没有在出产环境中进行检验,也没有编写失常的测试用例来了解其怎样处理鸿沟情况。直到做到了这一点,它才华供前期检验者运用。或许一年! _ 5 b T后,我们将看到有些公司初步分享他们的运用经验,他们怎样处理新发现的缺点等。终究,社区将对其z t O , ; P $ = =进行调整让它变得更有用,更受众。它会替代 Node.js 吗?我们拭目而待。