likes
comments
collection
share

Deno 2 发布,貌似与 Voidzero 有业务上的重叠Deno 2 发布,其内置格式化程序、linter、类型检查

作者站长头像
站长
· 阅读数 115

Deno 2 发布

Deno 2 发布,貌似与 Voidzero 有业务上的重叠Deno 2 发布,其内置格式化程序、linter、类型检查 JavaScript语言,在过去十年中仍然是最受欢迎的语言,TypeScript 迅速崛起成为第三大语言。这证明了 JavaScript 在网络开发中的普遍性和有用性——也是一个迹象表明 JavaScript 不会消失。

为了简化网络编程,我们创建了 Deno:一个现代的、一体化的、零配置的工具链,用于 JavaScript 和 TypeScript 开发。

  • 原生支持 TypeScript
  • 基于网络标准:Promises、fetch 和 ES Modules
  • 高度集成:内置格式化程序、linter、类型检查、测试框架、编译为可执行文件等等
  • 默认安全,就像浏览器一样

今天,成千上万的开发者喜欢使用 Deno,仓库成为 GitHub 上第二受欢迎的 Rust 项目,仅次于 Rust 语言本身。

虽然我们在 Deno 1 中取得了很多成就,下一个主要版本专注于大规模使用 Deno。这意味着与遗留 JavaScript 基础设施的无缝互操作性,以及对更广泛的项目和开发团队的支持。所有这些都不会牺牲 Deno 用户所喜爱的简单性、安全性和“一应俱全”的特性。

今天,我们很高兴宣布 Deno 2,它包括:

  • 与 Node.js 和 npm 兼容性,允许您无缝运行现有的 Node 应用程序

  • 原生支持 package.jsonnode_modules

  • 通过新的 deno installdeno adddeno remove 命令进行包管理

  • 稳定的标准库

  • 支持私有 npm registries

  • 支持 workspaces 和 monorepo

  • 发布长期支持版(LTS)

  • JSR:一个用于跨运行时共享 JavaScript 库的现代注册表

  • 我们还在不断改进许多现有的 Deno 特性:

  • deno fmt 现在可以格式化 HTML、CSS 和 YAML

  • deno lint 有 Node 特定规则和快速修复

  • deno test 支持使用 node:test 编写的测试

  • deno task 可以运行 package.json 脚本

  • deno doc 的 HTML 输出设计改进,搜索更好

  • deno compile 支持在 Windows 上的代码签名和图标

  • deno serve 在多个核心上并行运行 HTTP 服务器

  • deno init 可以为库或服务器搭建脚手架

  • deno jupyter 支持输出图像、图表和 HTML

  • deno bench 关键部分以进行更精确的测量

  • deno coverage 可以以 HTML 格式输出报告

兼容 Node 和 npm,但着眼未来

Deno 2 与 Node 和 npm 兼容。这使您不仅可以在当前的 Node 项目中运行 Deno,还可以逐步采用 Deno 的一体化工具链。例如,您可以在克隆 Node 项目后使用 deno install 以闪电般的速度安装您的依赖项,或者运行 deno fmt 来格式化代码,而无需 Prettier。

Deno 2 与 Node 和 npm 的兼容性非常强大。Deno 2 可以读取 package.jsonnode_modules 文件夹,甚至 npm 工作区,允许您使用 ESM 在任何 Node 项目中运行 Deno。如果需要进行少量的语法调整,您可以使用 deno lint --fix 来修复它们。

假如不喜欢 package.jsonnode_modules 目录的混乱,但仍然需要使用 npm 包?您可以直接使用 npm: 标识符导入 npm 包。没有 package.jsonnode_modules 文件夹,Deno 将把您的包安装在全局缓存中。这使您可以编写带有 npm 依赖项的单文件程序——无需依赖项清单、配置文件或 node_modules

import chalk from "npm:chalk@5.3.0";

console.log(chalk.blue("Hello, world!"));
// 蓝色输出:Hello, world!

对于更大的项目,依赖项清单可以简化依赖项的管理。在 deno.json 文件中将 npm: 标识符放入导入映射中,允许导入包的裸名称:

// deno.json
{
  "imports": {
    "chalk": "npm:chalk@5.3.0"
  }
}
import chalk from "chalk";

console.log(chalk.blue("Hello, world!"));
// 蓝色输出:Hello, world!

有了通过 npm: 标识符导入 npm 包的能力,您可以在 Deno 中访问超过200万个 npm 模块。这甚至包括像 gRPC、ssh2、Prisma、temporal.io、duckdb、polars 这样的复杂包。Deno 甚至支持高级功能,如 Node-API 本地插件。

最后,您可以使用 Deno 2 和您喜欢的 JavaScript 框架一起使用。Deno 2 支持 Next.js、Astro、Remix、Angular、SvelteKit、QwikCity 等许多框架。

Deno 现在是一个带有 deno install 的包管理器

Deno 2 不仅支持 package.jsonnode_modules 文件夹,它还带来了三个重要的子命令,使您可以轻松安装和管理您的依赖项。

deno install 以闪电般的速度安装您的依赖项。如果您有 package.json,它会在眨眼之间创建一个 node_modules 文件夹。如果您不使用 package.json,它将把所有依赖项缓存到全局缓存中。

deno install 比 npm 快 15%,缓存冷启动时,比热缓存快 90%。我们已经非常快了,但预计在未来几周内,特别是在缓存冷启动场景中,会有更多改进。

Deno 2 发布,貌似与 Voidzero 有业务上的重叠Deno 2 发布,其内置格式化程序、linter、类型检查

deno adddeno remove 可以用来向 package.jsondeno.json 中添加和移除包。如果您之前使用过 npm installnpm remove,这些将会非常熟悉。

Deno 2 发布,貌似与 Voidzero 有业务上的重叠Deno 2 发布,其内置格式化程序、linter、类型检查

Deno 2 发布,貌似与 Voidzero 有业务上的重叠Deno 2 发布,其内置格式化程序、linter、类型检查

JavaScript Registry

今年早些时候,我们引入了一个名为 JSR 的现代、开源的 JavaScript Registry。

它原生支持 TypeScript(您可以将模块作为 TypeScript 源代码发布),处理多个运行时和环境的模块加载复杂性,只允许 ESM,自动从 JSDoc 风格的注释生成文档,并且可以与 npm 和 npx 类似的系统一起使用(是的,JSR 将 TypeScript 转换为 .js.d.ts 文件)。

因为您上传 TypeScript 到 JSR,它对正在发布的代码有着出色的理解。这使我们能够为发布和消费模块提供无缝的开发者体验。如果您对细节感兴趣,可以阅读我们关于如何构建 JSR 的文章。

标准库现在稳定了

虽然 npm 上有超过200万个模块可用,但搜索、评估和使用一个新模块的过程可能是耗时的。这就是为什么我们在过去 4 年中一直在构建 Deno 标准库。

标准库由几十个经过严格审计的实用程序模块组成,涵盖从数据操作、网络相关逻辑、JavaScript 特定功能等一切。它在 JSR 上可用,并且可以被其他运行时和环境使用。

为了让您了解 Deno 标准库中有哪些类型的模块可用,这里是标准库模块的部分列表及其在 npm 中的等效模块:

Deno 标准库模块npm 包
@std/testingjest
@std/expectchai
@std/climinimist
@std/collectionslodash
@std/fmtchalk
@std/netget-port
@std/encodingrfc4648

有关可用包的完整列表,请访问 jsr.io/@std。

私有 npm 注册表

Deno 2 中的私有 npm 注册表与 Node 和 npm 中的工作方式相同,使用 .npmrc 文件:

// .npmrc
@mycompany:registry=http://mycompany.com:8111/
//mycompany.com:8111/:_auth=secretToken

Deno 将自动获取此 .npmrc 文件,并允许您在没有任何额外配置的情况下拉取私有包。

工作区和单体仓库

Deno 2 还支持 workspaces,这是管理 monorepos 的强大解决方案。只需在您的 deno.json 中使用工作区属性列出成员目录:

// deno.json
{
  "workspace": ["./add", "./subtract"]
}

这些成员可以有不同的依赖项、linter 和格式化程序配置等。

Deno 不仅支持 Deno 包的工作区,它还理解 npm 工作区。这意味着您可以创建一个混合的 Deno-npm 单体仓库(参见此示例),工作区成员可以有 package.json 或 deno.json:

Deno 2 发布,貌似与 Voidzero 有业务上的重叠Deno 2 发布,其内置格式化程序、linter、类型检查

您也可以通过运行 deno publish 发布工作区成员到 JSR。有关示例,请参考 Deno 标准库。不需要手动弄清楚您需要以什么顺序发布您的包——只需运行 deno publish,它将为您完成所有操作。

LTS

通常,大型组织的开发团队需要在将新版本用于生产之前仔细审计。有了 Deno 的每周错误修复发布和每周 6 个次要版本,这可能变得耗时。为了使这些团队更容易,我们引入了一个长期支持 (LTS) 发布渠道

从 Deno 2.1 开始,LTS 频道将获得六个月的关键错误修复回溯,确保生产使用的稳定和可靠基础。六个月后,将基于最新稳定版本创建一个新的 LTS 分支。所有 LTS 版本都是免费提供和 MIT 许可的,使任何需要更稳定和安全环境的团队都可以使用。

从 Deno 2.1 开始,我们将引入一个 LTS 分支,我们将维护它,并为六个月的关键错误修复进行回溯。

Deno 2 发布,貌似与 Voidzero 有业务上的重叠Deno 2 发布,其内置格式化程序、linter、类型检查

最后,对于需要高级支持的团队,我们引入了 Deno for Enterprise 计划。它提供优先支持、直接访问我们的工程师、保证响应时间,以及您的功能请求的优先级。我们已经与 Netlify、Slack 和 Deco.cx 等公司合作,帮助他们的工程师更快地行动,并向他们的用户提供更多的价值。

Deno 很快!

我们投入了巨大的努力使 Deno 在广泛的现实世界场景中快速——我们的重点是提供真正重要的性能改进,无论是启动时间、处理复杂请求还是整体效率。

虽然基准测试永远无法讲述完整的故事,但它们可以提供运行时在何处表现出色的洞察。以下是一些展示 Deno 优势的基准测试,展示了它为开发者和生产环境提供一流性能的能力。

有关更多详细信息和可重现步骤,请参阅每个图表下方的链接。

Deno 2 发布,貌似与 Voidzero 有业务上的重叠Deno 2 发布,其内置格式化程序、linter、类型检查

更正:上面显示的第一个 HTTP 基准测试是使用 Deno 1.45 进行的,而不是 Deno 2.0。实际上,Deno 2.0 比这里显示的慢大约 20%。这个差异是由于我们最近禁用了 V8 指针压缩以解决用户超过 4GB 堆限制的情况。我们计划很快重新启用指针压缩,因为它是大多数用户的理想默认设置,并为需要更大堆的用户引入 deno64 构建。

常见问题解答

如果 Deno 与 Node 完全向后兼容,为什么我应该使用 Deno 而不是 Node?

虽然 Deno 可以运行 Node 程序,但它旨在推动 JavaScript 和 TypeScript 前进。Deno 提供了 Node 所缺乏的功能,例如原生 TypeScript 支持、网络标准 API、完整的 JavaScript 开发工具链,以及默认安全的执行模型——全部包含在一个没有外部依赖的可执行文件中。使用 Deno 而不是 Node 可以节省您在设置和配置上的时间,让您更快地开始编码和提供价值。

在运行 Node 程序时,Deno 的可选权限系统会生效吗?

是的,Deno 默认安全的执行模型适用于运行 Node 程序或导入 npm 模块,确保同样的安全水平。

为什么新的标志?可爱的小恐龙吉祥物怎么了?

从一开始,雨中的可爱蜥脚类恐龙一直是 Deno 的面孔。它的古怪魅力一直是 Deno 的标志,但设计从未一致——至少有两个“官方”版本和无数的变化。随着 Deno 2.0 的到来,我们决定是时候刷新了。

我们希望保持 Deno 用户喜爱的原始角色的本质,同时给它一个更精致的外观,以匹配 Deno 专业和生产级的本质。在重新设计过程中,我们意识到雨景背景虽然怀旧,但并不缩放良好,经常被忽视。它太忙了,特别是在小尺寸时,所以我们不得不放手。

经过多次迭代,我们发现将设计简化为其核心元素,找到了正确的平衡——简单友好,但严肃可靠——就像 Deno 一样。

(别担心,可爱的小恐龙仍然在这里!)

Deno 以现代化 JavaScript 的雄心壮志开始。但是,在所有的向后兼容性工作上,Deno 最初的愿景还剩下什么?

重写整个 JavaScript 生态系统是不切实际的。随着 Deno 超越小型程序,我们认识到支持 Node 和 npm 兼容性是必不可少的——特别是对于像 gRPC 和 AWS SDKs 这样的工具,从头开始重写是不切实际的。

但 Deno 的目标不是成为 Rust 中的 Node 克隆或替代品。我们的目标是提升 JavaScript,超越 2010 年代的 CommonJS,缩小服务器端和浏览器环境之间的差距,使开发者可以实际采用。我们拒绝接受 JavaScript 必须是一堆不匹配的工具和无尽的转译层次,无法进化。

Deno 的最初愿景仍然是我们所做的一切的核心。这包括原生 TypeScript 支持、内置网络标准,如 Promises、顶级 await、Wasm、fetch 和 ES Modules,以及一应俱全的工具链——全部打包在一个免费的依赖可执行文件中。当然,它默认是安全的,就像网络一样。

支持 npm 只是使 Deno 更多功能化的一步。我们的使命是提供一个现代的、简化的工具链,增强 JavaScript 体验——不仅仅是支持遗留代码。虽然我们已经调整了我们的方法,但我们的愿景保持不变:简化和增强网络开发。

我喜欢 Deno,因为它不需要任何配置文件,但是随着新的包管理器的增加,Deno 2 变得像 Node 一样,需要 package.json 来添加依赖项吗?

一点也不。您仍然可以运行单文件程序或脚本,而不需要任何配置或依赖项清单——那里没有什么变化。新的包管理命令(deno installdeno adddeno remove)是可选的工具,旨在简化依赖项管理,无论您使用 deno.json 或 package.json 文件。它们特别适合更大、更复杂的项目,但如果您更喜欢无配置的简单性,它们也不会碍事。

我们的核心目标之一是,Deno 可以扩展到简单的单文件程序,可以导入任何包而不需要额外的仪式。例如,在像 Jupyter 笔记本或快速脚本的上下文中,您可以轻松地做到:

import * as Plot from "npm:@observablehq/plot";

同时,Deno 可以扩展到处理具有多个文件甚至多个包的大型项目,如单体仓库。这种灵活性确保了 Deno 对小型脚本和大型生产级应用程序同样有效。

我有一个 Fresh 项目。如果升级到 Deno 2,会有破坏性变更吗?

不!您的 Fresh 项目应该可以开箱即用 Deno 2——无需更改。

Deno 2 什么时候可以登陆 Deno Deploy?

任何时候!

下一步计划

Deno 2 采取了开发者喜欢的所有 Deno 1.x 功能——零配置、一体化的 JavaScript 和 TypeScript 开发工具链、网络标准 API 支持、默认安全——并使其与 Node 和 npm (在 ESM 中) 完全向后兼容。这不仅使在任何 Node 项目中运行 Deno 变得简单,而且还允许在更大、更复杂的项目中逐步采用 Deno(例如运行 deno fmtdeno lint)。随着改进的包管理、JSR 和一系列针对更高级开发团队的功能,Deno 已准备好今天简化和加速您的开发。

然而,鉴于 Deno 的巨大能力,我们无法在单个博客文章和视频中涵盖所有内容。有许多令人兴奋的功能和用例我们没有触及。例如,可以使用 deno compile 将 JavaScript 游戏转换为桌面可执行文件,并支持交叉编译(是的,Windows)。或者 Deno 的 Jupyter 笔记本支持,允许您在 TypeScript 和 @observable/plot 中探索和可视化数据。或者使用 deno doc 从您的 JSDoc 注释和源代码生成文档或静态文档站点。

Deno 2 发布,貌似与 Voidzero 有业务上的重叠Deno 2 发布,其内置格式化程序、linter、类型检查

转载自:https://juejin.cn/post/7424335565121339432
评论
请登录