Deno 在 2023 年
2023 年,Deno 在 Node/npm 兼容性和性能方面加速发展,同时继续朝着从根本上简化 Web 开发的目标迈进。以下是 2023 年变化摘要
- Deno 现在可以理解
package.json
文件,并且能够使用node:
说明符(如node:fs
和node:crypto
)导入内置 Node 模块。阅读更多。 - 一个新的 Web 服务器 API,
Deno.serve
,已稳定,并且 HTTP 吞吐量比去年提高了约 73%。 deno compile
获得了对 workers、动态导入 和 npm 模块 的支持。- Deno 在其 API 中更好地利用了 Web Streams (
ReadableStream
和WriteableStream
) 和AbortController
,以缩小浏览器和服务器端编程之间的差距。 - Deno 的配置文件
deno.json
现在也可用作导入映射。我们扁平化了模式,添加了 glob 支持,以及一个有用的顶级"exclude"
属性 —— 所有这些都允许对 Deno 的执行方式进行简洁的调整。 - 开源笔记本工具 Jupyter 添加了使用 Deno 对 JavaScript 和 TypeScript 的支持
- 在近一年的开发之后,WebGPU 终于被添加到 Deno 中。
- Deno 的 零配置 TypeScript 通过 LSP 和 VS Code 集成的重大改进,获得了更好的编辑器集成。
- Fresh,Deno 原生 Web 框架,功能不断增强,具有适当的 Tailwind 支持、Partials 和布局文件。
- Deno Deploy 变得更加强大,具有全球分布式原语:Deno KV、Queues、Cron。
- 我们发布了 自助式 Subhosting,供希望部署和执行不受信任的多租户 JavaScript 的平台使用。
让我们深入了解以下更改。
增强了与 Node 和 npm 的兼容性
为了实现生态系统的和谐,Deno 在 2023 年扩展了其功能,纳入了内置的 Node 模块,例如 node:fs
和 node:child_process
,可通过 node:
说明符访问。此添加建立在 2022 年底引入的本机 npm 支持之上,使用 npm:
说明符,进一步弥合了 Deno 和 Node 生态系统之间的差距。截至目前,Deno 拥有 对 42 个 Node 内置 API 中的 38 个 API 的部分或完整支持,标志着兼容性方面取得了实质性进展。
为了方便从 Node 到 Deno 的平滑过渡,我们引入了几项新功能
--unstable-byonm
标志允许在 Deno 中使用你首选的 npm 包管理器,从而增强了灵活性。- 通过
--unstable-sloppy-imports
标志,我们放宽了模块导入的严格性,以适应更广泛的编码风格和实践。 --unstable-unsafe-proto
标志引入了对Object.prototype.__proto__
的支持,这是许多 npm 包所依赖的功能。
这些增强功能对于希望在 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% 的吞吐量增长,同时尾部延迟和内存效率也得到了显著提升。
这些进步不仅限于 Deno 特定的项目;由于 Deno.serve
的底层架构,它们还扩展到利用 node:http
模块的模块和应用程序。
这些性能提升的关键因素是 Deno 的 HTTP 接口与 Hyper 和 Reqwest 库的改进集成。这种集成最大限度地减少了 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
可视化数据的示例
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,使其更易于使用且性能更高。
- 我们添加了对
_layout
文件的支持,以允许跨路由共享组件,增加了 使用路由组组织代码 的灵活性,并通过引入 异步路由组件 减少了将数据从路由处理程序传递到组件的样板代码。我们还 改进了编辑器中的 lint 规则和错误消息,以及 简化了测试。 - Islands 是 Fresh 设计的核心,也获得了大量新功能,使其更加强大,从而可以处理更广泛的用例。我们 扩展了可以传递给 island props 的数据类型,包括 Preact Signals、JSX、JSON 等。此外,islands 现在可以 嵌套、在子目录中组织,并且 可以从同一文件中导出多个 islands。
- Fresh 的性能也得到了提高,新的 提前编译步骤来缓存客户端资源(你可以在 Deno Deploy 中使用 GitHub Actions 而不是 GitHub Automatic 启用此优化步骤),使用 Partials 的引入 实现更流畅的客户端导航,以及 改进的 islands 打包策略。
- 我们改进了 Fresh 插件系统,使其能够添加 islands、中间件和路由。一个值得注意的胜利是 从 TwindCSS 迁移到 TailwindCSS,后者得到积极维护,并且性能得到提升。Fresh 社区也在不断壮大,更多项目要么在 Fresh 中构建,要么是为 Fresh 构建的库和插件。
我们在 2024 年为 Fresh 计划了很多,例如 视图转换、热模块重载和更快的 JSX 转换。
扩展 Deno 的云业务
虽然我们已经介绍了开源项目中的重大更新,但如果不提及商业方面的进展,Deno 的整体情况将是不完整的。
尽管 Deno Subhosting 已经存在一段时间 为 Netlify 的边缘函数提供支持 和 Deco.cx 客户的电子商务商店,但今年 我们使其成为自助服务,以便任何人都可以通过 我们的 Subhosting API 免费以编程方式部署和运行用户的代码。它旨在安全地运行第三方不受信任的代码,因为它 从一开始就设计为实现最大的租户隔离。(不确定 Deno Subhosting API 的用途?查看 关于如何构建你自己的云 IDE 的本教程。)
我们通过启动云原语朝着从根本上简化 Web 开发的愿景迈出了步伐:Deno KV、Queues 和 Cron。它们内置于运行时中,因此你可以无需摆弄 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 上关注我们。