原文连接: blog.bitsrc.io/what-is-den…node
Deno
是 node.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
运行环境,相反的是,Ryan
在 Deno
中增长了一些他认为在 Node.js
中所缺乏的东西。安全
默认状况下,Node.js
容许你访问任何内容,也就是说,你能够读写文件系统,发送传输请求,访问环境变量等等。 做为开发人员,具备这种访问权限固然是有好处的,但在编写代码时万一不当心,有可能会带来安全风险。bash
所以,Deno
可使用命令行参数来启用或禁用对不一样安全功能的访问。若是你须要脚本可以访问 /etc
文件夹,能够执行如下操做:websocket
deno --allow-read=/etc myscript.ts
复制代码
这样,你的代码就能够从该文件夹中读取任何内容,而且会在没有权限的状况下抛出全异常。 这相似于其余平台处理安全性的方式。若是你是 Android
用户,你确定遇到过不少应用程序曾要求你容许它们读取联系人,电话,文件夹等,这与此相似。 经过在执行脚本的命令行中敲上这些参数,就能够提供代码所需的权限。markdown
自从第一个 Node.js
版本以来,JavaScript
就开始改进其标准库。可是与其余语言相比,它还有很长的路要走。 Deno
也致力于改善这一点,并声称其拥有一个很是完整的标准库,容许开发人员使用官方工具来执行基本的任务,只有复杂的任务时才须要使用外部库(好比 NPM
)。数据结构
本质上讲,Deno
提供了诸如 为终端文本添加颜色、使用外部数据结构(例如二进制,csv
,yaml
等)、生成 UUID
甚至编写 websocket
等开箱即用的方法。 还有一些其余的更基本的模块可用,例如访问文件系统,日期转换函数,http
相关函数等等。
你没有看错,若是你是 TypeScript
的爱好者,那么 Deno
自己就能够知足你的须要,不须要额外引入外部库,默认状况下就能够将 Typescript
转换为 JavaScript
。
尽管默认状况下,Deno
自身会完成转换,可是你可使用本身的 tsconfig.json
文件来覆盖默认配置:
deno run -c tsconfig.json [your-script.ts]
复制代码
默认配置采用的是严格模式,所以任何不符合规范的编码都会当即获得警告。
在 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
0.10 版本推出的那天起就已经开始使用它了,而且是在生产环境中使用它!真相听起来也许有点吓人,可是咱们正在作,由于没有别的能替代的。 PHP,Python
甚至 Ruby
(更不用说 Java
或 .NET
)都没法与具备 JavaScript
和异步I/O模型的 Node.js
相提并论。 多年来,Node
(和JavaScript)已经发展到能够知足行业要求。 是否是很完美? 可是,就像生活中的任何其余事物同样,编程语言也不是天衣无缝的。
Deno
如今只是一个仅有2年开发迭代的产品。它还没有在生产环境中进行尝试,也还没有编写异常的测试用例来了解其如何处理边界状况。直到作到了这一点,它才能供早期尝试者使用。也许一年后,咱们将看到有些公司开始分享他们的使用经验,他们如何解决新发现的缺点等。最终,社区将对其进行调整让它变得更有用,更受众。它会取代 Node.js
吗?咱们拭目以待。