作者:Andy Jiang、Ryan Dahl 2024年2月2日
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更好地利用了web流 (
ReadableStream
和WriteableStream
)和AbortController
,以缩小浏览器和服务器端编程之间的差距。 - Deno的配置文件
deno.json
现在兼作导入映射。我们简化了架构,添加了glob支持和一个有用的顶层"exclude"
属性,所有这些都允许对Deno的执行进行简洁的调整。 - Jupyter,开源笔记本工具,增加了对JavaScript和TypeScript的支持,使用了Deno。
- 经过近一年的开发,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个提供了部分或完全支持,标志着在兼容性方面迈出了重要的步伐。
为了实现从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服务器的创建,使开发人员可以用最少的代码启动服务器:
javascript
Deno.serve((req) => new Response("Hello, world"));
这一增强是我们不断简化开发流程、减少样板代码需求的持续承诺的一部分。Deno.serve()
函数体现了这一理念,使得服务器设置变得高效而简洁。
通过在核心库和事件循环机制中进行有针对性的优化,性能得到了显著提升。在使用基本的"Hello, world"服务器设置进行基准测试时,Deno的HTTP吞吐量取得了显著的增长,自2023年底以来几乎翻了一番。与类似的Node.js服务器相比,Deno现在表现出了约61%的吞吐量增长,同时在尾部延迟和内存效率方面也取得了显著的改进。
这些进步不仅限于Deno特定的项目;它们扩展到使用node:http
模块的模块和应用,得益于Deno.serve
的基础架构。
这些性能增益的一个关键因素是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模式允许更精确地控制各种操作中的文件和目录的包含或排除,例如格式化、linting和测试。探索glob支持详情。
这些增强是我们不断致力于使Deno不仅对于大规模应用程序强大而多才多艺,而且对于较小项目也简单易用的一部分。
在LSP中更流畅的开发体验
Deno的语言服务器协议(LSP)集成提升了编辑器和IDE中的开发体验,提供了精确的转到定义、全面的智能感知和TypeScript项目的无缝代码格式化等强大功能。今年,我们付出了大量努力来改进LSP,使在Deno中编码变得更加流畅和直观:
- 扩展自动完成 :现在包括对
npm:
和node:
规范器的支持,简化了在Deno中使用Node模块的过程。 - VSCode扩展激活 :当检测到项目中有
deno.json
文件时,Deno VSCode扩展现在会自动触发,确保立即访问Deno强大的工具。 - 智能导入管理:在文件重命名时,TypeScript和JavaScript文件中的导入现在会自动更新,保持代码一致性,减少手动重构。
- 高效的文档预加载:确保"查找引用"等功能在项目中的所有文件中无缝工作,增强了代码导航和理解。
要充分利用这些改进,尝试Deno适用于Visual Studio Code的扩展,旨在将这些增强功能直接整合到您的开发工作流程中。
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
进行可视化的示例:
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的fuzz测试。你可以将其用作原始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 文件的支持,以实现在路由之间共享组件,通过引入 async route components 来从路由处理程序传递数据到组件,进一步提高了代码组织的灵活性,以 route groups。我们还在 编辑器中改进了代码检查规则和错误消息,以及 简化了测试。
- Fresh设计的核心组件Islands也获得了许多新功能,使其更加强大,可以处理更广泛的用例。我们扩展了传递给 island props 的数据类型,包括 Preact Signals、JSX、JSON 等,此外,islands 现在可以 嵌套, 组织在子目录中,并且 可以从同一文件中导出多个。
- Fresh的性能也得到了提升,引入了 提前编译步骤以缓存客户端资产(您可以在 Deno Deploy 中使用 GitHub Actions 启用此优化步骤,而不是 GitHub Automatic),通过引入 Partials 实现了更快的客户端导航,以及 改进的 islands 打包策略。
- 我们改进了 Fresh 插件系统,以便添加 islands、 middlewares 和 routes。一个显著的改进是 从 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密钥或配置的情况下进行设置:
javascript
const kv = await Deno.openKv();
当您使用 Deno Deploy 时,这些云基元将无缝地变成全球分布的服务,优化服务器和应用程序的性能。
我们还通过将其变成 自己的开源二进制,扩展了对 Deno KV 的访问,添加了 远程连接到任何 Deno KV 实例的支持,通过 我们官方的 Deno KV npm 模块 使其在 Node/npm 中可访问,以及添加了支持将备份连续复制到S3和GCS并进行时点恢复。
我们计划通过更多的功能和新的基元进一步简化云开发,敬请关注。
Deno 2 👀
我们正在准备 Deno 2,它将提供与 Node 和 npm 更好的兼容性,通过 提供迁移指南 来确保平稳过渡。除了改进的运行时之外,我们还将就项目的依赖项管理和优化进行一些令人兴奋的公告。请在未来几周关注更详细的路线图。如果您想要提前了解,可以点击这里。