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-специалистом. Если вы не найдёте работу, мы просто вернём деньги (возврат — акция в рамках «Чёрной пятницы»).
Data Science и Machine Learning
- Профессия Data Scientist
- Профессия Data Analyst
- Курс «Математика для Data Science»
- Курс «Математика и Machine Learning для Data Science»
- Курс по Data Engineering
- Курс «Machine Learning и Deep Learning»
- Курс по Machine Learning
Python, веб-разработка
- Профессия Fullstack-разработчик на Python
- Курс «Python для веб-разработки»
- Профессия Frontend-разработчик
- Профессия Веб-разработчик
Мобильная разработка
Java и C#
- Профессия Java-разработчик
- Профессия QA-инженер на JAVA
- Профессия C#-разработчик
- Профессия Разработчик игр на Unity
От основ — в глубину
А также
