做者:Arek Nawo翻译:疯狂的技术宅javascript
原文:https://areknawo.com/deno-why...html
未经容许严禁转载前端
若是你一直关注 Web 开发领域,那么最近可能已经听到了不少关于 Deno 的信息——一种新的 JavaScript 运行时,它可能也会被认为是 Node.js 的继承者。可是这意味着什么,咱们须要“下一个 Node.js” 吗?java
要了解发生了什么,咱们首先须要看一下 Deno 究竟是什么。就像我前面说过的那样,这是一个新的 JavaScript 运行时,也就是要执行 JS 代码的环境。它最初是由 Ryan Dahl 创造的,他在以前曾经为咱们把 Deno 与 Node.js 进行了比较。node
Ryan在 JSConf EU 2018 演讲 上宣布了 Deno,标题为 “Node.js 的十大遗憾”。仅从那条信息中,你就能够知道进展状况。 Deno 是从头开始建立的,是当前对 Node.js 的更好的实现。git
可是 Node.js 有什么很差的地方?Deno 如何与它更成熟的表兄抗衡?程序员
尽管 Deno 和 Node.js 是执行类似操做的相似工具,但它们之间的差别远远不仅是名称的颠倒。github
让咱们先来了解一下 Deno 的内部原理。就像 Node.js 同样,它基于 Chromium 的 V8 JavaScript 引擎,并使用事件驱动,非阻塞架构。可是二者的主要编写语言有所不一样。Node.js 主要使用 C ++ 编写,libuv 做为其异步 I/O 库,而 Deno 用的是 Rust,一样其使用的异步库 Tokio 也是用 Rust 编写。面试
对于这些差别如何转化为实际性能,咱们必须拭目以待。就目前而言,根据 Deno 的基准,二者之间的区别是没法区分的,或者说至少是很是微妙的。json
你可能知道,Node.js 当前的模块系统是所谓的 CommonJS (带有 require()
的那个),尽管 ESM( ECMAScript 模块(带有 import
和 export
的模块)成为 JS 的官方标准已有至关长的一段时间了,能够追溯到2015 年推出的 ES6。固然,Node.js 确实支持 ESM,可是此功能目前([ v14.xx) 被标记为实验性的,从而迫使 JS 社区仍然使用 CommonJS 模块系统 或其余打包器。
这就是 Deno 要推出的东西,它仅支持 ESM 模块 —— 一个真正的模块系统!
可是,除了 ESM 以外,Deno 还为 Node.js 带来的依赖性管理带来了更多变化。
基于从有着上百万个包的 NPM registry 和相似黑洞的 node_modules
目录中汲取的经验,Deno 采用了一种彻底不一样的依赖关系方法。 Deno 不须要相似 NPM 的 registry 和包管理器,而是直接从 URL 导入并使用依赖项:
import { serve } from "https://deno.land/std@0.50.0/http/server.ts"; const s = serve({ port: 8000 }); console.log("http://localhost:8000/"); for await (const req of s) { req.respond({ body: "Hello World\n" }); }
而后将下载的模块不可见地存储在计算机上的某个位置。是的,这意味着不会再有 node_modules
!
但是等等!还有更多...或者我应该少说,由于 Deno 还摆脱了如今制做的万能的 package.json
文件。除了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";
至于 NPM registry,由于 Deno 如今能够从 URL 加载依赖项,因此这与 Node.js 的要求不同。可是若是你对这个选项感兴趣,Deno 会提供本身的包托管。
是的,你已经看到了 ——JavaScript 是使用 Deno 的主要语言,另外还支持 TypeScript,。该支持是内置的,不须要相似 custom registers 的东西或复杂的设置。
可是,除了 TS 支持以外,Deno 还内置了许多其余有用的工具。它们当中的大多数以命令形式出现,例如fmt
、bundle
或 doc
,分别提供代码格式化,打包和文档生成等功能。
至于 API,Deno 确定是本身的东西。一切都是用 TypeScript 编写的,异步 API 仅基于 Promise。核心功能被限制在最低限度,而其余全部功能均可以在 标准库 中找到。
因此从表面上看,这一切看起来都很好,并且很是有前途,可是当你意识到更改全部的 API 意味着将 Node.js 代码库转换为 Deno 更加困难时,这种愉悦的心情当即消失了。可悲的是,全部新的和更好的东西都必须付出代价,对吗?
最后,安全性是 Deno 最重要的方面之一。与 Node.js 相比,它用沙盒执行的代码,仅容许访问系统的选定部分。这意味着经过传递适当的标志,能够轻松地限制对磁盘、网络和子进程等内容的访问。
所以,我刚刚以很是简短的方式向你介绍了 Deno 的一些功能,以便你可以掌握全部内容的要点。你能够根据须要进行更深刻的研究(我将在本文结尾放一些不错的文章连接)。
让咱们回过头来讨论这个博客文章的主要问题——这意味着什么?好吧,主要是由于 Deno v1 已经在 2020 年 5 月 13 日 发布(正好是其首次发布的第二年)。如今每一个人都在问这是否将会成为“下一个大事件”,或者它是否将会彻底取代 Node.js。
就我的而言,我认为如今讨论这些还为时过早。考虑到项目的规模和社区的指望,该项目尽管已是 v1 版了,但要成为可行的 Node.js 替代者还有很长的路要走。请记住,这些技术(即便存在全部差别)仍然要作一样的事情,同时必须相互竞争。并且 Node.js 的开发也不会过期(例如基于 Promise 的 FS API 变体或 ESM 实验性支持),这意味着咱们极可能会在这个存在两个 JavaScript 运行时的世界中生活很长时间(说的好像对 JS 开发人员来讲是个新鲜事同样😅)。而且请记住,我甚至没有提到庞大的 NPM registry 和生态系统,尽管它们不管如何都不是完美的,但仍然为 Node.js 增添了不少价值——这是 Deno 目前还不具有的优点。
总而言之,Node.js 不会出如今任何地方,而且,若是你要启动一个用于生产的严肃项目,那么至少就目前而言,最好仍是坚持使用 Node.js。话虽如此,可是没有什么人(固然不是我)或事情可以阻止你去使用 Deno,甚至把 Deno 用于严肃的项目。看起来它确实像是将来,可是咱们根本尚未到达。
Deno资源: