2024.10.9日,Deno 2 正式发布,这是一个为现代 Web 开发而设计的一体化工具链,旨在简化 JavaScript 和 TypeScript 的开发流程。以下是 Deno 2 的一些亮点特性:
- 原生 TypeScript 支持:Deno 2 原生支持 TypeScript,无需额外配置。
- 基于 Web 标准构建:利用 Promises、fetch 和 ES 模块等 Web 标准,Deno 2 提供了现代的编程体验。
- 内置工具:包括格式化、linter、类型检查器、测试框架、编译执行等,Deno 2 提供了一套完整的开发工具。
- 默认安全:Deno 2 遵循浏览器的安全模型,确保了运行时的安全性。
Deno 2 的发布标志着 Deno 在大规模应用方面的进一步发展,它不仅提供了与传统 JavaScript 基础设施的无缝互操作性,还支持更广泛的项目和开发团队,同时保持了简单性、安全性和“包含电池”的特性。
Deno 2 的新特性包括:
- 向后兼容 Node.js 和 npm:允许无缝运行现有的 Node 应用程序。
- 对 package.json 和 node_modules 的原生支持:简化了依赖管理和项目配置。
- 新的包管理命令:通过 deno install、deno add 和 deno remove 命令简化了包管理。
- 稳定的标准库:提供了一套稳定的 API,方便开发者使用。
- 支持私有 npm 注册表:增强了对私有包和企业环境的支持。
- 工作区和 monorepo 支持:方便大型项目和多个项目的管理。
- 长期支持(LTS)版本:为企业级应用提供了稳定性和可预测性。
- JSR:一个现代化的注册表:用于跨运行时共享 JavaScript 库。
此外,Deno 2 还改进了许多现有功能:
- 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 格式输出覆盖率报告。
Deno 2 的发布,无疑为 JavaScript 和 TypeScript 开发者提供了一个更加强大和便捷的开发环境。
Deno 2 的发布带来了与 Node.js 和 npm 的向后兼容性,这一特性不仅允许开发者在现有的 Node 项目中无缝集成 Deno,还能逐步采用 Deno 提供的一体化工具链。以下是 Deno 2 的一些关键兼容性和前瞻性特性:
- 无缝集成:您可以在 Node 项目中直接运行 Deno,利用 deno install 和 deno fmt 等命令快速安装依赖和格式化代码,无需依赖 Prettier。
- 理解 Node 项目结构:Deno 2 能够理解 package.json 和 node_modules 文件夹,甚至支持 npm 工作区,允许您在任何 Node 项目中以 ESM 格式运行 Deno。
- 代码修复:如果存在需要调整的次要语法问题,您可以使用 deno lint --fix 命令来自动修复它们。
- 直接导入 npm 包:如果您不喜欢杂乱的 node_modules 目录,但仍然需要使用 npm 包,您可以使用 npm: 说明符直接导入 npm 包。如果没有 package.json 和 node_modules 文件夹,Deno 将在全球缓存中安装您的包,允许您编写将 npm 依赖项合并到一个文件中的程序,无需依赖项清单或配置文件。
import chalk from "npm:chalk@5.3.0";
console.log(chalk.blue("Hello, world!"));
// 输出:Hello, world!(蓝色)
- 依赖项管理:对于大型项目,管理依赖项可能变得复杂。通过将 npm: 说明符放入文件的导入映射中,您可以导入包的裸名称:
// deno.json
{
"imports": {
"chalk": "npm:chalk@5.3.0"
}
}
import chalk from "chalk";
console.log(chalk.blue("Hello, world!"));
// 输出:Hello, world!(蓝色)
- 访问 npm 模块:借助 npm: 说明符导入 npm 包的功能,您可以访问 Deno 中超过 200 万个 npm 模块。这甚至包括复杂的软件包,如 gRPC、ssh2、Prisma 等。Deno 还支持 Node-API 等高级功能和原生插件。
- 支持主流框架:最后,您可以将 Deno 2 与您最喜欢的 JavaScript 框架一起使用,包括 Next.js、Astro、Remix、Angular、SvelteKit、QwikCity 等。
Deno 2 的这些特性,特别是对 Node.js 和 npm 的兼容性,为开发者提供了更多的灵活性和选择,使得在保持现有项目结构的同时,也能享受到 Deno 带来的现代化开发体验。
Deno 2 引入了 deno install 命令,使其成为一个功能强大的软件包管理器。这个新特性不仅支持 package.json 和 node_modules 文件夹,还提供了三个关键子命令来简化依赖项的安装和管理。
deno install 能够以极快的速度安装依赖项。如果项目中包含 package.json,它会迅速创建 node_modules 文件夹。如果不使用 package.json,所有依赖项将被缓存到全局缓存中,这意味着您可以在没有 package.json 的情况下运行 Deno,同时仍然享受快速的依赖项加载。
在性能方面,deno install 比 npm 的冷缓存安装快 15%,即使使用热缓存也非常快速。Deno 团队已经在性能上做出了显著改进,并承诺在未来几周内,特别是在冷缓存场景中,会有更多的性能提升。
标准库的稳定性
Deno 标准库现在已经稳定,它由数十个经过严格审核的实用程序模块组成,涵盖了从数据操作、Web 相关逻辑到特定于 JavaScript 的功能。这些模块在 JSR 上可用,并且可以被其他运行时和环境使用。
以下是一些 Deno 标准库模块及其 npm 等效包的对比:
Deno 标准库模块 | npm 包 |
@std/testing | jest |
@std/expect | chai |
@std/cli | minimist |
@std/collections | lodash |
@std/fmt | chalk |
@std/net | get-port |
@std/encoding | RFC4648 |
有关可用软件包的完整列表,请访问 JSR。
Deno 的速度
Deno 团队一直致力于提高 Deno 在各种真实场景下的速度。他们的工作重点是提供性能改进,这对于日常的 JavaScript 和 TypeScript 开发至关重要,无论是启动时间、处理复杂请求还是整体效率。
虽然基准测试不能说明全部情况,但它们可以提供对运行时擅长领域的洞察。Deno 在一些基准测试中展示了其为开发和生产环境提供一流性能的能力。这些测试结果证明了 Deno 在性能方面的持续进步和对开发者体验的重视。
二、Deno 2的安装
Mac或Linux
$ curl -fsSL https://deno.land/install.sh | sh
...
Edit shell configs to add deno to the PATH? (Y/n)
可以选择“Y”,将Deno环境添加到PATH环境变量中。也可以创建一个符号连接,以避免配置PATH环境变量。
$ ln -s /Users/XXX/.deno/bin/deno /usr/local/bin/deno
Windows
irm https://deno.land/install.ps1 | iex
注意一点,由于Deno 2刚发布的原因,国内镜像源还没做好准备,
验证一下:
$ deno --version
deno 2.0.2 (stable, release, x86_64-apple-darwin)
v8 12.9.202.13-rusty
typescript 5.6.2