Deno 1.x 到 2.x 迁移指南
虽然我们在 Deno 1.x 中完成了大量工作,但下一个主要版本专注于**大规模**使用 Deno。这意味着与 Node.js 和 npm JavaScript 基础设施无缝互操作,并支持更广泛的项目和开发团队,所有这些都不会牺牲开发人员喜爱的简单性、安全性和“内置电池”的特性。
与 Node.js 和 npm 的向后兼容性 跳转到标题
Deno 2 向后兼容 Node.js 和 npm。这不仅允许您在当前的 Node.js 项目中运行 Deno,还可以逐步采用 Deno 的一体化工具链的各个部分。
例如,你可以在 Node.js 项目中使用 deno install
安装依赖,使用 deno fmt
格式化代码而无需 Prettier,或者使用 deno lint
检查常见错误而无需 ESLint。
Deno 2 理解 package.json
、node_modules
目录甚至 npm 工作区,让你可以轻松迁移现有的使用 ESM 的项目。
长期支持版本 跳转到标题
从 Deno v2.1.0(将于 2024 年 11 月发布)开始,Deno 将提供 LTS(长期支持)通道。
LTS 版本的支持期限为 6 个月,在此期间会接收错误修复和关键性能修复,之后新版本会晋升为 LTS。
依赖管理 跳转到标题
Deno 2 使用以下工具极大地改进了 npm 和 JSR 包的依赖管理:
您可以期待使用 deno.json
的 Deno 优先项目、使用 package.json
的 Node.js 优先项目以及同时使用 deno.json
和 package.json
的混合项目都能获得无缝体验,从而实现轻松的迁移路径。
Monorepo、工作区和私有注册表支持 跳转到标题
Deno 2 的构建考虑到了致力于关键任务项目的开发团队。这些团队处理复杂的代码库,共享内部代码,通常使用私有注册表。
使用 Deno 2,您的团队可以像使用 Node.js 和 npm 一样,利用 .npmrc
文件来利用私有 npm 注册表。
@mycompany:registry=http://mycompany.com:8111/
mycompany.com:8111/:_authToken=token
Deno 2 支持工作区,允许您在同一个 monorepo 中混合使用 Deno 优先和 Node 优先的包,从而使增量采用快速且易于上手。
框架支持 跳转到标题
凭借改进的 Node.js 和 npm 兼容性,Deno 2 支持大量用户喜爱的框架,例如:
- Next.js
- SvelteKit
- Remix
- Nuxt
- TanStack
- Qwik
- 等等
大多数现有项目只需进行少量更改或无需更改;只需将 npm run dev
替换为 deno task dev
即可继续工作。
Deno 将提供包含建议的有用错误消息,以指导您找到可行的解决方案。
您还可以使用 deno lint --fix
自动修复常见的兼容性问题。
以下部分概述了 Deno 1.x 和 Deno 2 之间的 CLI 和 API 更改。
CLI 更改 跳转到标题
deno bundle
deno bundle
命令已被移除。我们建议将 esbuild
与 esbuild-deno-loader
一起使用。
import * as esbuild from "npm:esbuild";
import { denoPlugins } from "jsr:@luca/esbuild-deno-loader";
const result = await esbuild.build({
plugins: [...denoPlugins()],
entryPoints: ["https://deno.land/[email protected]/bytes/mod.ts"],
outfile: "./dist/bytes.esm.js",
bundle: true,
format: "esm",
});
esbuild.stop();
deno cache
deno cache
命令已合并到 deno install
命令的 --entrypoint
选项下。
- deno cache main.ts
+ deno install --entrypoint main.ts
deno vendor
deno vendor
命令已被 deno.json
中的 "vendor": true
配置选项取代。
{
"vendor": true
}
--allow-none
请改用 --permit-no-files
CLI 标志。
- deno test --allow-none
+ deno test --permit-no-files
--jobs
请改用 DENO_JOBS
环境变量。
- deno test --jobs=4 --parallel
+ DENO_JOBS=4 deno test --parallel
--ts
请改用 --ext=ts
CLI 标志。
- deno run --ts script.ts
+ deno run --ext=ts script.ts
- deno run -T script.ts
+ deno run --ext=ts script.ts
--trace-ops
请改用 --trace-leaks
CLI 标志。
- deno test --trace-ops
+ deno test --trace-leaks
--unstable
请改用粒度更细的不稳定标志 (--unstable-*
) 或配置选项。 请参阅不稳定功能标志以获取参考。
// kv.ts
const kv = await Deno.openKv();
// ...
- deno run --unstable kv.ts
+ deno run --unstable-kv kv.ts
或者
{
+ "unstable": ["kv"]
}
有关详细信息,请参阅Deno 1.40 博客文章。
API 更改 跳转到标题
Deno.Buffer
请改用标准库中的 Buffer
。
+ import { Buffer } from "jsr:@std/io/buffer";
- const buffer = new Deno.Buffer();
+ const buffer = new Buffer();
// ...
有关详细信息,请参阅 deno#9795。
Deno.Closer
请改用标准库中的 Closer
。
+ import type { Closer } from "jsr:@std/io/types";
- function foo(closer: Deno.Closer) {
+ function foo(closer: Closer) {
// ...
}
有关详细信息,请参阅 deno#9795。
Deno.close()
请改用资源上的 .close()
方法。
const conn = await Deno.connect({ port: 80 });
// ...
- Deno.close(conn.rid);
+ conn.close();
const file = await Deno.open("/foo/bar.txt");
// ...
- Deno.close(file.rid);
+ file.close();
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.Conn.prototype.rid
请改用 Deno.Conn
实例方法。
const conn = await Deno.connect({ port: 80 });
const buffer = new Uint8Array(1_024);
- await Deno.read(conn.rid, buffer);
+ await conn.read(buffer);
const data = new TextEncoder().encode("Hello, world!");
- await Deno.write(conn.rid, data);
+ await conn.write(data);
- await Deno.shutdown(conn.rid);
+ await conn.closeWrite();
- Deno.close(conn.rid);
+ conn.close();
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.ConnectTlsOptions.certChain
请改用 cert
选项。
const caCert = await Deno.readTextFile("./certs/my_custom_root_CA.pem");
using conn = await Deno.connectTls({
hostname: "192.0.2.1",
port: 80,
caCerts: [caCert],
- certChain: Deno.readTextFileSync("./server.crt"),
+ cert: Deno.readTextFileSync("./server.crt"),
key: Deno.readTextFileSync("./server.key"),
});
有关详细信息,请参阅 deno#22274。
Deno.ConnectTlsOptions.certFile
请改用 cert
选项。
const caCert = await Deno.readTextFile("./certs/my_custom_root_CA.pem");
using conn = await Deno.connectTls({
hostname: "192.0.2.1",
port: 80,
caCerts: [caCert],
- certFile: "./server.crt",
+ cert: Deno.readTextFileSync("./server.crt"),
key: Deno.readTextFileSync("./server.key"),
});
有关详细信息,请参阅 deno#22274。
Deno.ConnectTlsOptions.privateKey
请改用 key
选项。
const caCert = await Deno.readTextFile("./certs/my_custom_root_CA.pem");
using conn = await Deno.connectTls({
hostname: "192.0.2.1",
port: 80,
caCerts: [caCert],
cert: Deno.readTextFileSync("./server.crt"),
- keyFile: "./server.key",
+ key: Deno.readTextFileSync("./server.key"),
});
有关详细信息,请参阅 deno#22274。
Deno.copy()
请改用标准库中的 copy()
。
+ import { copy } from "jsr:@std/io/copy";
using file = await Deno.open("/foo/bar.txt");
- await Deno.copy(file, Deno.stdout);
+ await copy(file, Deno.stdout);
有关详细信息,请参阅 deno#9795。
Deno.customInspect
请改用 Symbol.for("Deno.customInspect")
。
class Foo {
- [Deno.customInspect]() {
+ [Symbol.for("Deno.customInspect")] {
}
}
有关详细信息,请参阅 deno#9294。
Deno.fdatasync()
请改用 Deno.FsFile.prototype.syncData()
。
using file = await Deno.open("/foo/bar.txt", { read: true, write: true });
await file.write(new TextEncoder().encode("Hello, world!"));
- await Deno.fdatasync(file.rid);
+ await file.syncData();
Deno.fdatasyncSync()
请改用 Deno.FsFile.prototype.syncDataSync()
。
using file = Deno.openSync("/foo/bar.txt", { read: true, write: true });
file.writeSync(new TextEncoder().encode("Hello, world!"));
- Deno.fdatasyncSync(file.rid);
+ file.syncDataSync();
Deno.File
请改用 Deno.FsFile
。
- function foo(file: Deno.File) {
+ function foo(file: Deno.FsFile) {
// ...
}
有关详细信息,请参阅 deno#13661。
Deno.flock()
请改用 Deno.FsFile.prototype.lock()
。
using file = await Deno.open("/foo/bar.txt");
- await Deno.flock(file.rid);
+ await file.lock();
有关详细信息,请参阅 deno#22178。
Deno.flockSync()
请改用 Deno.FsFile.prototype.lockSync()
。
using file = Deno.openSync("/foo/bar.txt");
- Deno.flockSync(file.rid);
+ file.lockSync();
有关详细信息,请参阅 deno#22178。
Deno.FsFile.prototype.rid
请改用 Deno.FsFile
实例方法。
const file = await Deno.open("/foo/bar.txt");
const buffer = new Uint8Array(1_024);
- await Deno.read(file.rid, buffer);
+ await file.read(buffer);
const data = new TextEncoder().encode("Hello, world!");
- await Deno.write(file.rid, data);
+ await file.write(data);
- Deno.close(file.rid);
+ file.close();
Deno.fstatSync()
请改用 Deno.FsFile.prototype.statSync()
。
using file = Deno.openSync("/foo/bar.txt");
- const fileInfo = Deno.fstatSync(file.rid);
+ const fileInfo = file.statSync();
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.fstat()
请改用 Deno.FsFile.prototype.stat()
。
using file = await Deno.open("/foo/bar.txt");
- const fileInfo = await Deno.fstat(file.rid);
+ const fileInfo = await file.stat();
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.FsWatcher.prototype.rid
请改用 Deno.FsWatcher
实例方法。
using watcher = Deno.watchFs("/dir");
// ...
- Deno.close(watcher.rid);
+ watcher.close();
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.fsync()
请改用 Deno.FsFile.prototype.sync()
。
using file = await Deno.open("/foo/bar.txt", { read: true, write: true });
await file.write(new TextEncoder().encode("Hello, world!"));
await file.truncate(1);
- await Deno.fsync(file.rid);
+ await file.sync();
Deno.fsyncSync()
请改用 Deno.FsFile.prototype.syncSync()
。
using file = Deno.openSync("/foo/bar.txt", { read: true, write: true });
file.writeSync("new TextEncoder().encode("Hello, world!"));
file.truncateSync(1);
- Deno.fsyncSync(file.rid);
+ file.syncSync();
Deno.ftruncateSync()
请改用 Deno.FsFile.prototype.truncateSync()
。
using file = Deno.openSync("/foo/bar.txt");
- Deno.ftruncateSync(file.rid, 7);
+ file.truncateSync(7);
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.ftruncate()
请改用 Deno.FsFile.prototype.truncate()
。
using file = await Deno.open("/foo/bar.txt");
- await Deno.ftruncate(file.rid, 7);
+ await file.truncate(7);
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.funlock()
请改用 Deno.FsFile.prototype.unlock()
。
using file = await Deno.open("/foo/bar.txt");
- await Deno.funlock(file.rid);
+ await file.unlock();
有关详细信息,请参阅 deno#22178。
Deno.funlockSync()
请改用 Deno.FsFile.prototype.unlockSync()
。
using file = Deno.openSync("/foo/bar.txt");
- Deno.funlockSync(file.rid);
+ file.unlockSync();
有关详细信息,请参阅 deno#22178。
Deno.futimeSync()
请改用 Deno.FsFile.prototype.utimeSync()
。
using file = Deno.openSync("/foo/bar.txt");
- Deno.futimeSync(file.rid, 1556495550, new Date());
+ file.utimeSync(1556495550, new Date());
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.futime()
请改用 Deno.FsFile.prototype.utime()
。
using file = await Deno.open("/foo/bar.txt");
- await Deno.futime(file.rid, 1556495550, new Date());
+ await file.utime(1556495550, new Date());
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.isatty()
请改用 Deno.FsFile.prototype.isTerminal()
、Deno.stdin.prototype.isTerminal()
、Deno.stdout.prototype.isTerminal()
或 Deno.stderr.prototype.isTerminal()
。
using file = await Deno.open("/dev/tty6");
- Deno.isatty(file.rid);
+ file.isTerminal();
- Deno.isatty(Deno.stdin.rid);
+ Deno.stdin.isTerminal();
- Deno.isatty(Deno.stdout.rid);
+ Deno.stdout.isTerminal();
- Deno.isatty(Deno.stderr.rid);
+ Deno.stderr.isTerminal();
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.iter()
请改用标准库中的 iterateReader()
。
+ import { iterateReader } from "jsr:@std/io/iterate-reader";
- for await (const chunk of Deno.iter(Deno.stdout)) {
+ for await (const chunk of iterateReader(Deno.stdout)) {
// ...
}
+ import { iterateReaderSync } from "jsr:@std/io/iterate-reader";
using file = await Deno.open("/foo/bar.txt");
- for await (const chunk of Deno.iter(file)) {
+ for await (const chunk of iterateReader(file)) {
// ...
}
有关详细信息,请参阅 deno#9795。
Deno.iterSync()
请改用标准库中的 iterateReaderSync()
。
+ import { iterateReaderSync } from "jsr:@std/io/iterate-reader";
- for (const chunk of Deno.iterSync(Deno.stdout)) {
+ for (const chunk of iterateReaderSync(Deno.stdout)) {
// ...
}
+ import { iterateReaderSync } from "jsr:@std/io/iterate-reader";
using file = await Deno.open("/foo/bar.txt");
- for (const chunk of Deno.iterSync(file)) {
+ for (const chunk of iterateReaderSync(file)) {
// ...
}
有关详细信息,请参阅 deno#9795。
Deno.Listener.prototype.rid
请改用 Deno.Listener
实例方法。
const listener = Deno.listen({ port: 80 })
- Deno.close(listener.rid);
+ listener.close();
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.ListenTlsOptions.certChain
请改用 cert
选项。
using listener = Deno.listenTls({
port: 443,
- certChain: Deno.readTextFile("./server.crt"),
+ cert: Deno.readTextFile("./server.crt"),
key: Deno.readTextFileSync("./server.key"),
});
Deno.ListenTlsOptions.certFile
请将证书文件内容传递给 cert
选项。
using listener = Deno.listenTls({
port: 443,
- certFile: "./server.crt",
+ cert: Deno.readTextFile("./server.crt"),
key: Deno.readTextFileSync("./server.key"),
});
详情请参阅 deno#12639。
Deno.ListenTlsOptions.keyFile
请将密钥文件内容传递给 key
选项。
using listener = Deno.listenTls({
port: 443,
cert: Deno.readTextFile("./server.crt"),
- keyFile: "./server.key",
+ key: Deno.readTextFileSync("./server.key"),
});
详情请参阅 deno#12639。
Deno.metrics()
此符号没有替代 API。
Deno.readAllSync()
请改用标准库中的 readAllSync()
。
+ import { readAllSync } from "jsr:@std/io/read-all";
- const data = Deno.readAllSync(Deno.stdin);
+ const data = readAllSync(Deno.stdin);
+ import { readAllSync } from "jsr:@std/io/read-all";
using file = Deno.openSync("/foo/bar.txt", { read: true });
- const data = Deno.readAllSync(file);
+ const data = readAllSync(file);
有关详细信息,请参阅 deno#9795。
Deno.readAll()
请改用标准库中的 readAll()
。
+ import { readAll } from "jsr:@std/io/read-all";
- const data = await Deno.readAll(Deno.stdin);
+ const data = await readAll(Deno.stdin);
+ import { readAll } from "jsr:@std/io/read-all";
using file = await Deno.open("/foo/bar.txt", { read: true });
- const data = await Deno.readAll(file);
+ const data = await readAll(file);
有关详细信息,请参阅 deno#9795。
Deno.Reader
请改用标准库中的 Reader
。
+ import type { Reader } from "jsr:@std/io/types";
- function foo(closer: Deno.Reader) {
+ function foo(closer: Reader) {
// ...
}
有关详细信息,请参阅 deno#9795。
Deno.ReaderSync
请改用标准库中的 ReaderSync
。
+ import type { ReaderSync } from "jsr:@std/io/types";
- function foo(reader: Deno.ReaderSync) {
+ function foo(reader: ReaderSync) {
// ...
}
有关详细信息,请参阅 deno#9795。
Deno.readSync()
请改用资源本身的 .readSync()
方法。
using conn = await Deno.connect({ port: 80 });
const buffer = new Uint8Array(1_024);
- Deno.readSync(conn.rid, buffer);
+ conn.readSync(buffer);
using file = Deno.openSync("/foo/bar.txt");
const buffer = new Uint8Array(1_024);
- Deno.readSync(file.rid, buffer);
+ file.readSync(buffer);
有关详细信息,请参阅 deno#9795。
Deno.read()
请改用资源本身的 .read()
方法。
using conn = await Deno.connect({ port: 80 });
const buffer = new Uint8Array(1_024);
- await Deno.read(conn.rid, buffer);
+ await conn.read(buffer);
using file = await Deno.open("/foo/bar.txt");
const buffer = new Uint8Array(1_024);
- await Deno.read(file.rid, buffer);
+ await file.read(buffer);
有关详细信息,请参阅 deno#9795。
Deno.resources()
此符号没有替代 API,因为资源 ID (RID) 正在被逐步淘汰。
Deno.run()
请改用 new Deno.Command()
。
- const process = Deno.run({ cmd: [ "echo", "hello world" ], stdout: "piped" });
- const [{ success }, stdout] = await Promise.all([
- process.status(),
- process.output(),
- ]);
- process.close();
+ const command = new Deno.Command("echo", {
+ args: ["hello world"]
+ });
+ const { success, stdout } = await command.output();
console.log(success);
console.log(new TextDecoder().decode(stdout));
注意:此符号自 Deno 2 起被软移除。其类型已被移除,但其实现仍然保留,以减少破坏性更改。您可以使用 @ts-ignore
指令忽略“属性不存在”的 TypeScript 错误。
+ // @ts-ignore `Deno.run()` is soft-removed as of Deno 2.
const process = Deno.run({ cmd: [ "echo", "hello world" ], stdout: "piped" });
const [{ success }, stdout] = await Promise.all([
process.status(),
process.output(),
]);
process.close();
console.log(success);
console.log(new TextDecoder().decode(stdout));
详情请参阅 deno#16516。
Deno.Seeker
请改用标准库中的 Seeker
。
+ import type { Seeker } from "jsr:@std/io/types";
- function foo(seeker: Deno.Seeker) {
+ function foo(seeker: Seeker) {
// ...
}
Deno.SeekerSync
请改用标准库中的 SeekerSync
。
+ import type { SeekerSync } from "jsr:@std/io/types";
- function foo(seeker: Deno.SeekerSync) {
+ function foo(seeker: SeekerSync) {
// ...
}
Deno.seekSync()
请改用 Deno.FsFile.prototype.seekSync()
。
using file = await Deno.open("/foo/bar.txt");
- Deno.seekSync(file.rid, 6, Deno.SeekMode.Start);
+ file.seekSync(6, Deno.SeekMode.Start);
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.seek()
请改用 Deno.FsFile.prototype.seek()
。
using file = await Deno.open("/foo/bar.txt");
- await Deno.seek(file.rid, 6, Deno.SeekMode.Start);
+ await file.seek(6, Deno.SeekMode.Start);
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.serveHttp()
请改用 Deno.serve()
。
- const conn = Deno.listen({ port: 80 });
- const httpConn = Deno.serveHttp(await conn.accept());
- const e = await httpConn.nextRequest();
- if (e) {
- e.respondWith(new Response("Hello World"));
- }
+ Deno.serve({ port: 80 }, () => new Response("Hello World"));
注意:此符号自 Deno 2 起被软移除。其类型已被移除,但其实现仍然保留,以减少破坏性更改。您可以使用 @ts-ignore
指令忽略“属性不存在”的 TypeScript 错误。
const conn = Deno.listen({ port: 80 });
+ // @ts-ignore `Deno.serveHttp()` is soft-removed as of Deno 2.
const httpConn = Deno.serveHttp(await conn.accept());
const e = await httpConn.nextRequest();
if (e) {
e.respondWith(new Response("Hello World"));
}
详情请参阅 Deno 1.35 博客文章。
Deno.Server
请改用 Deno.HttpServer
。
- function foo(server: Deno.Server) {
+ function foo(server: Deno.HttpServer) {
// ...
}
详情请参阅 deno#20840。
Deno.shutdown()
using conn = await Deno.connect({ port: 80 });
- await Deno.shutdown(conn.rid);
+ await conn.closeWrite();
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.stderr.prototype.rid
请改用 Deno.stderr
实例方法。
- if (Deno.isatty(Deno.stderr.rid)) {
+ if (Deno.stderr.isTerminal()) {
console.log("`Deno.stderr` is a terminal");
}
const data = new TextEncoder().encode("Hello, world!");
- await Deno.write(Deno.stderr.rid, data);
+ await Deno.stderr.write(data);
- Deno.close(Deno.stderr.rid);
+ Deno.stderr.close();
注意:此符号自 Deno 2 起被软移除。其类型已被移除,但其实现仍然保留,以减少破坏性更改。您可以使用 @ts-ignore
指令忽略“属性不存在”的 TypeScript 错误。
+ // @ts-ignore `Deno.stderr.rid` is soft-removed as of Deno 2.
Deno.isatty(Deno.stderr.rid);
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.stdin.prototype.rid
请改用 Deno.stdin
实例方法。
- if (Deno.isatty(Deno.stdin.rid)) {
+ if (Deno.stdin.isTerminal()) {
console.log("`Deno.stdout` is a terminal");
}
const buffer = new Uint8Array(1_024);
- await Deno.write(Deno.stdin.rid, buffer);
+ await Deno.stdin.write(buffer);
- Deno.close(Deno.stdin.rid);
+ Deno.stdin.close();
注意:此符号自 Deno 2 起被软移除。其类型已被移除,但其实现仍然保留,以减少破坏性更改。您可以使用 @ts-ignore
指令忽略“属性不存在”的 TypeScript 错误。
+ // @ts-ignore `Deno.stdin.rid` is soft-removed as of Deno 2.
Deno.isatty(Deno.stdin.rid);
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.stdout.prototype.rid
请改用 Deno.stdout
实例方法。
- if (Deno.isatty(Deno.stdout.rid)) {
+ if (Deno.stdout.isTerminal()) {
console.log("`Deno.stdout` is a terminal");
}
const data = new TextEncoder().encode("Hello, world!");
- await Deno.write(Deno.stdout.rid, data);
+ await Deno.stdout.write(data);
- Deno.close(Deno.stdout.rid);
+ Deno.stdout.close();
注意:此符号自 Deno 2 起被软移除。其类型已被移除,但其实现仍然保留,以减少破坏性更改。您可以使用 @ts-ignore
指令忽略“属性不存在”的 TypeScript 错误。
+ // @ts-ignore `Deno.stdout.rid` is soft-removed as of Deno 2.
Deno.isatty(Deno.stdout.rid);
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.TcpConn.prototype.rid
请改用 Deno.TcpConn
实例方法。
using tcpConn = await Deno.connect({ port: 80 });
const buffer = new Uint8Array(1_024);
- await Deno.read(tcpConn.rid, buffer);
+ await tcpConn.read(buffer);
const data = new TextEncoder().encode("Hello, world!");
- await Deno.write(tcpConn.rid, data);
+ await tcpConn.write(data);
- await Deno.shutdown(tcpConn.rid);
+ await tcpConn.closeWrite();
- Deno.close(tcpConn.rid);
+ tcpConn.close();
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.TlsConn.prototype.rid
请改用 Deno.TlsConn
实例方法。
const caCert = await Deno.readTextFile("./certs/my_custom_root_CA.pem");
using tlsConn = await Deno.connectTls({ caCerts: [caCert], hostname: "192.0.2.1", port: 80 });
const buffer = new Uint8Array(1_024);
- await Deno.read(tlsConn.rid, buffer);
+ await tlsConn.read(buffer);
const data = new TextEncoder().encode("Hello, world!");
- await Deno.write(tlsConn.rid, data);
+ await tlsConn.write(data);
- await Deno.shutdown(tlsConn.rid);
+ await tlsConn.closeWrite();
- Deno.close(tlsConn.rid);
+ tlsConn.close();
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.TlsListener.prototype.rid
请改用 Deno.TlsListener
实例方法。
const listener = Deno.listenTls({
port: 443,
cert: Deno.readTextFileSync("./server.crt"),
key: Deno.readTextFileSync("./server.key"),
});
// ...
- Deno.close(listener.rid);
+ listener.close();
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.UnixConn.prototype.rid
请改用 Deno.UnixConn
实例方法。
using unixConn = await Deno.connect({ path: "/foo/bar.sock", transport: "unix" });
const buffer = new Uint8Array(1_024);
- await Deno.read(unixConn.rid, buffer);
+ await unixConn.read(buffer);
const data = new TextEncoder().encode("Hello, world!");
- await Deno.write(unixConn.rid, data);
+ await unixConn.write(data);
- await Deno.shutdown(unixConn.rid);
+ await unixConn.closeWrite();
- Deno.close(unixConn.rid);
+ unixConn.close();
有关详细信息,请参阅Deno 1.40 博客文章。
Deno.writeAllSync()
请改用标准库中的 writeAllSync()
。
+ import { writeAllSync } from "jsr:@std/io/write-all";
const data = new TextEncoder().encode("Hello, world!");
- Deno.writeAllSync(Deno.stdout, data);
+ writeAllSync(Deno.stdout, data);
有关详细信息,请参阅 deno#9795。
Deno.writeAll()
请改用标准库中的 writeAll()
。
+ import { writeAll } from "jsr:@std/io/write-all";
const data = new TextEncoder().encode("Hello, world!");
- await Deno.writeAll(Deno.stdout, data);
+ await writeAll(Deno.stdout, data);
有关详细信息,请参阅 deno#9795。
Deno.Writer
请改用标准库中的 Writer
。
+ import type { Writer } from "jsr:@std/io/types";
- function foo(writer: Deno.Writer) {
+ function foo(writer: Writer) {
// ...
}
有关详细信息,请参阅 deno#9795。
Deno.WriterSync
请使用标准库中的 WriterSync。
+ import type { WriterSync } from "jsr:@std/io/types";
- function foo(writer: Deno.WriterSync) {
+ function foo(writer: WriterSync) {
// ...
}
有关详细信息,请参阅 deno#9795。
Deno.writeSync()
请直接使用资源上的 .writeSync()
方法。
using conn = await Deno.connect({ port: 80 });
const buffer = new TextEncoder().encode("My message");
- Deno.writeSync(conn.rid, buffer);
+ conn.writeSync(buffer);
using file = Deno.openSync("/foo/bar.txt", { write: true });
const buffer = new TextEncoder().encode("My message");
- Deno.writeSync(file.rid, buffer);
+ file.writeSync(buffer);
有关详细信息,请参阅 deno#9795。
Deno.write()
请直接使用资源上的 .write()
方法。
using conn = await Deno.connect({ port: 80 });
const buffer = new TextEncoder().encode("My message");
- await Deno.write(conn.rid, buffer);
+ await conn.write(buffer);
using file = await Deno.open("/foo/bar.txt", { write: true });
const buffer = new TextEncoder().encode("My message");
- await Deno.write(file.rid, buffer);
+ await file.write(buffer);
有关详细信息,请参阅 deno#9795。
new Deno.FsFile()
请使用 Deno.openSync()
或 Deno.open()
。
- const file = new Deno.FsFile(3);
+ using file = await Deno.open("/foo/bar.txt");
window
请使用 globalThis
。
const messageBuffer = new TextEncoder().encode("Hello, world!");
- const hashBuffer = await window.crypto.subtle.digest("SHA-256", messageBuffer);
+ const hashBuffer = await globalThis.crypto.subtle.digest("SHA-256", messageBuffer);
有关详细信息,请参阅 deno#9795。