Изготовление сайтов в Питере, СПБ. Модули Deno: использование, лучшие практики и импорт модулей Node

Узнайте о модулях 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, безопасность, тестирование и API-интерфейсы браузера. Обработке модулей уделяется меньше внимания, но это, возможно, самое большое изменение в том, как вы создаете приложения JavaScript. Прежде чем обсуждать Deno, позвольте мне вернуть вас в более простое время...

Модули Node.js

В 2009 году в JavaScript не было стандартной модульной системы. Отчасти это было связано с его браузерным наследием, а до ES6/ES2015 оставалось несколько лет.

Было бы немыслимо, чтобы Node.js не предоставлял модули, поэтому он принял CommonJS из выбора обходных путей сообщества. Это привело к разработке Node Package Manager, или npm, который позволил разработчикам легко искать, использовать и публиковать свои собственные модули JavaScript.

Использование npm росло в геометрической прогрессии. Он стал самым популярным менеджером пакетов из когда-либо созданных и к середине 2020 года содержит почти 1,5 миллиона модулей, причем каждый день публикуется более 800 новых модулей (источник: modulecounts.com).

Модули Дено

Deno выбирает модули ES2015, которые вы можете importполучить по абсолютному или относительному URL-адресу:

import { something } from 'https: //somewhere.com/somehow.js’;

Сценарий по этому URL-адресу должен exportфункционировать или иметь другие значения соответственно, например

export function something () {

console.log ('something was executed’) ;

}

Deno использует систему модулей, идентичную той, что реализована в современных веб-браузерах.

Node.js также поддерживает модули ES2015... но это сложно и остается экспериментальным. Модули CommonJS и ES2015 выглядят одинаково, но работают по-разному:

CommonJS загружает зависимости из файловой системы по запросу во время выполнения кода.

Модули ES предварительно анализируются из URL-адресов, чтобы разрешить дальнейший импорт до выполнения кода.

Node.js должен продолжать поддерживать CommonJS, а также обрабатывать смешанные модули ES. Следовательно, он предполагает:

файлы, заканчивающиеся.cjsиспользованием CommonJS

файлы, заканчивающиеся с.mjsиспользованием модулей ES

файлы заканчиваются.jsCommonJS, ЕСЛИ НЕ БЛИЖАЙШИЕ package.jsonнаборы «type»: «module»или nodeвыполняются с —input-type=moduleопцией.

Понятно, почему Deno выбрала единую стандартную модульную систему. Тем не менее, npm сыграл ключевую роль в успехе Node, поэтому удивительно, что Deno отказывается от него.

Менеджера пакетов нет.

Одним из критических замечаний по поводу npm является огромный размер node_modulesкаталога каждого проекта. Он может достигать сотен мегабайт, поскольку для модулей требуются определенные версии других модулей.

Масса узловых модулей

Deno загружает и кэширует модуль в глобальном каталоге при первой встрече его URL-адреса в сценарии. Поэтому требуется только одна копия конкретной версии модуля, независимо от того, сколько проектов на нее ссылается.

Я знаю, вы думаете: «Ааа, а что, если...»

...но у Deno есть варианты решения проблем, возникающих из-заURL-адресов модулей.

Ненадежные URL-адреса

URL-адреса могут временно выйти из строя, измениться или исчезнуть навсегда. Это проблема для любого менеджера пакетов, и npm сталкивался с проблемами в прошлом (он также разрешает установку с URL-адреса).

Для критически важных приложений 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 на необычных URL-адресах! URL-адрес Deno, Github или Bitbucket с хорошей документацией и мнением сообщества, как правило, безопаснее.

Управление версиями модуля

В идеале URL-адреса модулей должны иметь версию, чтобы вы ссылались на конкретный выпуск кода. Например, стандартная библиотека Deno позволяет загружать определенную версию модуля HTTP-сервера:

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, можно использовать для предоставления общедоступного URL-адреса модуля.

Несколько упоминаний модуля

Вам может понадобиться ссылаться на один и тот же URL-адрес модуля во многих файлах кодовой базы вашего приложения. Если вы хотите обновить этот модуль, URL-адрес необходимо будет изменить в нескольких местах. Поиск и замена будут работать, но они неуклюжи, подвержены ошибкам и увеличивают вероятность конфликтов слияния.

В качестве альтернативы вы можете использовать один файл зависимостей, который импортирует каждый модуль, который вы используете в проекте. Обычно он называется 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, который присваивает имя полному или частичному URL-адресу:

{

«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.

Исследование целостности

Код, на который ссылается URL-адрес, может быть изменен или взломан без вашего ведома. Известные сайты были скомпрометированы, потому что они напрямую ссылались на сторонний клиентский код. Представьте себе ущерб, который мог бы нанести сценарий, если бы он имел доступ к ресурсам сервера.

Deno имеет встроенную систему безопасности, поэтому сценарии должны выполняться с такими флагами, как —allow-readиallow-netдля ограничения доступа к файловой системе и сети. Это поможет предотвратить некоторые проблемы, но не заменит проверку целостности модуля!

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 —lock-write deps.js

Когда другой разработчик клонирует ваш проект, он может перезагрузить каждый модуль и проверить целостность каждого, чтобы гарантировать, что они идентичны вашему:

deno cache —reload —lock=lock.json deps.js

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

Использование модулей Node.js

Многие API-интерфейсы Node.js были воспроизведены для Deno — см. deno.land/std/node. Это не полный список, но вы найдете общие модули файлов, событий, буферов и утилит.

Коллекция из почти 800 сторонних модулей Deno доступна по адресу deno.land/x. Существуют платформы, подобные Express.js, драйверы баз данных, функции шифрования, инструменты командной строки и многое другое.

Вы также найдете кураторские списки популярных модулей, таких как Awesome Deno.

Однако вы можете импортировать любой из 1,5 миллионов модулей Node.js. Некоторые CDN могут преобразовывать пакеты npm/CommonJS в URL-адреса модулей ES2015, в том числе:

Skypack.dev

jspm.org

unpkg.com (добавьте строку? moduleзапроса к URL-адресу)

Другой вопрос, работает ли нужный вам модуль без проблем в Deno.

К счастью, кроссплатформенные модули, которые работают как на Node.js, так и на Deno без специальной обработки, скорее всего, появятся по мере развития экосистемы среды выполнения JavaScript.

Больше важности модуля

Ссылки на URL-адреса модулей являются спорными и могут сбивать с толку тех, кто исходит из чрезвычайно популярного npm. Тем не менее, Deno упростил использование модуля JavaScript. Он устраняет несколько критических замечаний по поводу npm, одновременно устраняя многие потенциальные побочные эффекты модулей ES2015.

Но это далеко не идеально.

Публикация модулей npm безболезненна, а поиск на npmjs.com прост. Ваш поисковый запрос может дать 500 результатов, но паралич выбора сводится к минимуму за счет ранжирования пакетов по факторам популярности, качества и обслуживания.

Отправка кода в список сторонних модулей Deno является более сложной задачей. Модули должны пройти автоматизированные тесты, но качество не гарантируется, а результаты поиска упорядочены по алфавиту. Существующая система вряд ли будет устойчивой, когда в ней будет несколько тысяч модулей.

Обновление пакетов также легко выполняется в npm. Вы можете запустить npm outdated, чтобы просмотреть список обновлений или просто npm installкогда в файлахpackage.json.

В Deno нет эквивалентной опции проверки обновлений. Доступны проекты, подобные диспетчеру пакетов, включая Trex, Update Deno Dependencies и deno-check-updates, но они часто зависят от карт импорта и всегда будут полагаться на URL-адреса с семантической версией.

Стоит ли переходить на Deno?

Node.js не умер. Он зрелый и содержит модули, методы, документацию и опыт, лежащие в основе среды выполнения, за десятилетие.

Deno использует большую часть этих знаний, но они очень новые и будут быстро развиваться в ближайшие годы. Возможно, еще слишком рано делать ставку на Deno для крупного приложения, но для небольших проектов риск меньше. Тем, кто уже использует TypeScript или пришел с других языков, может быть проще, но у разработчиков Node.js не возникнет проблем с переходом на Deno и обратно.

Однако у Deno есть интересное преимущество:

его модульная система идентична клиентскому JavaScript

он реализует множество API-интерфейсов браузера: вы можете ссылаться на windowобъект, устанавливать прослушиватели событий, запускать Web Workers, выполнять запросы к удаленному серверу с помощью API Fetch () и многое другое.

Мечта об изоморфных библиотеках JavaScript, которые работают либо на клиенте, либо на сервере, сделала значительный шаг вперед.

Делитесь нашими материалами с друзьями!

 

 

Заказать разработку сайта