deno.com
本頁內容

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.jsonnode_modules 目錄,甚至 npm 工作區,讓您可以輕鬆地遷移現有的 ESM 專案。

為了更好的 Node 相容性,當存在 package.json 時,預設不再安裝 npm 套件,建議改為執行 deno install。若要取得 Deno 1.x 的自動安裝行為,請將以下內容新增至您的 deno.json

deno.json
{
  "nodeModulesDir": "auto"
}

Node.js 支援 頁面閱讀更多資訊

長期支援版本 跳到標題

從 Deno v2.1.0(預計於 2024 年 11 月發布)開始,Deno 將提供 LTS(長期支援)通道。

LTS 版本支援 6 個月,在新的版本升級為 LTS 之前,會收到錯誤修正和關鍵效能修正。

穩定性與發布 頁面閱讀更多資訊

管理依賴 跳到標題

Deno 2 大幅改進了 npm 和 JSR 套件的依賴管理,工具包括:

您可以期待在使用 deno.json 的 Deno 優先專案、使用 package.json 的 Node.js 優先專案,以及使用 deno.jsonpackage.json 的混合專案中獲得無縫體驗,以實現輕鬆的遷移路徑。

Monorepo、工作區和私有 Registry 支援 跳到標題

Deno 2 的建構考慮了在任務關鍵專案上工作的開發團隊。這些團隊在複雜的程式碼庫上工作,共享內部程式碼,通常使用私有 Registry。

使用 Deno 2,您的團隊可以使用私有 npm Registry,就像您使用 Node.js 和 npm 一樣,使用 .npmrc 檔案

.npmrc
@mycompany:registry=http://mycompany.com:8111/
mycompany.com:8111/:_authToken=token

npm 套件 頁面了解更多關於私有 Registry 設定的資訊。

Deno 2 具有工作區支援,讓您可以在同一個 monorepo 中混合使用 Deno 優先和 Node 優先的套件,使逐步採用變得快速且平易近人。

工作區與 Monorepos 頁面閱讀更多資訊。

框架支援 跳到標題

憑藉改進的 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 變更。

設定變更 跳到標題

  • nodeModulesDir

nodeModulesDir--node-modules-dir 設定選項中使用布林值已被棄用,改為從多個行為選項中選擇。因此,未設定選項時的預設值已變更。

- "nodeModulesDir": false | true
+ "nodeModulesDir": "none" | "auto" | "manual"

- Default value without package.json: false (corresponding to "none")
+ Default value without package.json: "none"

- Default value with package.json:  true (corresponding to "auto")
+ Default value with package.json:  "manual"

如果您的專案不包含 package.json 檔案,則預設行為將保持不變。

如果您的專案包含 package.json 檔案,並且您未指定 nodeModulesDir 選項,則必須將其設定為 auto,以保持 Deno 1.x 的預設自動安裝行為。Deno 2 中的新預設值為 manual,這表示使用者需要手動保持此目錄為最新狀態。

請參閱Node modules 目錄以取得參考資訊。

CLI 變更 跳到標題

  • deno bundle

deno bundle 命令已被移除。我們建議將 esbuildesbuild-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/std@0.185.0/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 設定選項取代。

deno.json
{
  "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() 方法。

test

  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()

請改用 Deno.Conn.closeWrite()

  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 以取得詳細資訊。

您是否找到所需的資訊?

隱私權政策