Deno 1.27 выпущена с фичами и изменениями в списке ниже:


  • Улучшение языкового сервера/IDE
  • Улучшение совместимости с npm
  • Онлайн-API navigator.language
  • Улучшение deno task
  • Проверка обновлений
  • Изменения в API Deno
  • Обновление deno lint
  • V8 10.8
  • Улучшение совместимости с Node.js
  • Изменение в API стандартных библиотек

Детали — под катом к старту курса по Fullstack-разработке на Python.





Чтобы посмотреть все востребованные профессии, кликните по баннеру.




Если у вас уже установлен Deno, обновиться до версии 1.27 можно этой командой:


deno upgrade

А если вы устанавливаете Deno впервые — этой:


# MacOS and Linux
curl -fsSL https://deno.land/x/install/install.sh | sh

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

Здесь можно узнать больше об опциях установки.


Улучшения языкового сервера/IDE


Встроенные подсказки


В версии 4.4 в TypeScript добавлена поддержка встроенных в код подсказок (inlay hints). В данном релизе Deno этот функционал раскрывается для LSP. Встроенные подсказки — небольшие информационные сниппеты, добавленные прямо в код. Они дают дополнительную информацию о коде. Во многих отношениях их можно назвать встроенной в код альтернативой подсказкам, всплывающим при наведении.


Примечание переводчика. В оригинале использовано очень ёмкое выражение "inline hover", где inlay (встроенные [в код]) стало прилагательным, а противоположное ему по смыслу hover существительным ([альтернативы] наведения [мыши]), для раскрытия смысла которого понадобилось 7 русских слов (встроенной в код альтернативой подсказкам при наведении). О том, что речь идёт именно об альтернативе становится окончательно ясно из следующего большого абзаца (после 2 скриншотов).

Вид кода без встроенных подсказок:


Скриншот из редактора без отображения встроенных подсказок


Код после активации встроенных подсказок:


Скриншот из редактора с отображением встроенных подсказок


Видеть и понимать скрытые выведенные типы без необходимости в наведении на них курсора бывает очень полезно. Со встроенными подсказками код читается значительно легче. Эти подсказки заполняют информационные пробелы в коде. Это особенно актуально при работе с TypeScript или JavaScript с проверкой типов. При использовании скрытых подсказок в коде сохраняется число явных аннотаций типов, а сам код остаётся читаемым.


Вот несколько настроек встроенных подсказок:


  • deno.inlayHints.enumMemberValues.enabled — активация/деактивация встроенных подсказок для значений enum. По умолчанию false.
  • deno.inlayHints.functionLikeReturnTypes.enabled — активация/деактивация встроенных подсказок для неявных типов возврата функций. По умолчанию false.
  • deno.inlayHints.parameterNames.enabled — активация/деактивация встроенных подсказок для названий параметров. Доступные значения: "none", "literals", "all". По умолчанию "none".
  • deno.inlayHints.parameterNames.suppressWhenArgumentMatchesName — скрывать встроенные подсказки при совпадении названий аргумента и параметра. По умолчанию true.
  • deno.inlayHints.parameterTypes.enabled — активация/деактивация встроенных подсказок для неявных типов параметров. По умолчанию false.
  • deno.inlayHints.propertyDeclarationTypes.enabled — активация/деактивация встроенных подсказок для неявных объявлений свойств. По умолчанию false.
  • deno.inlayHints.variableTypes.enabled — активация/деактивация встроенных подсказок для неявных типов переменных. По умолчанию false.
  • deno.inlayHints.variableTypes.suppressWhenTypeMatchesName — подавление подсказок типов при совпадении названия переменной и неявного типа. По умолчанию true.
  • editor.inlayHints.enabled — контролирует статус активации встроенных подсказок в VS Code. Доступные значения: "off", "offUnlessPressed", "on" или "onUnlessPressed".

Visual Studio Code поддерживает скрытые подсказки, а последний релиз расширения Deno VS Code поддерживает соответствующие опции настройки. Для других редакторов и плагинов возможность поддержки встроенных подсказок и способы установки параметров конфигурации необходимо уточнить.


Заполнение регистра


Хотя это и не связано с конкретным релизом, следует отметить, что мы недавно улучшили заполнение регистра в поддерживающих его редакторах. Теперь при вводе названия стороннего модуля из deno.land/x в интеллектуальном редакторе используется поисковая система, на которой работает поиск модуля в deno.land. При этом также предоставляются описание модуля и информация о популярности.


Улучшения коснулись завершения пути импорта, где информация о документации интегрируется в отображаемый текст и остаётся доступной при наведении мыши на import. Чтобы предоставить всю эту информацию редактору, авторы сторонних модулей могут пользоваться тегом JSDoc @module в первом блоке JSDoc в первом блоке JSDoc в верхней части модуля.


В Visual Studio Code заполнение регистра для deno.land/x активно по умолчанию. Проверьте способ настройки deno.suggest.imports.hosts в других редакторах, чтобы убедиться, что https://deno.land работает в смысле заполнения регистра.


Вот видео с заполнением регистра в действии:



Исправление багов


Несколько исправленных багов в этом релизе были связаны с языковым сервером (language server). В частности, языковой сервер неверно обрабатывал строковые переменные "snippet". Также проблемы возникали при автоимпорте и автодополнении кода в JSX, что приводило к странному поведению. Оба бага исправлены.


Улучшение совместимости с npm


Процесс работы с пакетами npm в Deno продолжает совершенствоваться:


Проверка типа, поддержка LSP


Теперь Deno автоматически извлекает типы TypeScript из распространяющих типы npm-пакетов.



Для иных пакетов можно использовать директиву @deno-types, которая иерархически выше import, чтобы указать соответствующий пакет @types package, если он есть:


// @deno-types="npm:@types/chalk@4"
import chalk from "npm:chalk@4";

Для пакетов, которым требуется @types/node, вы можете указать директиву reference-types с тройным слешем для извлечения типов Node:


/// <reference types="npm:@types/node" />

// @deno-types="npm:@types/express@4"
import express from "npm:express@4.18";

Отметим, что таким образом Deno будет использовать глобальные типы Node (например setTimeout(...): NodeJS.Timeout) вместо типов, совместимых с браузером (например, setTimeout(...): number) в типах для пакетов npm. Эти глобальные типы будут изолированы от пакетов npm и поэтому не должны влиять на типы в вашем коде Deno:


Node-API


Теперь Deno поддерживает Node-API (ранее — N-API) в рамках пакетов npm. Node-API позволяет использовать собственный нативный код Node.js. То есть такие пакеты, как parcel, sqlite3, usb и fs-xattr теперь могут использоваться с Deno.


Помните, что для этого необходим флаг --allow-ffi:


Lockfile v2


Разрешение пакетов npm и их целостность теперь сохраняются при использовании файла блокировки (lockfile):


# lock.json will include information about npm packages referenced in main.ts
deno cache --lock=lock.json --lock-write main.ts

Заметим, что в релизе 1.28 планируем прописать файл блокировки по умолчанию при использовании файла deno.json. Обновления описаны в issue #11971.


Теги dist в спецификаторах npm


Регистр npm позволяет помечать версии именами. Например, у express есть тег "next", которым на момент написания оригинала этого текста была помечена версия 5.0.0-beta.1.


Теперь указывать эти теги dist можно в требованиях к версии для спецификаторов npm:


// will import 5.0.0-beta.1 at the time of writing this
import express from "npm:express@next";

Обратите внимание, что теги dist по-прежнему не поддерживаются, если появляются в файле package.json пакета. Мы знаем об этом баге и вскоре устраним его. Обновления описываются в issue #16321.


Кеширование определителей npm напрямую через аргументы к deno cache


deno cache теперь поддерживает спецификаторы npm в командной строке:


deno cache --unstable npm:chalk@5 npm:express

Это позволит выгрузить информацию о пакетах и разрешенные версии этих пакетов в глобальный npm-кеш Deno:


navigator.language Web API


В Deno v1.27 появляется API navigator.language. Это доступное только для чтения свойство, которое возвращает строковую переменную, представляющую собой предпочтительный язык системы пользователя:


$ deno
> navigator.language
"en-EN"

Возвращаемая строковая переменная языка — тег BCP 47.


На значение, которое возвращает этот API, могут влиять переменные среды, задающие системную локаль, например LC_ALL:


$ LC_ALL=es_ES deno
> navigator.language
"es-ES"

Поддерживается API navigator.languages. Он возвращает массив предпочитаемых языковых настроек, первое значение в котором идентично navigator.language.


За фичу спасибо Луке Матею Пинитийе.


Улучшение deno task


Предупреждение «deno task is unstable and may drastically change in the future» («deno task нестабилен и в дальнейшем может быть радикально изменён» удалено. deno task оказался полезным, поэтому его радикальных изменений не предвидится. Тем не менее мы можем внести ряд изменений в его окружение, что облегчит работу в будущем, например ввести новые кросс-платформенные команды или переменные окружения.


Переменная среды INIT_CWD


Выполняемая задача будет иметь тот же текущий рабочий каталог, что и файл с определением задачи — deno.json. Для некоторых сценариев это может быть нежелательно. Вы также можете желать узнать, в каком каталоге пользователь запустил задачу. Теперь это возможно с помощью переменной окружения INIT_CWD, которая будет установлена с полным путём к директории, где была запущена задача, если INIT_CWD ещё не установлена. Это соответствует поведению npm run.


Например, представленная ниже задача заменит текущий рабочий каталог на каталог, из которого пользователь запустил задачу, а затем выдаст обновлённый рабочий каталог (как мы помним, благодаря кросс-платформенности deno task это работает и на Windows):


{
  "tasks": {
    "my_task": "cd $INIT_CWD && pwd"
  }
}

Теперь при неудачном завершении команды async прекращается выполнение всей задачи


Возможно, вы использовали deno task для запуска нескольких команд одновременно, используя асинхронную команду:


{
  "tasks": {
    "start": "deno run --allow-net server.ts & deno run --allow-net client.ts"
  }
}

В прошлом, если команда async не выполнялась, другая команда продолжала работать, и вы могли этого не заметить. Подобным образом работает большинство оболочек, но такой подход не годится для целей deno task.


Начиная с этого релиза при неудачном завершении команды async прекращается выполнение всей задачи. Если же вам нужно, чтобы команда вела себя, как раньше, вы можете добавить || true после команды, и тогда выходным кодом будет 0:


{
  "tasks": {
    "start": "deno run --allow-net server.ts || true & deno run --allow-net client.ts || true"
  }
}

Суффиксsleep к аргументу времени


Команда sleep в deno task теперь поддерживается как суффикс к аргументу времени, как указано для sleep в linux man pages.


За фичу спасибо @sigmaSd.


Проверка на обновления


В базовый набор Deno входит подчинённая команда deno upgrade, которая упрощает обновление до последней версии Deno. Начиная с этого релиза Deno будет выполнять автоматическую проверку наличия новых версий и сообщать вам об их доступности:


$ deno run app.ts
A new release of Deno is available: 1.26.2 → 1.27.0
Run `deno upgrade` to install it.

Мы позаботились, чтобы такие проверки не влияли на производительность ваших приложений — они выполняются в фоновом режиме не чаще одного раза в день. Фичу можно полностью отключить, установив переменную окружения: DENO_NO_UPDATE_CHECK=1


Изменения в API Deno


Стабилизация API


Следующие API стабилизированы в текущем релизе и больше не требуют флага --unstable.


  • Deno.consoleSize()
  • Deno.futime()
  • Deno.futimeSync()
  • Deno.loadavg()
  • Deno.osRelease()
  • Deno.stdin.setRaw()
  • Deno.utime()
  • Deno.utimeSync()

Другие обновления


  • Deno.kill() теперь работает без аргумента. При опущенном аргументе функция по умолчанию отправляет SIGTERM.


  • Deno.getGid() переименована в Deno.gid() в рамках подготовки к стабилизации данного API.


  • Deno.getUid() переименована в Deno.uid() в рамках подготовки к стабилизации данного API.


  • Добавлена опция TcpListenOptions.reusePort. Она позволяет нескольким процессам получать данные с одного адреса и порта. Этой опции нужен флаг --unstable, и она поддерживается только для Linux.



Обновления deno lint


Встроенный инструмент статического анализа кода получил новый формат отчётов "compact", с которым могут быть знакомы пользователи ESLint. Для использования этого формата флаг --compact выставляется для подчинённой команды deno lint:


$ deno lint --compact
/dev/deno/foo.js: line 1, col 10 - `foo` is never used (no-unused-vars)
Found 1 problem
Checked 1 file

Вы также можете указать предпочтительный тип отчётов в файле deno.json:


{
  "lint": {
    "report": "compact"
  }
}

За фичу спасибо Бренли Дюку.


V8 10.8


Этот релиз обновляется до последней версии V8 (10.8, ранее — 10.7).


Важнейшим новым свойством релиза является поддержка поддержки создания копий Change Array


Улучшение совместимости c Node.js


25 октября Node.js 18 получил долгосрочную поддержку (LTS) для версии 18.12.0. В Deno v1.27 набор тестов слоя совместимости Node.js обновлён до совместимости с Node.js v18.12.0. Это означает, что Deno теперь может работать с последним релизом Node.js LTS.


Обратите внимание, что весь слой Node.js требует флага --unstable.


Другие обновления


  • Реализован модуль readline/promises. Этот модуль выдаёт промисы (Promises) на основании API для модуля readline. За фичу спасибо @PolarETech.


  • Кодировка 'base64url' теперь поддерживается hash.digest() в модуле crypto. За фичу спасибо Дениз Акшимшек.


  • Теперь могут загружаться модули .node. См. также поддержку Node-API.


  • Улучшена поддержка Windows для fs.access().


  • К API модуля child_process добавлена опция windowsVerbatimArguments.



Изменения в стандартной библиотеке API


В данном релизе удалён ряд устаревших API:


  • Модуль hash удалён. Теперь его функционал доступен модулю crypto.


  • Модуль textproto удалён.


  • BSNode удалён из модуля collections с заменой на BinarySearchNode.


  • BSTree удалён из модуля collections с заменой на BinarySearchTree.


  • RBNode удалён из модуля collections с заменой на RedBlackNode.


  • RBTree удалён из модуля collections с заменой на RedBlackTree.


  • direction удалён из модуля collections с заменой на Direction.


  • CSVStream удалён из модуля encoding с заменой на CsvStream.


  • Тип CSVStreamOptions удалён из модуля encoding с заменой на тип CsvStreamOptions.


  • Файл encoding/csv_stringify.ts удалён с заменой на файл encoding/csv.ts и другие API.


  • JSONValue удалён из модуля encoding с заменой на JsonValue.


  • JSONParseStream удалён из модуля encoding с заменой на JsonParseStream.


  • JSONStringifyStream удалён из модуля encoding с заменой на JsonStringifyStream.


  • ConcatenatedJSONParseStream удалён из модуля encoding с заменой на ConcatenatedJsonParseStream.


  • Функции listenAndServe() и listenAndServeTls() удалены из модуля http с заменой на serve() и serveTls(), соответственно.


  • Потоковый функционал модуля io удалён, так как стал доступен для модуля streams.


  • Функционал файла bufio.ts для модуля io удалён, так как стал доступен в файле buffer.ts.


  • Функционал файла ioutil.ts для модуля io удалён, так как стал доступен в файле util.ts.


  • Класс LineStream удалён из модуля streams с заменой на TextLineStream.


  • Из модуля testing удалены все API бенчмарков с заменой на Deno.bench().


  • Функции возврата assertThrows() и assertRejects() удалены из модуля testing с заменой на другие сигнатуры.


  • Функция generate() удалена из модуля uuid с заменой на функцию randomUUID() WebCrypto.



Научим вас веб-разработке, чтобы вы прокачали карьеру и стали востребованным IT-специалистом. Если вы не найдёте работу, мы просто вернём деньги (возврат — акция в рамках «Чёрной пятницы»).




Комментарии (0)