跳到主要内容
Deno seeing a 2023 in the clouds

Deno 在 2023 年

2023 年,Deno 在 Node/npm 兼容性和性能方面加速发展,同时继续朝着从根本上简化 Web 开发的目标迈进。以下是 2023 年变化摘要

让我们深入了解以下更改。

增强了与 Node 和 npm 的兼容性

为了实现生态系统的和谐,Deno 在 2023 年扩展了其功能,纳入了内置的 Node 模块,例如 node:fsnode:child_process,可通过 node: 说明符访问。此添加建立在 2022 年底引入的本机 npm 支持之上,使用 npm: 说明符,进一步弥合了 Deno 和 Node 生态系统之间的差距。截至目前,Deno 拥有 对 42 个 Node 内置 API 中的 38 个 API 的部分或完整支持,标志着兼容性方面取得了实质性进展。

为了方便从 Node 到 Deno 的平滑过渡,我们引入了几项新功能

这些增强功能对于希望在 Deno 中运行现有 Node 项目而无需进行大量修改的开发人员特别有用。

过去一年中一个值得注意的进步是 Node-API 的稳定化。此开发消除了在使用依赖于 Node-API 的 npm 包时对 --unstable 标志的需求,从而扩大了受支持的 npm 包的范围并简化了集成过程。

使用 Deno.serve() 实现更简单、更快速的 Web 服务器

我们通过引入和稳定 Deno.serve() 函数,显著简化了 Deno 中 Web 服务器的创建,使开发人员能够以最少的代码启动服务器

Deno.serve((req) => new Response("Hello, world"));

此增强是我们持续致力于简化开发流程并减少对大量样板代码的需求的一部分。Deno.serve() 函数体现了这种理念,实现了高效简洁的服务器设置。

通过核心库和事件循环机制中的有针对性的优化,性能得到了显著提升。在使用基本 “Hello, world” 服务器设置的基准测试中,Deno 的 HTTP 吞吐量取得了显著的增长,自 2023 年底以来几乎翻了一番。与类似的 Node.js 服务器相比,Deno 现在展示了约 61% 的吞吐量增长,同时尾部延迟和内存效率也得到了显著提升。

HTTP benchmark in requests per second

在裸机 8 核、64GB 内存、Intel Xeon E-2378G 上使用 `wrk -d 10s` 运行

这些进步不仅限于 Deno 特定的项目;由于 Deno.serve 的底层架构,它们还扩展到利用 node:http 模块的模块和应用程序。

这些性能提升的关键因素是 Deno 的 HTTP 接口与 HyperReqwest 库的改进集成。这种集成最大限度地减少了 Deno 运行时不同层之间不必要的数据分配和重复。

此外,我们还优化了 Deno 事件循环,它负责管理异步操作和资源监控,以减少开销并提高运行时的整体效率。这些集体改进突显了我们致力于为 Web 开发提供稳健、高性能的环境。

更灵活的 deno.json

在 Deno,我们坚持零配置编程的原则,特别重视单文件程序的简洁性,即使是那些用 TypeScript 编写的程序。认识到大型项目通常需要更复杂的设置,我们不断改进我们可选的 deno.json 配置文件,以满足这些复杂的需求,而又不牺牲易用性

  • 简化的配置:我们已将 deno.json 转换为可用作导入映射,有效地减少了对单独配置文件的需求,并简化了项目设置。了解有关导入映射的更多信息
  • 增强的格式化选项deno fmt 现在支持分号,在代码样式方面提供了更大的灵活性,以适应不同的开发人员偏好。
  • Node 和 npm 兼容性:与 package.json 的集成增强了兼容性,使项目更容易在 Node 和 Deno 环境之间转换。了解我们如何改进兼容性
  • 简化的配置结构:我们扁平化了 deno.json 结构,使其更直观,更易于开发人员导航。了解更简单的结构
  • Glob 支持:在 deno.json 中引入 glob 模式允许更精确地控制文件和目录在各种操作(如格式化、lint 和测试)中的包含或排除。探索 glob 支持详细信息

这些增强功能是我们持续致力于使 Deno 不仅对大规模应用程序强大而通用,而且对较小项目也简单易用的承诺的一部分。

使用 LSP 获得更流畅的开发体验

Deno 的语言服务器协议 (LSP) 集成提升了编辑器和 IDE 内的开发体验,为 TypeScript 项目提供了强大的功能,如精确的跳转到定义、全面的 IntelliSense 和无缝的代码格式化。今年,我们投入了大量精力来增强 LSP,使 Deno 中的编码更流畅、更直观

  • 扩展的自动完成:现在包括对 npm:node: 说明符的支持,简化了在 Deno 中使用 Node 模块的过程。
  • VSCode 扩展激活:当在你的项目中检测到 deno.json 文件时,Deno VSCode 扩展现在会自动触发,确保立即访问 Deno 的强大工具。
  • 智能导入管理:当文件重命名时,TypeScript 和 JavaScript 文件中的导入现在会自动更新,保持代码一致性并减少手动重构。
  • 高效的文档预加载:确保 “查找引用” 等功能在项目中的所有文件中无缝工作,从而增强代码导航和理解。

要充分利用这些改进,请尝试 Visual Studio Code 的 Deno 扩展,旨在将这些增强功能直接集成到你的开发工作流程中。

WebGPU

Deno 现在集成了 WebGPU,这是一项前沿技术,使开发人员能够直接使用 JavaScript 利用 GPU 硬件的强大功能。这种高性能、低级别的接口专为广泛的应用程序而设计,从图形渲染到数据分析以及机器学习,所有这些都在熟悉的 Web 标准 JavaScript 环境中进行。

经过一年的专注开发,WebGPU 在 Deno 中可通过 --unstable-webgpu 标志访问,这标志着扩展 Deno 应用程序功能方面的一个重要里程碑。对于希望在需要密集计算能力的领域突破 JavaScript 可能性的界限的开发人员来说,此功能尤其有前景。

我们还在积极开发在原生 GUI 窗口中启用 WebGPU 渲染的功能,进一步拓宽了 Deno 开发人员的潜在用例。及时了解此功能的进展

要探索实际应用并了解 Deno 中 WebGPU 的实际应用,请访问我们的 WebGPU 示例存储库,其中提供了各种示例项目和代码片段。

Jupyter 笔记本

开源笔记本工具 Jupyter 添加了使用 Deno 对 JavaScript 和 TypeScript 的支持。这意味着数据科学、可视化等都可以使用现代 JavaScript 和 TypeScript 以及 Web 标准 API 来完成。

这是一个使用 fetch 获取数据并使用 observablehq/plot 可视化数据的示例

A scatter plot in Jupyter notebooks using TypeScript with Deno

Jupyter 支持还支持使用 JavaScript 和 TypeScript 构建生成式 AI/ML 模型,因为 Andrew Ng 和 DeepLearning.AI 开发了 一个关于使用 LangChain.js 构建 LLM 应用的生成式 AI 课程,该课程使用了 Deno。

值得注意的开源 Rust crates

Deno 的表面积触及了广泛的开源项目,我们积极为这些项目做出贡献,以扩展 Deno 的功能集并优化性能。今年,我们发布了一些 Rust crates,开发人员可能会发现它们独立于 Deno 本身也很有用

  • rustls-tokio-stream 是一个 Rust crate,它取代了 tokio-rustls,增加了更高级的功能,例如通过 tokio::io::split 支持双工 I/O。至关重要的是,它不需要读取或写入轮询来执行握手。
  • fastwebsockets 是一个最小、快速的 WebSocket 服务器实现,位于 Deno 的 WebSocket 实现之后。它完全通过了 Autobahn TestSuite 并使用 LLVM 的 libfuzzer 进行了模糊测试。你可以将其用作原始 websocket 帧解析器并自行处理规范合规性,也可以将其用作功能齐全的 websocket 服务器。
  • monch 是一个受 nom 启发的解析器,但专门用于字符串,并带有我们在 Deno 中使用的一些其他组合器。它支持 deno_task_shell
  • deno_task_shell 是一个跨平台 shell 实现,可帮助 deno task 在 Windows 和 Unix 上运行。可以将其视为常见 Node.js 实用程序 cross-env 的更高级版本。

Fresh

我们继续改进 Fresh,Deno 的现代全栈 Web 框架,默认情况下发送零客户端 JavaScript,使其更易于使用且性能更高。

我们在 2024 年为 Fresh 计划了很多,例如 视图转换、热模块重载和更快的 JSX 转换

扩展 Deno 的云业务

虽然我们已经介绍了开源项目中的重大更新,但如果不提及商业方面的进展,Deno 的整体情况将是不完整的。

尽管 Deno Subhosting 已经存在一段时间 为 Netlify 的边缘函数提供支持 和 Deco.cx 客户的电子商务商店,但今年 我们使其成为自助服务,以便任何人都可以通过 我们的 Subhosting API 免费以编程方式部署和运行用户的代码。它旨在安全地运行第三方不受信任的代码,因为它 从一开始就设计为实现最大的租户隔离。(不确定 Deno Subhosting API 的用途?查看 关于如何构建你自己的云 IDE 的本教程。)

我们通过启动云原语朝着从根本上简化 Web 开发的愿景迈出了步伐:Deno KVQueuesCron。它们内置于运行时中,因此你可以无需摆弄 API 密钥或配置即可进行设置

const kv = await Deno.openKv();

当使用 Deno Deploy 时,这些云原语可以无缝地成为全球分布式服务,从而优化你的服务器和应用程序的性能。

我们还通过将 Deno KV 转变为 其自身的开源二进制文件、添加 远程连接到任何 Deno KV 实例 的支持、通过 我们的官方 Deno KV npm 模块 使其可在 Node/npm 中访问,以及添加 对 S3 和 GCS 的时间点恢复的持续复制的支持,从而扩大了对 Deno KV 的访问范围。

我们有一些更大的计划,通过更多功能和新的原语进一步简化云开发,敬请期待。

Deno 2 👀

我们正在为 Deno 2 做准备,它将通过 提供迁移指南 来提供与 Node 和 npm 更好的兼容性,以确保平稳过渡。除了改进的运行时之外,我们还有一些关于管理和优化项目依赖项的令人兴奋的公告。请在未来几周内关注即将发布的更详细的路线图。如果你想要抢先看 - 请看这里



不要错过任何更新!在 Twitter 上关注我们