推出Deno 2啦
(最初发布于deno.com/blog)_
互联网是人类最大的软件平台——为它开发意味着可能触及超过50亿人。但随着近年来 web 开发迅速发展,它变得越来越复杂,难以管理。在写下任何一行代码之前,开发人员必须处理繁琐的配置,同时还要处理不必要的样板代码,他们更愿意专注于产品的交付和为用户提供价值。
尽管存在这些复杂性,作为网页编程语言的 JavaScript 仍然在过去十年里一直是最受欢迎的编程语言,并且 TypeScript 的使用迅速崛起,排名升至第三。这表明了 JavaScript 在 web 开发中的普及和实用性——也说明 JavaScript 不会很快退出舞台。
观看我们的公告视频,里面有关于团队的问答环节。
为了简化 web 开发,我们创建了 Deno,这是一个现代、零配置的全栈工具链,专用于 JavaScript 和 TypeScript 的开发工作。
- 原生 TypeScript 支持
- 构建于 web 标准之上:Promise、fetch 和 ES 模块 (ESM)
- 功能齐全:内置了格式化工具、代码检查、类型检查、测试框架,甚至可以编译为可执行文件等
- 默认安全,就像浏览器一样
今天,数以十万计的开发者喜欢使用 Deno,仓库 [1] 成为 GitHub 上最受关注的 Rust 项目之一 之一,仅次于 Rust 语言项目本身。
在 Deno 1 中我们已经取得了很大的进展,但下一个主要版本将专注于大规模使用 Deno。这意味着 Deno 可以与现有的 JavaScript 基础设施无缝集成,并支持各类项目和开发团队。这一切都不会影响 Deno 用户所钟爱的简单性、安全性以及“开箱即用”的特性。
今天,我们激动地宣布一下 Deno 2,它包括:
- 与 Node.js 和 npm 兼容,使您能够无缝运行现有的 Node 应用程序
- 原生支持
package.json
和node_modules
- 新的包管理命令包括
deno install
、deno add
和deno remove
- 稳定的标准库支持
- 支持私有 npm 注册表
- 工作区和单仓库支持
- 发布长期支持(LTS)版本
- JSR:一个现代的注册表,用于跨运行时共享 JavaScript 库
我们也在不断改进 Deno 的许多现有功能。
deno fmt
现在可以格式化 HTML、CSS 和 YAMLdeno lint
现在支持 Node 特定规则和快速修复deno test
现在支持运行使用node:test
编写的测试deno task
现在可以运行package.json
脚本deno doc
的 HTML 输出现在具有改进的设计和更好的搜索功能deno compile
现在支持 Windows 上的代码签名和图标deno serve
现在可以在多个核心上并行运行 HTTP 服务器deno init
现在可以搭建库或服务器deno jupyter
现在可以输出图像、图表和 HTMLdeno bench
现在支持关键部分以进行更精确的测量deno coverage
现在可以输出 HTML 格式的报告
Deno 2 向后兼容 Node 和 npm。这不仅允许你在现有的 Node 项目中运行 Deno,还可以让你逐步采用 Deno 的全套工具。例如,你可以在克隆一个 Node 项目后使用 deno install
快速安装依赖,或者运行 deno fmt
来格式化代码而无需额外安装 Prettier。
Deno 2与Node和npm的兼容性非常强,Deno 2支持package.json
,node_modules
文件夹,甚至npm工作区,允许你在任何使用ESM的Node项目中运行Deno代码,并且如果有小的语法调整需要,你可以使用deno lint --fix
命令来自动修复。
不喜欢 package.json
和 node_modules
目录带来的杂乱,但仍然需要使用某个 npm 包,但仍然需要使用它?你可以直接使用 npm:
指定符来导入 npm 包。无需 package.json
和 node_modules
文件夹,Deno 会把你的包安装到全局缓存里。这样你就可以用 npm 依赖来编写程序在一个文件中——无需依赖清单、配置文件,也不需要 node_modules
。
import chalk from "npm:chalk@5.3.0";
console.log(chalk.blue("你好,世界!"));
// 你好,世界!(显示为蓝色)
对于较大的项目,依赖清单使得依赖管理变得简单。例如,在 deno.json
文件的导入映射中放置一个 npm:
标识符,可以直接使用包名导入包。
// deno.json
{
"引入": {
"chalk": "npm:chalk@5.3.0"
}
}
import chalk from "chalk";
console.log(chalk.blue("你好,世界!"));
// 显示为蓝色的问候语:你好,世界!
通过使用 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.json
和 node_modules
文件夹,它还自带三个实用的命令,能帮助你轻松搞定依赖项。
deno install
以闪电般的速度安装你的依赖项。如果有 package.json
,它会瞬间创建一个 node_modules
文件夹来存放依赖项。如果没有 package.json
,它会将所有依赖缓存到全局缓存。
deno install
在冷启动时(冷缓存)比 npm 快 15%,在热启动时(热缓存)快 90%。我们已经非常快,在未来几周内,特别是在冷启动的情况下,我们预计会有更多改进。
deno add
和 deno remove
可以用于向你的 package.json
或 deno.json
添加或移除包。如果你之前用过 npm install
或 npm remove
,这些命令会感觉很熟悉。
今年早些时候,我们推出了一款名为JSR(现代、开源的JavaScript注册库)的产品。
它本机支持 TypeScript(您可以将模块作为 TypeScript 源代码发布),处理多个运行时和环境下的模块加载问题,只支持 ESM,从 JSDoc 风格的注释中自动生成文档,并且还可以与类似 npm 和 npx 的系统配合使用(是的,JSR 将 TypeScript 转换为 .js
和 .d.ts
文件)。
因为你将 TypeScript 上传到 JSR,它对正在发布的代码有非常透彻的理解。这使我们能够为发布和消费模块提供无缝的开发体验。如果你想了解更多细节,可以阅读我们关于如何架构 JSR的文章。
标准库现在已稳定下来虽然在 npm 上有超过 200 万个模块可用,搜索、评估和使用新模块的过程可能会耗时,因此我们已经花了超过 4 年的时间来构建 Deno 标准库。
标准库包含数十个经过严格审查的实用模块,涵盖了数据操作、Web 逻辑、JavaScript 特定功能等各个方面。可在 JSR 上下载和使用,并可以被其他运行时和环境使用。
以下是Deno标准库中一些模块及其在npm中的对应模块的示例,展示了Deno标准库中有哪些类型的模块:
要查看所有可用的包列表,访问 https://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 也支持工作区,这是一个很好的单仓库管理工具。 只需在 deno.json
文件中添加 workspace
属性来列出子目录:
// deno.json 配置文件
{
"workspace": ["./add", "./subtract"]
}
这些成员可以有自己的依赖项、代码规范检查和格式化配置等。
Deno 不仅支持 Deno 包的工作区,还支持 npm workspaces。这意味着你可以创建一个混合的 Deno-npm 单一仓库(参见此示例),工作区中的项目可以拥有 package.json 或 deno.json 文件。
这个示例单存储库包含npm和Deno项目的混合,
你也可以通过运行 deno publish
命令将工作区成员发布到 JSR(例如,参见Deno 标准库)。无需手动决定发布顺序——只需运行 deno publish
,它会自动处理所有发布步骤。
通常,在大型公司中工作的开发团队需要在将新版本投入生产前仔细审核。面对 Deno 每周的修复版本以及每六周一次的小版本更新,这可能会变得耗时。因此,我们推出了一个长期维护(LTS)版本通道,此举旨在帮助这些团队。
从 Deno 2.1 开始,长期支持渠道将接收针对六个月的关键错误修复,确保一个稳定可靠的生产基础环境。六个月后,将根据最新稳定版本创建一个新的长期支持分支。所有长期支持版本都是免费提供,并且采用 MIT 许可证,使得任何需要更稳定和安全环境的团队都可以轻松访问。
从 Deno 2.1 开始,我们将引入一个 LTS(长期支持)分支,并为该分支维护并回退关键错误修复,为期六个月。
最后,对于需要高级支持的团队,我们推出了Deno企业版Deno for Enterprise。它提供了优先支持、直接与我们的工程师交流、保证的响应时间以及优先处理您的功能请求。我们与Netlify、Slack和Deco.cx等公司合作,帮助他们的工程师更快地推进工作,从而为用户提供更多价值。
Deno 很快!我们竭尽全力让Deno在各种实际场景中运行得更快。我们的重点是提供对日常JavaScript和TypeScript开发真正有用的性能改进——无论是启动速度、处理复杂的请求,还是整体的运行效率。
虽然基准测试永远无法全面反映情况,但它们可以提供有关运行时的优势所在。这里有一些基准测试结果,展示了 Deno 的强项,展示了 Deno 能为开发人员和生产环境提供一流的性能。
请参阅每个图表下的链接,以了解更多信息和可重复步骤。
修正: 上面显示的第一个 HTTP 基准测试是使用 Deno 1.45 进行的,而不是 Deno 2.0。实际上,Deno 2.0 比这里显示的结果慢大约 20%。这一差异是因为我们最近禁用了 V8 指针压缩,以解决用户超过 4GB 堆限制的问题。我们很快会重新启用指针压缩,这对大多数用户而言是最理想的选择,同时也会为有更大内存需求的用户推出 deno64
版本。
虽然 Deno 可以运行 Node 程序,但它旨在推动 JavaScript 和 TypeScript 的发展。Deno 提供了 Node 没有的功能,例如内建的 TypeScript 支持、Web 标准 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 SDK 这样的工具,从头重写是不切实际的。
但 Deno 的目标并不是成为 Rust 中的 Node 克隆或直接替代品。我们的目标是提升 JavaScript,超越 2010 年代的 CommonJS 时代,缩小服务器端与浏览器环境之间的差距,让开发者可以实际采用。我们拒绝接受 JavaScript 必须陷入工具不匹配和技术层叠的困境,无法继续进化。
Deno 的原始愿景仍然贯穿于我们所做的每一件事中。这包括对 TypeScript 的原生支持、内置的 web 标准如 Promises、顶层的异步等待、Wasm、fetch 和 ES 模块,以及一个内置的工具链——所有这些特性都集成在一个无依赖的单一可执行文件中。当然,它也像 web 一样,默认情况下是安全的。
支持 npm 只是使 Deno 更加多功能的一个步骤。我们的使命是提供一个现代且简洁的工具链,以增强 JavaScript 的体验——而不仅仅是支持旧代码。尽管我们已经调整了方式,但我们的愿景始终如一:简化并增强 web 开发的过程。
我喜欢 Deno 是因为它不需要任何配置文件,但有了新的包管理器,Deno 2 是否也越来越像 Node,也需要一个 package.json 来添加依赖?一点也不。您还是可以运行单个文件的程序或脚本,完全不需要配置或依赖项清单——这方面没有变化。新的包管理命令(deno install
,deno add
和 deno remove
)是可选的工具,旨在简化依赖项的管理,无论你是否使用 deno.json
或 package.json
文件。这些命令特别适合大型复杂项目,但如果你更喜欢保持简单,不需要配置,它们也不会妨碍你。
我们的核心目标之一是,Deno 可以简化为简单的单文件程序,这些程序可以在不增加额外步骤或复杂性的情况下导入任何包。比如,在使用 Jupyter 笔记本或编写快速脚本时,这样的操作非常简单。
import * as Plot from "npm:@observablehq/plot"; // 从npm包@observablehq/plot中导入Plot
同时,Deno 能够处理包含多个文件甚至多个包的大项目,如单代码库(monorepos)中的情况。这种灵活性使得 Deno 无论是小型脚本还是大型生产级应用程序都能胜任。
我在用Fresh项目。如果我升级到Deno 2版本,会带来什么影响吗?不行哦!你的Fresh项目应该可以直接在Deno 2上运行——不需要做任何调整。
我什么时候可以期待 Deno 2 在 Deno Deploy 上发布?马上!
下一步是
Deno 2 保留了开发人员喜爱的所有功能,例如零配置的一站式工具链支持 JavaScript 和 TypeScript 开发,并且支持 Web 标准 API,默认安全。它完全向后兼容 Node 和 npm(在 ESM 环境下)。这不仅使在任何 Node 项目中运行 Deno 变得简单,还允许在更大的复杂项目中逐步引入 Deno(比如使用 deno fmt
或 deno lint
)。除了改进的包管理和 JSR,以及一系列针对更高级开发团队的功能特性,Deno 现在准备简化并加速您的开发今天。
然而,由于 Deno 的强大功能,我们无法在一个博客文章和视频中涵盖所有内容。有许多有趣的功能和应用场景我们没有提到。例如,使用 [deno compile](https://docs.deno.com/runtime/reference/cli/compiler/)
将一个 JavaScript 游戏编译成带有跨编译支持(是的,包括 Windows)的桌面可执行文件。或者 Deno 的 Jupyter notebook 支持,它不仅允许你在 TypeScript 中探索和可视化数据,还支持 @observable/plot。或者通过 [deno doc](https://docs.deno.com/runtime/reference/cli/documentation_generator/)
从你的 JSDoc 注释和源代码生成文档或静态网站。
我们邀请您今天就试试 Deno 2 吧,体验 JavaScript 和 TypeScript 开发的未来之路。现在就开始使用 Deno 2:
# 命令保持原样
快来加入我们,一起携手创造 JavaScript 的美好未来吧!
共同学习,写下你的评论
评论加载中...
作者其他优质文章