跳到主要内容
Deno 2 终于来了 🎉️
了解更多
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 包范围,并简化了集成过程。

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

我们通过引入和稳定 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 内存、英特尔至强 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 中的开发体验,提供了强大的功能,如精确的转到定义、全面的 IntelliSense 以及对 TypeScript 项目的无缝代码格式化。今年,我们投入了大量精力来增强 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 在需要大量计算能力的领域中的可能性边界的开发人员尤其有前景。

我们还积极开发功能,以使 WebGPU 能够在原生 GUI 窗口中进行渲染,从而进一步拓宽 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 框架

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

  • rustls-tokio-stream 是一个 Rust 框架,它替换了 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

我们继续使 Deno 的现代全栈 Web 框架 Fresh 更易于使用,并且性能更高,该框架默认情况下不会发送任何客户端 JavaScript。

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

扩展 Deno 的云业务

虽然我们已经涵盖了开源项目的重大更新,但如果没有提及商业方面的进展,Deno 的整体图景将是不完整的。

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

我们通过推出云基元:Deno KV队列Cron,朝着简化 Web 开发的愿景迈出了重大步伐。 它们直接内置到运行时中,因此您可以无需管理 API 密钥或处理配置即可进行设置

const kv = await Deno.openKv();

当您使用 Deno Deploy 时,这些云基元无缝地成为全局分布式服务,为您的服务器和应用程序优化性能。

我们还通过将其变成 它自己的开源二进制文件,添加了对 远程连接到任何 Deno KV 实例 的支持,使其可以通过 我们官方的 Deno KV npm 模块 在 Node/npm 中访问,以及添加对 使用时间点恢复与 S3 和 GCS 进行持续复制的支持,从而扩展了对 Deno KV 的访问权限。

我们有一些重大计划,通过更多功能和新基元来进一步简化云开发,敬请关注。

Deno 2 👀

我们正在准备 Deno 2,它将通过 提供迁移指南 来提高与 Node 和 npm 的兼容性,以确保平稳过渡。 除了改进的运行时外,我们还有一些关于管理和优化项目依赖项的激动人心的公告。 请在接下来的几周内关注有关未来发展路线图的更详细介绍。 如果您想抢先体验 - 请查看此处.



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