Spec-Zone.ru › Deno 2

Руководство по переходу с Deno 1.x на 2.x

Исторический документ

В этом руководстве описан однократный переход с Deno 1.x на Deno 2.x. Оно больше не обновляется. Если вы переходите на Deno с Node.js, ознакомьтесь с руководством Переход с Node.js.

В Deno 1.x мы добились многого, а следующая основная версия посвящена использованию Deno в больших масштабах. Это означает бесшовную совместимость с инфраструктурой JavaScript Node.js и npm, поддержку более широкого спектра проектов и команд разработчиков — без ущерба для простоты, безопасности и принципа «всё включено», которые так ценят разработчики.

Обратная совместимость с Node.js и npm

Deno 2 обратно совместим с Node.js и npm. Это позволяет не только запускать Deno в существующих проектах Node.js, но и постепенно внедрять отдельные инструменты универсальной цепочки разработки Deno.

Например, в проекте Node.js можно использовать deno install для установки зависимостей, запускать deno fmt для форматирования кода без Prettier или использовать deno lint для проверки распространённых ошибок вместо ESLint.

Deno 2 понимает package.json, каталог node_modules и даже рабочие области npm, благодаря чему существующие проекты на ESM можно перенести с минимальными усилиями.

Для повышения совместимости с Node пакеты npm больше не устанавливаются автоматически при наличии package.json. Вместо этого рекомендуется запускать deno install. Чтобы вернуть поведение Deno 1.x с автоматической установкой, добавьте в deno.json следующее:

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

Подробнее — на странице Node.js support.

Управление зависимостями

В Deno 2 значительно улучшено управление зависимостями пакетов npm и JSR благодаря таким инструментам, как:

  • deno install
  • deno add
  • deno remove

Ожидайте бесшовной работы с проектами, ориентированными на Deno и использующими deno.json, с проектами, ориентированными на Node.js и использующими package.json, а также с гибридными проектами, в которых используются и deno.json, и package.json, что упрощает постепенный переход.

Поддержка монорепозиториев, рабочих областей и приватных реестров

Deno 2 создавался с учётом потребностей команд разработчиков, работающих над критически важными проектами. Такие команды работают со сложными кодовыми базами, совместно используют внутренний код и часто применяют приватные реестры.

В Deno 2 команда может использовать приватные реестры npm так же, как в Node.js и npm, с помощью файла .npmrc. Сведения о настройке см. в разделе Приватные реестры.

Deno 2 поддерживает рабочие области, позволяя объединять пакеты, ориентированные на Deno и Node.js, в одном монорепозитории и упрощая постепенное внедрение.

Подробнее см. на странице Workspaces and Monorepos.

Поддержка фреймворков

Благодаря улучшенной совместимости с Node.js и npm Deno 2 поддерживает множество популярных у пользователей фреймворков, например:

  • Next.js
  • SvelteKit
  • Remix
  • Nuxt
  • TanStack
  • Qwik
  • и другие

Большинство существующих проектов потребуют лишь незначительных изменений или не потребуют их вовсе: просто замените npm run dev на deno task dev и продолжайте работу.

Deno будет выводить полезные сообщения об ошибках с рекомендациями, помогающими найти работающее решение.

Также можно использовать deno lint --fix для автоматического устранения распространённых проблем совместимости.


В следующем разделе описаны изменения конфигурации, CLI и API между Deno 1.x и Deno 2.

Изменения конфигурации

  • 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.

  • useUnknownInCatchVariables

В Deno 2 по умолчанию включён параметр TypeScript useUnknownInCatchVariables. Перехваченное значение в блоке catch теперь имеет тип unknown, а не any, поэтому перед обращением к свойствам ошибки необходимо сузить тип:

try {
  doSomething();
} catch (err) {
  // err is `unknown`
  if (err instanceof Error) {
    console.error(err.message);
  }
}

Если для быстрого перехода вам нужно прежнее поведение, можно задать "useUnknownInCatchVariables": false в параметрах компилятора deno.json, хотя рекомендуется сужать тип ошибки.

Изменения 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: ["./main.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 заменена параметром конфигурации "vendor": true в deno.json.

deno.json
{
  "vendor": true
}
  • --allow-none

Вместо этого используйте флаг CLI --permit-no-files.

- deno test --allow-none
+ deno test --permit-no-files
  • --jobs

Вместо этого используйте переменную среды DENO_JOBS.

- deno test --jobs=4 --parallel
+ DENO_JOBS=4 deno test --parallel
  • --ts

Вместо этого используйте флаг CLI --ext=ts.

- deno run --ts script.ts
+ deno run --ext=ts script.ts
- deno run -T script.ts
+ deno run --ext=ts script.ts
  • --trace-ops

Вместо этого используйте флаг CLI --trace-leaks.

- 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.

Удаление утверждений импорта

Утверждения импорта удалены из JavaScript и теперь объявлены устаревшими в Deno 2.0. Вместо них используйте атрибуты импорта:

- import data from "./data.json" assert { type: "json" };
+ import data from "./data.json" with { type: "json" };

Это один из редких случаев, когда предложение было понижено в статусе после достижения этапа 3.

Изменения 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, поскольку идентификаторы ресурсов (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 этот символ удалён не полностью: его типы удалены, но реализация сохранена, чтобы уменьшить число несовместимых изменений. Ошибки TypeScript «свойство не существует» можно игнорировать с помощью директивы @ts-ignore.

+ // @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 этот символ удалён не полностью: его типы удалены, но реализация сохранена, чтобы уменьшить число несовместимых изменений. Ошибки TypeScript «свойство не существует» можно игнорировать с помощью директивы @ts-ignore.

 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 этот символ удалён не полностью: его типы удалены, но реализация сохранена, чтобы уменьшить число несовместимых изменений. Ошибки TypeScript «свойство не существует» можно игнорировать с помощью директивы @ts-ignore.

+ // @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 этот символ удалён не полностью: его типы удалены, но реализация сохранена, чтобы уменьшить число несовместимых изменений. Ошибки TypeScript «свойство не существует» можно игнорировать с помощью директивы @ts-ignore.

+ // @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 этот символ удалён не полностью: его типы удалены, но реализация сохранена, чтобы уменьшить число несовместимых изменений. Ошибки TypeScript «свойство не существует» можно игнорировать с помощью директивы @ts-ignore.

+ // @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.

Последнее обновление: 19 июня 2026 г.

© 2018–2025 the Deno authors
Licensed under the MIT License.
https://docs.deno.com/runtime/reference/migration_guide

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API