看看 Deno 官方博客,Deno 官方年度总结

大家好,这里是大家的林语冰。

本期共享的是 —— Deno 官方的年度自我回顾,快速浏览过去一年里 Deno 的所有重量级更新。

看看 Deno 官方博客,Deno 官方年度总结

免责声明

本文属于是语冰的直男翻译了属于是,略有删改,仅供粉丝参考。英文原味版请传送 Deno in 2023

2023 年,Deno 在 Node/npm 兼容性和性能方面原地起飞,同时朝着简化 Web 开发的目标迈进。以下是 Deno 2023 重大变化的摘要:

  • Deno 现在可以理解 package.json 文件,且能够使用 node: 说明符直接导入内置 Node 模块,比如 node:fs 等。
  • 新型 Web 服务器 API Deno.serve 已稳定,HTTP 吞吐量在一年内暴涨了约 73%。
  • deno compile 直接支持 worker、动态导入和 npm 模块。
  • Deno 在整个 API 中更好地利用了 web streams,包括 ReadableStream 等,以及 AbortController,缩小浏览器和服务端编程的差异。
  • Deno 的配置文件 deno.json 现在兼作导入映射。我们拍扁了模式,添加了 glob 支持,以及一个有用的顶层 "exclude" 属性 —— 这些都允许对 Deno 的执行方式简洁调整。
  • 开源笔记本工具 Jupyter 使用 Deno 支持 JS/TS
  • 经过近一年的开发,WebGPU 终于被添加到 Deno 中。
  • Deno 的零配置 TS 获得更好的编辑器集成,并对 LSP 和 VS Code 集成重大改进。
  • Deno 原生 Web 框架 Fresh 通过适当的 Tailwind 支持、Partials 和布局文件增强了功能。
  • Deno Deploy 通过全球分布式原语变得更加强大:Deno KV、队列、Cron
  • 我们为希望部署和执行不受信任的多租户 JS 的平台发布了自助服务 Subhosting。

增强与 Node 和 npm 的兼容性

作为生态系统和谐的重大举措,Deno 在 2023 年通过合并内置 Node 模块扩展了其功能,比如 node:fs 等,这可通过 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 服务器创建,允许开发者使用最少的代码启动服务器:

Deno.serve(req => new Response('前端猫猫教'))

这个强化功能是我们不断致力于简化开发流程、并减少对大量样板代码的需求的一部分。Deno.serve() 函数体现了这一理念,实现高效、简洁的服务器设置。

通过核心库和事件循环机制的针对性优化,性能巨幅提升。在使用基本 “Hello, world” 服务器设置的基准测试中,Deno 的 HTTP 吞吐量显著增长,自 2023 年底以来几乎翻了一番。与类似的 Node 服务器相比,Deno 现在的吞吐量暴涨了约 61%,同时尾部延迟和内存效率显著增强。

看看 Deno 官方博客,Deno 官方年度总结

这些进步不仅限于 Deno 特定项目;由于 Deno.serve 的底层架构,它们扩展到利用 node:http 模块的模块和 App。

这些性能提升的一个关键因素是 Deno 的 HTTP 接口与 HyperReqwest 库集成的改进。这种集成最大限度地减少了 Deno 运行时不同层之间不必要的数据分配和重复。

此外,我们还优化了 Deno 事件循环,负责管理异步操作和资源监控,减少开销并提高运行时的整体效率。这些集体改进强调了我们致力于为 Web 开发提供强大、高性能的环境。

更灵活的 deno.json

在 Deno,我们坚持零配置编程的原则,特别重视单文件程序的简单性,即使对于那些用 TS 编写的程序也是如此。意识到大型项目通常需要更复杂的设置,我们不断改进可选的 deno.json 配置文件,满足这些复杂的需求,同时又不牺牲易用性:

  • 简化的配置:我们将 deno.json 转换为导入映射,有效减少了对单独配置文件的需求,并简化了项目设置。
  • 增强的格式选项deno fmt 现在支持分号,在代码样式方面提供更大的灵活性,从而适应不同的开发者偏好。
  • Node 和 npm 兼容性:与 package.json 集成增强了兼容性,使项目更容易在 Node 和 Deno 环境之间转换。
  • 简化的配置结构:我们拍扁了 deno.json 的结构,使开发者更直观、更容易导航。
  • Glob 支持:在 deno.json 中引入 glob 模式可以更精准地控制各种操作中包含或排除的文件和目录,比如格式化、linting 和测试。

这些强化功能是我们持续承诺的一部分,我们致力于使 Deno 不仅适用于大型 App,而且功能强大、用途广泛,而且对于小型项目而言也简单易用。

LSP 赋能更丝滑的开发体验

Deno 的 LSP(语言服务器协议)集成提升了编辑器和 IDE 中的开发体验,提供了强大的功能,比如精确的转到定义、全面的 IntelliSense、以及 TS 项目的无缝代码格式化。今年,我们投入了大量精力来增强 LSP,使 Deno 中的编码更丝滑和直观:

  • 扩展自动完成:现在包括对 npm:node: 说明符的支持,简化了 Deno 中 Node 模块的使用。
  • VSCode 扩展激活:现在,当在项目中检测到 deno.json 文件时,Deno VSCode 扩展会自动触发,确保立即访问 Deno 的强大工具。
  • 智能导入管理:TS/JS 文件中的导入现在会在文件重命名时自动更新,从而保持代码一致性,并减少手动重构。
  • 高效的文档预加载:确保“查找引用”等功能在项目中的所有文件中无缝运行,从而增强代码导航和理解。

要充分利用这些改进,请尝试 Visual Studio Code 的 Deno 扩展,该扩展旨在将这些强化功能直接集成到大家的开发工作流程中。

WebGPU

Deno 现在集成了 WebGPU,这是一项尖端技术,使开发者能够通过 JS 直接利用 GPU 硬件的强大功能。这种高性能、低级接口专为各种 App 而设计,从图形渲染到数据分析和机器学习,所有这些都在熟悉的 Web 标准 JS 环境中进行。

经过一年的专注开发,WebGPU 可以在 Deno 中通过 --unstable-webgpu 标志访问,这标志着扩展 Deno App 功能的一个重要里程碑。对于那些希望在需要大量计算能力的领域突破 JS 可能性界限的开发者而言,此功能未来可期。

我们还积极开发功能,使 WebGPU 能够在本机 GUI 窗口中进行渲染,进一步拓宽 Deno 开发者的潜在用例。

Jupyter 笔记本

开源笔记本工具 Jupyter 使用 Deno 添加了对 JS/TS 的支持。这意味着,数据科学、可视化等都可以使用现代 JS、TS 和 Web 标准 API 来完成。

以下是使用 fetch 抓取数据,并使用 observablehq/plot 进行可视化的示例:

看看 Deno 官方博客,Deno 官方年度总结

Jupyter 支持还支持使用 JS/TS 构建生成式 AI/ML 模型,因为吴恩达和 DeepLearning.AI 联手开发了一个 AIGC 课程,用于使用 Deno 的 LangChain.js 构建 LLM App。

著名的开源 rust crates

Deno 涉及广泛的开源项目,我们扩展 Deno 的功能集并优化性能。今年,我们发布了若干 Rust 包,开发者可能会发现这些包独立于 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 实用程序 cross-env 的更高级版本。

Fresh

我们继续打磨 Fresh,这是一个 Deno 的现代全栈 Web 框架,默认情况下发送零客户端 JS,更易用且性能爆表。

  • 我们添加了对 _layout 文件的支持,这允许跨路由共享组件,提高了使用路由组组织代码的灵活性,并通过引入异步路由组件,删除了将数据从路由处理程序传递到组件的样板。我们还改进了编辑器中的 linting 规则和错误消息,并简化了测试。
  • Island 是 Fresh 设计的核心,也获得了大量新功能,使其更加强大,可以处理更广泛的用例。我们扩大了可以传递到 island props 的数据类型,包括 Preact Signals、JSX、JSON 等。此外,Island 现在可以嵌套、组织在子目录中,并且其中许多可以从同一文件导出。
  • Fresh 的性能也有所提高,通过全新的提前编译步骤,缓存客户端资源,我们可以使用 GitHub Actions 而不是 GitHub Automatic 在 Deno Deploy 中启用此优化步骤,通过引入 Partials 实现更快速的客户端导航,以及改进的 Island 打包策略。
  • 我们改进了 Fresh 插件系统,能够添加 Island、中间件和路线。一个显著的胜利是将 TwindCSS 迁移到 TailwindCSS,它得到了积极的维护,并且性能得到了提升。Fresh 社区也元气满满,越来越多的项目要么是在 Fresh 中构建的,要么是为 Fresh 构建的库和插件。

扩大 Deno 的云业务

尽管我们已经介绍了开源项目的重大更新,但如果不提及商业方面的发展,那么 Deno 的整体情况是不完整的。

尽管 Deno Subhosting 为 Netlify 的边缘函数和 Deco.cx 客户的电子商务商店提供支持已经有一段时间了,但今年我们将其设为自助服务,以便任何人都可以通过我们的 Subhosting API 免费以编程方式部署和运行其用户的代码。它旨在安全地运行第三方、不受信任的代码,因为它是从零开始设计的,从而实现最大程度的租户隔离。

通过推出云原语:Deno KV、队列和 Cron,我们朝着从根本上简化 Web 开发的愿景迈出了一大步。它们直接构建到运行时中,因此我们无需处理 API 密钥或配置即可进行设置:

const kv = await Deno.openKv()

当我们使用 Deno Deploy 时,这些云原语无缝地成为全球分布式服务,从而优化我们的服务器和 App 的性能。

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

Deno 2

我们正在为 Deno 2 做足前戏,它将通过提供迁移指南,确保平稳过渡,从而提高与 Node 和 npm 的兼容性。

本期话题是 —— 你开始沉浸式体验 Deno 了吗,为什么?

欢迎在本文下方自由言论,文明共享。谢谢大家的点赞,掰掰~

《前端猫猫教》每日 9 点半更新,坚持阅读,自律打卡,每天一次,进步一点

看看 Deno 官方博客,Deno 官方年度总结

原文链接:https://juejin.cn/post/7345727329410383884 作者:前端猫猫教

(0)
上一篇 2024年3月14日 上午11:10
下一篇 2024年3月14日 下午4:00

相关推荐

发表回复

登录后才能评论