技术编辑:徐九丨发自 侏罗纪公园
SegmentFault 思否报道丨公众号:SegmentFault
近日,Deno 1.0 正式发布了。这是 Node 之父 Ryan Dahl 继 Node 之后的又一大作。
Deno 是一个通用的 JavaScript / TypeScript 编程环境。它汇集了许多最佳的开源技术,并在一个小的可执行文件中提供了全面的解决方案。
Deno 和 Node 作为“同父异母”的亲兄弟,不仅名字很像,就连要解决的问题也很像。那么 Ryan 推出 Deno 的目的什么?它们之间又有哪些异同?
既生 Node,何生 Deno?
Dahl 曾经在 JS Conf Berlin 上做了一个题为《10 THINGS I REGRET ABOUT NODE.JS》的演讲,在这个演讲中他总结了自己当初在 Node 设计中的失误。
其中的遗憾之一是没有使用 JavaScript Promises,这些东西在 2009 年被添加到 Node 中,但在 2010 年被移除。这导致的结果是很多 Node 的 Async API "老化严重"。
另一个失误是安全性和缺乏 Node 沙盒。Dahl 表示使用 GYP(Generate Your Projects)的构建系统对用户来说是"可怕的体验"。
与早期关注均衡 I/O 的情况相反,模块系统本质上是事后考虑的。如果考虑到这一点,那么在早期阶段就可以做的更好。
这也是 Dahl 为什么要搞 Deno 的原因,但 Deno 并不定位为 Node 的替代品,从整体功能来看,Deno 有更大的野心。据业内人士分析讨论,推测是想要取代现在陈旧的前后端开发模式,让 Deno 一统前后端开发全流程。
Deno 和 Node 的区别
它建立在V8(Chromium和Node.js所使用的JavaScript引擎)上,但与Node不同的是,它利用了V8沙盒的安全优势。除非明确启用,否则没有文件、网络或环境访问权限。
与用 C++编写的 Node.js 不同,Deno 用 Rust 编写。
Deno_core 是一个 Rust 包,任何人都可以用它将 JavaScript 运行时嵌入到 Rust 中,而 Deno 就是建立在 deno_core 之上。
另一个包 Rusty_v8,提供了 Rust 与 V8 C++ API 的绑定;它 "试图成为一个安全的接口",但还不是百分之百的安全。"能够以安全的方式与 V8 这样复杂的虚拟机进行交互是相当惊人的,这让我们发现了 Deno 本身的许多困难的 bug,"Dahl 发布的帖子解释道。
Deno 的调度是由 Tokio 处理的,它是 Rust 的异步运行时。另一个关键组件是 TypeScript,它是 Deno 中的主要语言。你可以直接运行 TypeScript 文件,不需要将其编译成 JavaScript。
Deno本身就是一个完整的生态系统,具有运行时和其自己的模块/软件包管理系统。这为内置所有工具提供了更大的空间,并且成功地消除了 JavaScript 开发中的许多缺点。比如:
- 通过使用 Web 标准,Deno 可以对其 API 进行过时的验证;
- 除 JavaScript 之外还拥有 TypeScript,消除了编译负担并允许更紧密的集成;
- 内置工具意味着无需浪费时间寻找开箱即用的产品;
- 分散式软件包管理使用户从 npm 中解放出来,与使用递减的 CommonJS 相比,ECMAScript 模块带来了新鲜的空气;
Deno 会取代 Node 么?
无论如何,由 Dahl 大神光环加持,再加上“面向未来”的设计,Deno 肯定会成为一个热议的话题。
不过虽然这次 Deno 的版本号标为了 1.0,但也仍处于非常早期的阶段,Deno API 的某些部分还不稳定,根据文档所说,Deno 的标准模块也还不太稳定。该团队还表示内部使用的 TypeScript 编译器速度非常慢。
他们的意图是将 TypeScript 编译器移植到 Rust 上,尽管这是一个大项目。如果完成的话,对所有的 TypeScript 开发者都会有帮助,所以 Deno 团队也在呼吁大家为他们提供帮助。
所以,对于 Deno 是否会取代 Node 这件事,现在讨论还为时尚早。但多一个轮子多一条路,Deno 的出现,对于前端这个领域来说,一定是一个好事情。
相关资料:官方文档:https://deno.land/
GitHub 地址:https://github.com/denoland/deno
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。