跳到主要内容
Deno 2.4 发布,带来 deno bundle、字节/文本导入、OTel 稳定版等新特性
了解更多
Deno 1.28 Release Notes

Deno 1.28:包含 130 万个新模块

我们很高兴地宣布,Deno 1.28 稳定了 npm 兼容性,这意味着您现在可以在 Deno 中导入超过 130 万个 npm 模块。现在您可以使用您最喜欢的数据持久化模块(如 Prisma、Mongoose 和 MySQL),以及前端框架(如 React、Vue 等),构建应用程序将比以往任何时候都更容易、更安全。

在 Deno 中使用 npm 更简单、更安全。Deno 内置的工具链、一流的 std 库以及强大的 IDE 支持意味着您可以更快地提高生产力。Deno 默认安全的、选择性加入的权限模型意味着您可以减少对可疑包的担忧,将更多时间用于交付产品。

Deno 坚持认为现代 JavaScript 应该使用 ES 模块和 Web 标准 API 构建。本次发布并未改变这一点。npm 模块的导入通过 URL 以符合标准的方式完成——我们继续朝着浏览器兼容的未来迈进,您将使用 fetchRequestResponse 等 Web API。现在,Deno 更进一步,允许您在现代、安全的编程环境中访问您喜欢的模块。

为了帮助您开始在 Deno 中使用 npm 模块,我们将在本周每天发布资源、操作指南等。请务必关注我们的 Twitter订阅我们的 YouTube 以获取最新信息。

本文内容

安装或升级 Deno

如果您已经安装了 Deno,可以通过运行以下命令升级到 1.28 版本:

deno upgrade

如果您是首次安装 Deno

# MacOS and Linux
curl -fsSL https://deno.land/install.sh | sh

# Windows
irm https://deno.land/install.ps1 | iex

点击此处获取更多安装选项。

使用 npm

您可以通过导入 npm: 指定符来使用 npm 包。

在 import 语句中

import { chalk } from "npm:chalk@5";

或者在 import map 中将一个裸指定符映射到 npm 指定符

{
  "imports": {
    "chalk": "npm:chalk@5"
  }
}

您还可以使用 Deno 运行 npm 脚本或 CLI

deno run --allow-env --allow-read npm:create-vite-extra

您甚至可以这样执行带有子命令的 npm 包

deno run npm:<package_name> <subcommand>

例如,在 Deno 中 `npx prisma init` 的等效命令是

deno run npm:prisma init

安全性

虽然 npm 使软件易于使用和共享,但未经检查的依赖项安装和运行方法使 Node 和 npm 容易受到供应链攻击。通过拼写劫持社会工程和其他漏洞利用,恶意模块可以被上传并安装到生产环境的 Node 应用程序中,从而危及数百万用户及其敏感数据。

Deno 默认安全的方法不是允许不受信任的第三方代码访问您的整个系统,而是可以在您的依赖项尝试访问系统时通知并限制您。

deno run npm:install-malware
⚠️  ┌ Deno requests write access to /usr/bin/.
   ├ Requested by `install-malware`
   ├ Run again with --allow-write to bypass this prompt.
   └ Allow? [y/n] (y = yes, allow; n = no, deny) >

了解更多关于 Deno 的选择性加入权限系统.

package.json

在 Deno 中使用 npm 更简单

  • 无需 npm install 步骤:模块在您首次运行程序时安装。
  • 无需 package.json:减少代码库中模板文件的干扰。
  • 默认情况下没有 node_modules 文件夹(为了向后兼容性,请使用 --node-modules-dir)。模块在特殊的全局目录中缓存一次。

使用 Deno 立即提高生产力。凭借内置工具链(包括测试器、格式化器、Linter 等)和原生 TypeScript 支持,您可以跳过安装和配置依赖项,直接投入代码编写。

持续进行的工作

我们的目标是使尽可能多的 npm 模块与 Deno 兼容。有些模块可能(暂)不兼容,原因可能是我们尚未遇到的某些边缘情况、安装后脚本,或者少数包对在典型 Node 设置的文件夹中执行的假设(例如,假设当前工作目录中存在 package.json)。

在接下来的几个月里,我们将努力解决这些问题并提高兼容性。例如,我们目前已将 Node 的部分测试套件重新用于确保我们的 Node 兼容层(例如 fs 等模块)与 Node 的工作方式相同,并且我们将扩展此覆盖范围。我们还在积极修复社区发现的任何边缘情况。

Deno 中的一些子命令(如 deno compile)尚不支持 npm 模块。此项工作正在 deno#15960 中进行跟踪。

为帮助我们提高与 npm 的兼容性,如果您在使用 Deno 时遇到任何 npm 问题,请提交 issue。我们相信随着更多使用,我们将弥补大部分剩余的兼容性差距。

自动发现锁定文件

Deno 自 v1.0 版本以来就支持锁定文件,但使用体验不尽如人意——用户始终需要提供 --lock=<filename> 标志来使用锁定文件。我们认识到这种情况导致许多用户根本不使用锁定文件。

从 Deno v1.28 开始,如果发现配置文件(deno.json(c)),锁定文件将自动被发现和使用。在这种情况下,锁定文件将在配置文件旁边自动创建(如果尚不存在),名称为 deno.lock。如果新依赖项成为模块图的一部分,锁定文件将自动累加更新。

因此,--lock-write 标志的行为已为此自动发现场景进行了扩展——现在不再需要传递此标志来更新锁定文件,它可以用于强制从头开始生成锁定文件。

如果您希望禁用锁定文件的自动发现,可以使用 --no-lock 标志。

此外,--lock 标志默认不再需要参数——如果省略,Deno 将默认为 ./deno.lock

Deno API 的变更

稳定化

以下 API 已在此版本中稳定,不再需要使用 --unstable 标志。

  • Deno.bench()
  • Deno.gid()
  • Deno.networkInterfaces()
  • Deno.systemMemoryInfo()
  • Deno.uid()

新的不稳定 Deno.Command API

此版本添加了一个新的统一 Deno.Command API,以取代不稳定的 Deno.spawnDeno.spawnSyncDeno.spawnChild API。

基本异步用法

let c = new Deno.Command("echo", { args: ["foo"] });
let { stdout, stderr } = await c.output();

基本同步用法

let c = new Deno.Command("echo", { args: ["foo"] });
let { stdout, stderr } = c.outputSync();

高级异步用法(带流式传输)

const c = new Deno.Command("cat", { stdin: "piped" });
c.spawn();
// open a file and pipe input from `cat` program to the file
const file = await Deno.open("output.txt", { write: true });
await c.stdout.pipeTo(file.writable);

const stdin = c.stdin.getWriter();
await stdin.write(new TextEncoder().encode("foobar"));
await stdin.close();

const s = await c.status;
console.log(s);

V8 10.9

此版本升级到最新的 V8 版本(10.9,之前是 10.8)。这主要是内部改进,但也包括一些面向公众的 API 变更。

10.8 和 10.9 之间的完整变更列表在此处

手册重写

随着 Deno 的发展,其手册也随之壮大。我们不断地在各处添加内容;随着时间的推移,这使得它变得有些杂乱。在此版本中,我们对目录和文本进行了全面重构,使其更简洁、更有条理。我们甚至添加了专门介绍如何使用 npm 的完整章节

文档总有改进的空间——如果您发现任何可以改进的地方,请向 denoland/manual 提交 PR。

发布周

为了展示您现在可以用 npm 和 Deno 构建什么,我们将在**本周每天**发布教程、操作指南、YouTube 视频演示以及其他有用的资源。

如果您在商业环境中使用 Deno 并有任何技术问题,请报名参加 Office Hours,在那里您可以与我们的工程师交流,他们将在 30 分钟内帮助您解决问题。

关注我们的 Twitter订阅我们的 YouTube,以免错过任何内容!