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-специалистом. Новогодняя акция — скидки до 50% по промокоду HABR:
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
От основ — в глубину
А также


