2023年的Deno

原文:deno.com/blog/deno-i...

作者:Andy JiangRyan Dahl 2024年2月2日


2023年,Deno在与Node/npm兼容性和性能工作方面迈出了重要的一步,同时继续朝着根本简化Web开发的目标迈进。以下是2023年发生的主要变化的摘要:

  • Deno现在理解package.json文件,并具有使用node:规范器(如node:fsnode:crypto)导入内置Node模块的能力。
  • 一个新的Web服务器API,Deno.serve被稳定下来,HTTP吞吐量在一年内提高了约73%。
  • deno compile支持workers、动态导入,以及npm模块。
  • Deno更好地利用了web流ReadableStreamWriteableStream)和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:fsnode: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%的吞吐量增长,同时在尾部延迟和内存效率方面也取得了显著的改进。

在裸机8核,64GB RAM,Intel Xeon E-2378G上运行,使用wrk -d 10s进行测试

这些进步不仅限于Deno特定的项目;它们扩展到使用node:http模块的模块和应用,得益于Deno.serve的基础架构。

这些性能增益的一个关键因素是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模式允许更精确地控制各种操作中的文件和目录的包含或排除,例如格式化、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,使其更易于使用和性能更强大。

在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 更好的兼容性,通过 提供迁移指南 来确保平稳过渡。除了改进的运行时之外,我们还将就项目的依赖项管理和优化进行一些令人兴奋的公告。请在未来几周关注更详细的路线图。如果您想要提前了解,可以点击这里

相关推荐
ZZZCY200312 分钟前
路由策略与路由控制实验
前端·网络
shawya_void20 分钟前
javaweb-day01-html和css初识
前端·css·html
khatung21 分钟前
React——useReducer
前端·javascript·vscode·react.js·前端框架·1024程序员节
思考的橙子23 分钟前
CSS之3D转换
前端·css·3d
木子七1 小时前
vue3-setup中使用响应式
前端·vue
廖子默1 小时前
提供html2canvas+jsPDF将HTML页面以A4纸方式导出为PDF后,内容分页时存在截断的解决思路
前端·pdf·html
Moment1 小时前
毕业半年,终于拥有了两个近 500 star 的开源项目了 🤭🤭🤭
前端·后端·开源
光影少年1 小时前
react和vue图片懒加载及实现原理
前端·vue.js·react.js
AndyGoWei2 小时前
react react-router-dom history 实现原理,看这篇就够了
前端·javascript·react.js