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 以符合标准的方式完成——我们继续朝着浏览器兼容的未来迈进,您将使用 fetch
、Request
和 Response
等 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) >
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.spawn
、Deno.spawnSync
和 Deno.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,以免错过任何内容!