服务器端JavaScript框架-Deno
2020-05-17 20:09:30 阿炯

Deno 是作者 Ryan Dahl 在 Node 之后的又一大作,它是一个新的运行时,用于在 Web 浏览器之外执行 JavaScript 和 TypeScript,其采用 Rust 编写而成(最初用的是 Golang)。Deno 是一个 JavaScript/TypeScript 运行时,具有安全的默认设置和良好的开发体验,构建在 V8 引擎、Rust 语言和 Tokio 之上。最初的 deno 版本是用 Go 语言写就,但在第二版中移除了 Go 转而用 Rust 语言替代,因为后者具有更好的安全性。


Deno 试图提供一个独立的工具来快速编写复杂功能的脚本,它将始终是单个可执行文件。就像 Web 浏览器一样,它知道如何获取外部代码。在 Deno 中,单个文件可以定义任意复杂的行为,而无需任何其它工具。Ryan Dahl 认为过去他在设计 Node 时犯了一些错误,包括安全性、构建系统、package.json、node_modules、index.js 等等,并表示 Node 存在的种种不足导致有许多严重 bug 问题且不可回避,当前 JavaScript 和周围的软件基础架构已经发生了巨大的变化,值得进行简化,于是他重新设计了 Deno 这门脚本语言。


特点

Rust API

今天正式发布的 1.0 版本带来了命令行界面 CLI 1.0。Deno 本身并不是一个单体的程序,而是设计为 Rust crate 的集合,以允许在不同的层进行集成。Deno 中的 Rust crate deno_core 不依赖于 TypeScript 或 Tokio,它只是提供了操作和资源基础架构。也就是说,它提供了一种将 Rust 特性绑定到 JavaScript promise 的有组织方式。CLI 则完全建立在 deno_core 之上。

rusty_v8 crate 提供高质量的 V8 C++ API 的 Rust 绑定。该 API 尝试尽可能与原始 C++ API 匹配,它是零成本的绑定,因为 Rust 中暴露的对象与在 C++ 中操作的对象完全相同。

HTTP 服务器性能

Deno 的 HTTP 服务器是采用 TypeScript 在原生 TCP socket 的顶层实现的,Node 的 HTTP 服务器使用 C 语言编写,并作为对 JavaScript 的高级绑定暴露。一直以来 Deno 拒绝将原生 HTTP 服务器绑定添加进来,因为这还需要优化 TCP socket 层,更常见的是优化 op 接口。

Deno 是一个合适的异步服务器,每秒 25k 请求足以满足大多数目的,此外,由于普遍使用 Promise,Deno 需要有更好的尾部延迟。目前 Deno HTTP 服务器每秒处理约 25 000 个请求,最大延迟为 1.3 毫秒,与之相比,Node 程序每秒处理 34 000 个请求,最大延迟介于 2 到 300 毫秒之间。

这样看来,作者认为 Deno 的 HTTP 服务器还有更多的性能优势,并表示希望在将来的版本中实现这一目标。具体关于 HTTP 服务器性能,可以点击这里查看。


Deno 核心开发者开源了号称是下一代 Web 框架 Fresh

2022年6月中旬,Deno 核心开发者 Luca Casonato 开源了名为「Fresh」的新项目,并称它是下一代的 Web 框架。据官网的介绍,Fresh 是面向 JavaScript 和 TypeScript 开发者的全栈现代 Web 框架,可帮助他们轻松创建高质量、高性能、稳定性好,以及支持定制的 Web 应用。


Fresh 核心是路由框架和模板引擎的组合,支持在服务器上按需渲染页面。除了在服务器中提供的即时 (JIT) 渲染之外,Fresh 还提供了一个接口,用于在客户端上无缝渲染某些组件,以实现最大的交互性。该框架使用 Preact 和 JSX 在服务器和客户端上进行渲染和模板化。

一句话说通Fresh:在服务器端渲染并将 HTML 推送到客户端。

亮点特性
无构建步骤
零配置
边缘 JIT 渲染
轻量且快速(框架不需要客户端 JS)
单个组件支持可选的客户端 Hydration
由于采用渐进式增强和使用原生浏览器功能而具有很强的适应性
开箱即用的 TypeScript
文件系统路由采用 Next.js

由于 Fresh 没有构建步骤,因此开发者编写的代码直接就是在服务器上运行的代码、在客户端上执行的代码。将 TypeScript 或 JSX 转换为纯 JavaScript 的任何必要转换都是在需要时即时完成的。这允许非常快速的迭代循环和非常快速的部署。通过 Deno可将Fresh 项目可以手动部署到任何平台,但部署到像 Deno Deploy 这样的边缘运行时可获得最佳体验。目前 Fresh 尚未正式发布,仍处于频繁更改核心功能的阶段,请勿在生产环境使用。


最新版本:1.0
Deno 1.0 还带来了一个新生的插件系统,用于通过自定义操作扩展 Deno 运行时。但此接口仍在开发中,并已标记为不稳定。此外,发布公告中还提及 Deno 稳定性与兼容性等内容,还介绍了接下来将会把 TSC 移植到 Rust,最终加速类型检查,提高从 TS 解析到 JS 性能的计划,详情查看此处

最新版本:1.3
2023年12月中旬发布的 1.39 版本发布标志着该平台的一个重要更新,其中包含多项引人注目的改进和新特性。

WebGPU 的回归
Deno 1.39 重新引入了 WebGPU API 的支持,这一决定标志着对于高性能、跨架构的 GPU 编程在 JavaScript 中的重要进展。WebGPU API,被视为 WebGL 的有效继承者,为开发者提供了一种低级别、高性能的方式来直接编程 GPU 硬件。此规范已被最终确定,并且已经在 Chrome 浏览器中提供。Firefox 和 Safari 也正在进行相关支持的开发工作。其最初在 2021 年初引入了 WebGPU 的支持,但由于性能问题,这一特性在今年早些时候被移除。现在,这些性能问题已经得到解决,重新引入了 WebGPU。GPU 在执行某些数值运算方面,相比于 CPU,能够提供极高的并行处理能力。这一点不仅在渲染和游戏中非常有用,也在诸如机器学习算法这样的应用中展现出极高的效率,因为这些算法通常可以被表达为一系列矩阵运算,而这些运算可以在 GPU 上高效执行。

Deno 中的 WebGPU 实现基于即将在 Firefox 中推出的 WebGPU 实现的同一底层系统,因此,开发者可以有信心地在这一基础上构建应用。更多示例可以在其 webgpu-examples 仓库中查看。尽管规范已稳定,但在 Deno 中 WebGPU 仍然被视为不稳定。要在 Deno 中使用它则需要使用 --unstable-webgpu 标志。Deno 团队计划在从社区获得更多反馈,并有更多时间对实现与规范测试套件进行验证后,很快将其稳定下来。为了提供更多的 WebGPU 功能,Deno 还添加了 std/webgpu。

更灵活的动态导入支持
在此版本中,deno compile 现在支持更多动态导入模式。由于 Deno 需要在编译过程中静态包含所有可能在运行时被导入的模块,因此动态导入曾是一个挑战。现在,Deno 能够处理更复杂的动态导入模式,例如使用模板字符串的导入语句。

Deno 语言服务器(LSP)的增强
为了提升 Deno 语言服务器的性能,1.39 版本引入了显著的性能改进。这包括优化了快速打字期间大量请求的处理,使在 IDE 中的编辑体验更为流畅。此外,新增了一个关机超时机制,以及最新版本的 Deno 更新通知功能。

Node.js 兼容性改进
1.39 版本为了方便将现有的 TypeScript 代码库迁移到 Deno,引入了对不规范导入的支持。例如,它允许在没有文件扩展名的情况下解析导入,或者使用不正确的文件扩展名导入 TypeScript 文件。此外,还增加了对 node_modules/.bin/ 目录中可执行文件在 deno task 中的运行支持。

Deno API 的变更
新版本中也包括了对 Deno API 的若干更改。例如,对于 Unix 套接字的 Deno.serve() 支持已稳定化,以及 Deno.HttpServer.shutdown() 的稳定化。此外,引入了 Deno.HttpClient 的使用关键字支持,以及对变更通知的 Deno.Kv.watch() API。

其他特性和修复
1.39 版本还包括了其他许多新特性和修复,如 TypeScript 5.3 的支持,对 Jupyter 笔记本中代码块的格式化支持,以及多项对 Node.js API 的更新和错误修复。

这些更新和改进共同提升了 Deno 的性能、灵活性和兼容性,使其成为开发现代 JavaScript 和 TypeScript 应用程序的一个更加强大和多功能的平台。


官方主页:https://deno.land/


该文章最后由 阿炯 于 2023-12-16 10:18:36 更新,目前是第 2 版。