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

相关推荐
zhougl99637 分钟前
html处理Base文件流
linux·前端·html
花花鱼41 分钟前
node-modules-inspector 可视化node_modules
前端·javascript·vue.js
HBR666_44 分钟前
marked库(高效将 Markdown 转换为 HTML 的利器)
前端·markdown
careybobo2 小时前
海康摄像头通过Web插件进行预览播放和控制
前端
杉之4 小时前
常见前端GET请求以及对应的Spring后端接收接口写法
java·前端·后端·spring·vue
喝拿铁写前端4 小时前
字段聚类,到底有什么用?——从系统混乱到结构认知的第一步
前端
再学一点就睡4 小时前
大文件上传之切片上传以及开发全流程之前端篇
前端·javascript
木木黄木木5 小时前
html5炫酷图片悬停效果实现详解
前端·html·html5
请来次降维打击!!!5 小时前
优选算法系列(5.位运算)
java·前端·c++·算法
難釋懷6 小时前
JavaScript基础-移动端常见特效
开发语言·前端·javascript