自2020年5月发布1.0版本以来,Deno CLI一直在以稳定的速度发展。2021年,我们发布了44个版本(11个小版本,33个补丁),更新了关键功能,修复了无数的错误,并进行了重大的性能优化。
Deno Deploy
去年夏天,Deno Deploy 发布了首个 Beta 版本,这是由 Deno 团队从头开始构建的现代 serverless 云,用户可以使用它非常快速地将 JavaScript、TypeScript 和 WASM 服务部署到世界各地的数据中心。
目前,Deno 正在积极开发和投资 Deno Deploy,该项目被认为是继构建 Node.js 和 Deno CLI 之后该公司的第三个 JavaScript runtime。
优化 Deno 核心
Deno的核心提供了 "opcalls"(类似于syscalls),允许JavaScript调用运行时提供的Rust函数(fs/net/url-parsing/...)。
在v1.9版本之前,我们通过JSON和二进制缓冲区的混合来调集opcall值。
操作层的效率是运行时整体性能的一个关键因素。操作调用以前每次调用有4000ns的开销,现在减少了近100倍,每次调用有40ns。
这些效率提高的大部分是serde_v8的结果,这是我们在v1.9版本中设计并交付的Rust和V8值之间的~最大效率的双射。
仅此一项就将 URL 解析等常见操作的成本降低了 3 倍以上,并使 Deno 成为一个快速的 JS runtime。
原生 HTTP
在Deno v1.9中,我们提供了本地HTTP服务器绑定,后来在Deno v1.13中得到了稳定。这些绑定允许你创建高性能的HTTP服务器,并以 hyper
只需几行代码就可以创建高性能的HTTP服务器。
import { serve } from "https://deno.land/std@0.121.0/http/server.ts";
serve((_req) => new Response("Hello, world"), { port: 3000 });
console.log("Listening on http://localhost:3000");
因为这些绑定是建立在 hyper
构建的,它们提供了巨大的吞吐量和延时。
兼容性列表
Deno认真对待网络兼容性;我们用WPT(或Web Platform Tests
)对Deno进行测试,WPT是所有主要浏览器使用的测试套件,以确保规范的合规性。测试套件的结果可以在wpt.fyi上找到。
外部函数接口 (Foreign Function Interface)
在 Deno v1.13 中,开发团队用新的 Foreign Function Interface API 替换了不稳定的插件系统。虽然 FFI 尚处于不稳定阶段,但这是一个显著的改进。
1.13 之前的原生插件系统允许发布用 Rust 编写的动态库。由于 Rust ABI 不稳定,以及将 API 作者限制为单一语言,Deno 团队决定使用通用的 FFI API 替换此系统。该 API 允许开发者以任何使用 C 调用约定的语言为 Deno runtime 编写“扩展”。
目前已经诞生了部分使用 FFI API 的有趣项目,展示了 FFI API 的强大功能。
Slack & 下一代平台
2021 年 11 月,Slack 宣布了其基于 Deno 的下一代开发平台。Deno 团队表示,Deno Deploy 的“隔离即服务”为以下方面提供了坚实的基础:
- 现代边缘托管
- 用户可扩展平台(机器人、插件、应用程序等...)
- 低代码解决方案
Node.js 兼容性
在 2021 年第四季度,Deno 团队开始努力提供一流的 Node.js 兼容性,允许 Deno 直接在 Deno 中运行为 Node.js 开发的应用程序和库(NPM 包)。在 Deno v1.15 中,团队发布了"compat mode"的第一个预览版。虽然此功能仍然不稳定,但可以使用 --compat
标志启用。大部分工作涉及到在 std/node 中提供 polyfills。
一些关键模块如tls
和zlib
仍然不完整,但在目前的形式下,仍然可以运行 non-trivial 类型的应用程序。团队表示目标是在未来几个月内推出适合所有用户的第一个迭代版本。
Deno 2
对于 Deno 2,团队表示将会解决许多小的 API 变化,以及优化 Deno 的工作流。他们很快就会发布 Deno 2 的路线图,并希望在今年的上半年推出。Deno 将专注于提供更好的 NPM 生态兼容性,为常见的工作流程提供更好的 DX,并探索替代的包管理解决方案。