Pull to refresh
111.11
Cloud4Y
#1 Корпоративный облачный провайдер

Deno можно обновить до версии 1.10

Reading time 6 min
Views 2.5K

Вчера создатели Deno (среды выполнения для JavaScript) объявили о выходе новой версии Deno 1.10. Анонсированы новые функции, улучшение производительности и исправление ряда ошибок.

Главные изменения:

  • Улучшили встроенное средство запуска тестов

  • Структурированный клон теперь поддерживается в Web Workers

  • Добавлено API для веб-хранилища

  • Появилась поддержка удалённого импорта карт

Если у вас уже установлен Deno, обновить его до 1.10 можно, запустив deno upgrade. А если вы устанавливаете его с нуля, рекомендуем использовать один из способов:

# Using Shell (macOS and Linux):
curl -fsSL https://deno.land/x/install/install.sh | sh

# Using PowerShell (Windows):
iwr https://deno.land/x/install/install.ps1 -useb | iex

# Using Homebrew (macOS):
brew install deno

# Using Scoop (Windows):
scoop install deno

# Using Chocolatey (Windows):
choco install deno

1. Улучшения функции deno test

В Deno 1.10 произошла глобальная реорганизация встроенного средства запуска тестов.

Изолированное и параллельное выполнение тестов: до апгрейда Deno запускал все тесты последовательно в одной и той же среде выполнения. Теперь все тестовые модули запускаются изолированно, и в каждом случае создаётся новая среда выполнения. deno test теперь поддерживает флаг --jobs, который позволяет указать, сколько потоков следует использовать при запуске тестов. По умолчанию все тесты по-прежнему запускаются последовательно.

Настраиваемые разрешения для тестов: Deno имеет некоторое количество флагов, с помощью которых можно указать разрешения для программы. Чтобы упростить тестирование с разными наборами разрешений, Deno.test  теперь поддерживает функцию permissions, позволяющую указать точные разрешения, которые будут применяться в тесте.

Deno.test({
  name: "write only",
  permissions: { write: true, read: false },
  async fn() {
    await Deno.writeTextFile("./foo.txt", "I can write!");
    console.log(await Deno.readTextFile("./foo.txt"));
  },
});

Несмотря на наличие --allow-read в данном случае произойдёт ожидаемая ошибка:

$ deno test --allow-read --allow-write --unstable test_permissions.ts
Check file:///Users/ry/src/deno/test_permissions.ts
running 1 test from file:///Users/ry/src/deno/test_permissions.ts
test write only ... FAILED (5ms)

failures:

write only
PermissionDenied: Requires read access to "./foo.txt", run again with the --allow-read flag
    at deno:core/core.js:86:46
    at unwrapOpResult (deno:core/core.js:106:13)
    at async open (deno:runtime/js/40_files.js:46:17)
    at async Object.readTextFile (deno:runtime/js/40_read_file.js:40:18)
    at async fn (file:///Users/ry/src/deno/test_permissions.ts:6:17)
    at async asyncOpSanitizer (deno:runtime/js/40_testing.js:21:9)
    at async resourceSanitizer (deno:runtime/js/40_testing.js:58:7)
    at async exitSanitizer (deno:runtime/js/40_testing.js:85:9)
    at async runTest (deno:runtime/js/40_testing.js:199:7)
    at async Object.runTests (deno:runtime/js/40_testing.js:244:7)

failures:

	write only

test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out (37ms)

Разрешения, запрошенные тестом, не могут выходить за пределы разрешений, предоставленных процессу с помощью флагов --allow- *. Если ключ не указан в объекте разрешений, он наследует его значение от соответствующего флага --allow- *.

Эта функция требует использования флага --unstable.

Улучшенный результат средства запуска тестов: при запуске набора тестов для каждого обнаруженного модуля будет отображаться подсказка с указанием количества тестов и источника этих тестов.

running 4 tests from file:///dev/deno/cli/tests/unit/tty_test.ts
test consoleSizeFile ... ok (11ms)
test consoleSizeError ... ok (4ms)
test isatty ... ok (4ms)
test isattyError ... ok (3ms)
running 6 tests from file:///dev/deno/cli/tests/unit/rename_test.ts
test renameSyncSuccess ... ok (17ms)
test renameSyncReadPerm ... ok (5ms)
test renameSyncWritePerm ... ok (6ms)
test renameSuccess ... ok (13ms)
test renameSyncErrorsUnix ... ok (34ms)
test renameSyncErrorsWin ... ignored (1ms)
...

Примеры типов проверки в документации: Для всех проектов важно обеспечить актуальность документации. Вы можете, к примеру, легко забыть обновить код после изменения API. Чтобы куски кода не оказались устаревшими, deno test теперь поддерживает флаг --doc, который выносит примеры кода проверки в комментарии к документации.

/**
 * ```
 * import { example } from "./test_docs.ts";
 *
 * console.assert(example() == 42);
 * ```
 */
export function example(): string {
  return "example";
}

Попробуйте сами:

$ deno test --doc https://deno.com/v1.10/test_docs.ts

Check file:///dev/test_docs.ts:2-7
error: TS2367 [ERROR]: This condition will always return 'false' since the types 'string' and 'number' have no overlap.
console.assert(example() == 42);
               ~~~~~~~~~~~~~~~
    at file:///dev/test_docs.ts:2-7.ts:3:16

Отслеживание изменений в файлах при запуске тестов: deno test теперь поддерживает флаг --watch , благодаря которому процесс продолжит работать после завершения тестов и будут отслеживаться изменения файлов на случай повторного запуска соответствующих тестов.

Как и в других подкомандах, поддерживающих флаг --watch, файлы, которые необходимо отслеживать, Deno находит автоматически.

2. Worker.postMessage стал поддерживать алгоритм структурированного клона

Web Workers позволяют запускать несколько побитовых операций JavaScript, TypeScript или WASM одновременно в отдельных (изолированных) средах выполнения. При этом сохраняется возможность передавать сообщения между Web Workers и основным потоком.

Deno поддерживал Web Workers с момента выхода начальной версии 1.0, но имел серьёзное ограничение: Worker.postMessage() использовал неспецифический алгоритм, который преобразовывал сообщения в JSON. Это решение привело к неожиданным последствиям для пользователей, поскольку не все значения и объекты были сериализованы должным образом. В свежей версии Deno это пофиксили. Теперь разрешена сериализация любых данных с использованием алгоритма структурированного клона.

Вот пример отправки рекурсивного объекта JavaScript в Worker, который ранее вызывал бы ошибку:

const obj = { hello: "world" };
obj.self = obj;

const worker = new Worker(
  "data:application/javascript,self.onmessage = (e) => self.postMessage(e.data);",
  { type: "module" },
);

worker.onmessage = (e) => {
  console.log("Received event:", e.data);
};
worker.postMessage(obj);

3. Поддержка API для веб-хранилища

В новой версии добавлена ​​поддержка API для веб-хранилища. Этот API состоит из localStorage и sessionStorage, которые можно использовать для постоянного хранения небольшого количества данных без прямого доступа к файловой системе. Данные изначально зашифрованы (ключ шифрования в Deno можно установить с помощью --location). Вы можете использовать localStorage и sessionStorage без получения каких-либо разрешений.

API работает так же, как в браузере: localStorage можно использовать для постоянного хранения до 5 МБ данных до перезапуска процесса, а sessionStorage можно использовать для хранения небольшого количества данных на протяжении всего процесса.

Вот пример:

// kv.ts

const key = Deno.args[0];

if (key === undefined) {
  // if user passes no args, display number of entries
  console.log(localStorage.length);
} else {
  const value = Deno.args[1];

  if (value === undefined) {
    // if no value is specified, return value of the key
    console.log(localStorage.getItem(key));
  } else {
    // if value is specifed, set the value
    localStorage.setItem(key, value);
  }
}
$ deno run --location https://example.com ./kv.ts
0
$ deno run --location https://example.com ./kv.ts foo bar
$ deno run --location https://example.com ./kv.ts foo
bar
$ deno run --location https://example.com ./kv.ts
1

4. Поддержка директивы node-fmt-ignore-file для файлов Markdown

deno fmt- это средство, основанное на dprint, которое может форматировать файлы JavaScript, TypeScript, JSON и Markdown.

Чтобы пропустить форматирование файла, можно использовать директиву identify-fmt-ignore-file в виде комментария в верхней части файла. Раньше эти директивы не работали в файлах Markdown, но в новой версии это исправлено.

Чтобы пропустить форматирование файла Markdown, используйте <! - identify-fmt-ignore-file -> в верхней части файла.

5. Поддержка общей памяти WASM

В новой версии включена поддержка атомизации и общей памяти в WebAssembly. Эта функция уже есть по умолчанию в Chrome и Firefox, а теперь появилась и в Deno.

Установка общего значения true в конструкторе WebAssembly.Memory включает атомизацию и позволяет использовать общие буферы массива в качестве резервного хранилища памяти WASM.

const memory = new WebAssembly.Memory({
  initial: 1,
  maximum: 10,
  shared: true,
});
console.assert(memory.buffer instanceof SharedArrayBuffer);

6. Поддержка удалённого импорта карт

Теперь карты не нужно хранить в локальной файловой системе, их можно загружать через HTTP:

$ deno install --import-map=https://example.com/import_map.json -n example https://example.com/mod.ts

7. Обновлённый API плагин

В версии 1.10 обновили интерфейс плагина и позволили ему использовать serde_v8 для взаимосвязи между средой выполнения и своим плагином. Обновление предоставляет все необходимые утилиты для отправки операций из собственных плагинов без использования стороннего кода. Кроме того, плагинам теперь разрешён доступ к ResourceTable для хранения объектов Rust. Система плагинов по-прежнему требует флага --unstable, поскольку это экспериментальная функция.

8. Убран флаг --unstable для функций CLI

Чтобы использовать API, необходим флаг --unstable при запуске Deno. Однако этот флаг также применялся для обозначения некоторых функций интерфейса командной строки, которые ещё работали нестабильно (например, deno lint). В 1.10 больше не нужен флаг --unstable для функций CLI, так что unstable теперь отвечает только за API. Некоторые из функций CLI, которые всё ещё считаются нестабильными, имеют соответствующие комментарии в подсказках (UNSTABLE: ). Однако для запуска подкоманды им больше не требуется флаг  --unstable, например,  deno compiledeno lint.

Tags:
Hubs:
+15
Comments 0
Comments Leave a comment

Other news

Information

Website
www.cloud4y.ru
Registered
Founded
2009
Employees
51–100 employees
Location
Россия
Representative