Вышел deno 1.27. Подробности об улучшениях под катом

от автора

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-специалистом. Если вы не найдёте работу, мы просто вернём деньги (возврат — акция в рамках «Чёрной пятницы»).


ссылка на оригинал статьи https://habr.com/ru/company/skillfactory/blog/697752/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *