Узнайте о модулях Deno — самом большом изменении рабочего процесса, с которым вы столкнетесь, если перейдете с Node.js. Узнайте, как они работают и как их лучше всего использовать, как использовать модули Node.js и пакеты npm в Deno и многое другое.
Node.js — это среда выполнения JavaScript, основанная на движке Chrome V8, разработанная Райаном Далем и выпущенная в 2009 году.
Deno — это среда выполнения JavaScript, основанная на движке Chrome V8, разработанная Райаном Далом и выпущенная в 2020 году. Она была создана с учетом десятилетнего опыта. Это не обязательно делает его продолжением или превосходством Node.js, но он отклоняется от этого пути.
Смотрите также:
Наш путеводитель по Deno, включая наш указатель контента Deno (прокрутите до конца)
Сравнение Node.js и Deno, а также руководство по выбору правильного инструмента для конкретной ситуации.
Отличия в заголовках: Deno изначально поддерживает TypeScript, безопасность, тестирование и
Модули Node.js
В 2009 году в JavaScript не было стандартной модульной системы. Отчасти это было связано с его браузерным наследием, а до ES6/ES2015 оставалось несколько лет.
Было бы немыслимо, чтобы Node.js не предоставлял модули, поэтому он принял CommonJS из выбора обходных путей сообщества. Это привело к разработке Node Package Manager, или npm, который позволил разработчикам легко искать, использовать и публиковать свои собственные модули JavaScript.
Использование npm росло в геометрической прогрессии. Он стал самым популярным менеджером пакетов из
Модули Дено
Deno выбирает модули ES2015, которые вы можете importполучить по абсолютному или относительному
import { something } from 'https: //somewhere.com/somehow.js’;
Сценарий по этому
export function something () {
console.log ('something was executed’) ;
}
Deno использует систему модулей, идентичную той, что реализована в современных
Node.js также поддерживает модули ES2015... но это сложно и остается экспериментальным. Модули CommonJS и ES2015 выглядят одинаково, но работают
CommonJS загружает зависимости из файловой системы по запросу во время выполнения кода.
Модули ES предварительно анализируются из
Node.js должен продолжать поддерживать CommonJS, а также обрабатывать смешанные модули ES. Следовательно, он предполагает:
файлы, заканчивающиеся.cjsиспользованием CommonJS
файлы, заканчивающиеся с.mjsиспользованием модулей ES
файлы заканчиваются.jsCommonJS, ЕСЛИ НЕ БЛИЖАЙШИЕ package.jsonнаборы «type»: «module»или nodeвыполняются с —
Понятно, почему Deno выбрала единую стандартную модульную систему. Тем не менее, npm сыграл ключевую роль в успехе Node, поэтому удивительно, что Deno отказывается от него.
Менеджера пакетов нет.
Одним из критических замечаний по поводу npm является огромный размер node_modulesкаталога каждого проекта. Он может достигать сотен мегабайт, поскольку для модулей требуются определенные версии других модулей.
Масса узловых модулей
Deno загружает и кэширует модуль в глобальном каталоге при первой встрече его
Я знаю, вы думаете: «Ааа, а что, если...»
...но у Deno есть варианты решения проблем, возникающих
Ненадежные
Для критически важных приложений Node.js рекомендуется добавить свой node_modulesкаталог в репозиторий Git/other вашего проекта.
Deno поддерживает аналогичный вариант. Вы можете установить DENO_DIRпеременную среды на путь к каталогу в вашем текущем проекте, например
DENO_DIR=~/myproject/deno_modules`
В Windows cmdиспользуйте:
> set DENO_DIR="C:\myproject\deno_modules"
или Windows PowerShell:
> $env: DENO_DIR="C:\myproject\deno_modules"
Deno будет кэшировать модули в этом каталоге при запуске вашего приложения, чтобы их можно было добавить в репозиторий системы контроля версий проекта.
Вы также можете рассмотреть возможность объединения ваших зависимостей в один файл JavaScript или TypeScript. Команда пакета Deno может сделать это за один шаг:
deno bundle myscript.js myscript.bundle.js
Где myscript.jsваш сценарий входа обычно выполняется с расширением deno run. Полученный автономный myscript.bundle.jsфайл можно развернуть на рабочем сервере.
Объединение с ожиданиями верхнего уровня
Deno поддерживает верхний уровень await: нет необходимости оборачивать awaitвызовы в анонимную asyncфункцию. К сожалению, await верхнего уровня не удается связать, поэтому необходимо добавить
Наконец: будьте осторожны со случайными модулями Deno на необычных
Управление версиями модуля
В идеале
import { serve } from 'https: //deno.land/std@0.61.0/http/server.ts’;
Вместо этого можно ссылаться на основную ветку:
import { serve } from 'https: //deno.land/std/http/server.ts’;
но это приведет к загрузке последней версии, и будущая версия может быть несовместима с вашим приложением.
Вы можете выпускать модули Deno на своем собственном сервере, используя аналогичное соглашение о версиях, но ваш сайт может получать много трафика, поскольку он становится популярным. Более надежный метод — использовать репозиторий в сервисе, таком как GitHub, и назначать тег git для каждого выпуска. Такие службы, как denopkg.com и unpkg.com, можно использовать для предоставления общедоступного
Несколько упоминаний модуля
Вам может понадобиться ссылаться на один и тот же
В качестве альтернативы вы можете использовать один файл зависимостей, который импортирует каждый модуль, который вы используете в проекте. Обычно он называется deps.jsили deps.ts:
// deps.js: module dependencies
// all std path module funtions
export * as path from 'https: //deno.land/std@0.61.0/path/mod.ts’;
// some std datetime module functions
export { parseDate, currentDayOfYear } from 'https: //deno.land/std@0.61.0/datetime/mod.ts’;
Затем вы можете ссылаться на модули Deno из deps.jsлюбого другого файла проекта:
import { path, currentDayOfYear } from '. /deps.js’;
console.log (path.sep) ;
console.log (currentDayOfYear ());
Вам нужно изменить только одну ссылку URL deps.jsпри обновлении модуля.
Альтернативный вариант — карта импорта. Это небольшой файл JSON, обычно называемый import_map.json, который присваивает имя полному или частичному
{
«imports»: {
«path/»: «https: //deno.land/std@0.61.0/path/»,
«datetime/»: «https: //deno.land/std@0.61.0/datetime/»
}
}
Вы можете ссылаться на имена карт импорта в любом скрипте:
import * as path from 'path/mod.ts’;
import { currentDayOfYear } from 'datetime/mod.ts’;
console.log (path.sep) ;
console.log (currentDayOfYear ());
Затем файл JSON импортируется при выполнении приложения с помощью deno run:
deno run \
—importmap=import_map.json \
—unstable \
myscript.js
Импорт карт в настоящее время является нестабильной функцией, поэтому —unstableнеобходимо установить флаг. Эта функция может измениться в будущих выпусках Deno.
Исследование целостности
Код, на который ссылается
Deno имеет встроенную систему безопасности, поэтому сценарии должны выполняться с такими флагами, как —
Deno предоставляет возможность проверки целостности. Проще всего использовать один файл зависимостей (как описано выше):
// deps.js: module dependencies
// all std path module funtions
export * as path from 'https: //deno.land/std@0.61.0/path/mod.ts’;
// some std datetime module functions
export { parseDate, currentDayOfYear } from 'https: //deno.land/std@0.61.0/datetime/mod.ts’;
Следующая denoкоманда создает lock.jsonфайл, содержащий контрольную сумму всех импортированных модулей Deno:
deno cache —lock=lock.json —
Когда другой разработчик клонирует ваш проект, он может перезагрузить каждый модуль и проверить целостность каждого, чтобы гарантировать, что они идентичны вашему:
deno cache —reload —lock=lock.json deps.js
Проверка целостности не применяется Deno. Возможно, лучше всего запускать эти процессы как автоматические перехватчики Git или
Использование модулей Node.js
Многие
Коллекция из почти 800 сторонних модулей Deno доступна по адресу deno.land/x. Существуют платформы, подобные Express.js, драйверы баз данных, функции шифрования, инструменты командной строки и многое другое.
Вы также найдете кураторские списки популярных модулей, таких как Awesome Deno.
Однако вы можете импортировать любой из 1,5 миллионов модулей Node.js. Некоторые CDN могут преобразовывать пакеты npm/CommonJS в
Skypack.dev
jspm.org
unpkg.com (добавьте строку? moduleзапроса к
Другой вопрос, работает ли нужный вам модуль без проблем в Deno.
К счастью, кроссплатформенные модули, которые работают как на Node.js, так и на Deno без специальной обработки, скорее всего, появятся по мере развития экосистемы среды выполнения JavaScript.
Больше важности модуля
Ссылки на
Но это далеко не идеально.
Публикация модулей npm безболезненна, а поиск на npmjs.com прост. Ваш поисковый запрос может дать 500 результатов, но паралич выбора сводится к минимуму за счет ранжирования пакетов по факторам популярности, качества и обслуживания.
Отправка кода в список сторонних модулей Deno является более сложной задачей. Модули должны пройти автоматизированные тесты, но качество не гарантируется, а результаты поиска упорядочены по алфавиту. Существующая система вряд ли будет устойчивой, когда в ней будет несколько тысяч модулей.
Обновление пакетов также легко выполняется в npm. Вы можете запустить npm outdated, чтобы просмотреть список обновлений или просто npm installкогда в файлахpackage.json.
В Deno нет эквивалентной опции проверки обновлений. Доступны проекты, подобные диспетчеру пакетов, включая Trex, Update Deno Dependencies и
Стоит ли переходить на Deno?
Node.js не умер. Он зрелый и содержит модули, методы, документацию и опыт, лежащие в основе среды выполнения, за десятилетие.
Deno использует большую часть этих знаний, но они очень новые и будут быстро развиваться в ближайшие годы. Возможно, еще слишком рано делать ставку на Deno для крупного приложения, но для небольших проектов риск меньше. Тем, кто уже использует TypeScript или пришел с других языков, может быть проще, но у разработчиков Node.js не возникнет проблем с переходом на Deno и обратно.
Однако у Deno есть интересное преимущество:
его модульная система идентична клиентскому JavaScript
он реализует множество
Мечта об изоморфных библиотеках JavaScript, которые работают либо на клиенте, либо на сервере, сделала значительный шаг вперед.