1900

5 типів залежностей в JavaScript, про які треба знати

Кожен JS-розробник, хто хоч раз використовував NPM, знає як мінімум про два типи залежностей – normal та dev. Незважаючи на те, що решта не користується такою високою популярністю, на практиці вони можуть стати незамінними. Тому важливо не просто знати про їхнє існування, але також вміти правильно та своєчасно застосовувати. Як саме — розглянемо у цій статті.

Нормальні залежності

 

 

Всі normal або runtime залежності від JavaScript перераховані в dependencies, в папці package.json. Як правило, вони вказують тільки назву ключа і версію (значення), після чого менеджер пакетів, наприклад це може бути NPM — бере їх із глобального реєстру.

При цьому вказувати точну версію залежності зовсім не обов'язково, натомість ви можете встановити:

  • Зразкову версію. За допомогою операторів порівняння можна вказати не одну фіксовану, а одразу кілька версій — більшу чи меншу за конкретний номер. Наприклад, це може бути написано у форматі >1.32 або <=1.3.3. Також за допомогою оператора ~ можна встановлювати еквівалентну версію - "lodash": "~1.3.3". У такому разі завантажуватимуться лише патчі, що знаходяться в зоні між 1.3.3 та 1.4.0. Ще один варіант - це вказівка ​​так званої сумісної версії, наприклад, "lodash": "^ 1.2.0". Цей спосіб застосовується, якщо ви хочете завантажувати версії, які не включатимуть критичні зміни.
  • URL-адреса. Вам навіть не обов'язково вказувати версію, натомість можна послатися на конкретну URL-адресу, завантаживши таким чином потрібний модуль з іншого місця.
  • Локальний файл. Також можна зіслатися на файл, розташований на жорсткому диску вашого пристрою. Це досить поширений варіант, особливо коли потрібно протестувати розроблену модель, перш ніж завантажувати його на NPM. Ви можете створити посилання на папку локального модуля за допомогою параметра локального файлу. При цьому, якщо на початку посилання стоїть префікс file://, ви можете використовувати не тільки повні, але й часткові шляхи.

У яких випадках слід застосовувати нормальні залежності

У звичайних залежностях міститься все, що необхідно для розробки проекту та не представлено жодним із існуючих модулів. Однак, якщо ваш проект - це і є модуль, тут виникає нюанс - при використанні такого модуля в інших пакетах, наприклад React, включати його в залежності не потрібно. У такому разі мається на увазі, що вона вже є.

Однорангові залежності

Вказують на залежність або сумісність, проте не вимагають завантаження коду модуля. Такий тип використовуються у випадках, коли модулю потрібна залежність, яка вже використовується в кореневому проекті, і завантажувати її знову немає сенсу. Натомість менеджер пакетів підключає вже існуючу.

Наведемо кілька прикладів використання peerDependencies:

  • У пакетах express middleware.
  • Micro frontend.
  • Bit-компонент.
  • Плагіни для Babel.

Dev Dependencies

Містить пакети, які потрібні розробнику у процесі продакшену. Наприклад, це можуть бути лінтери, документація та інше. У той же час, всі модулі, які не будуть використані під час створення проекту, є залежностями для розробки.


Такі залежності завантажуються із кореневої папки проекту за допомогою команд npm install або npm link. Відповідно, при розгортанні одного проекту всередині іншого, менеджер пакетів ігноруватиме модулі з devDependencies.

Варіанти використання

Залежності, невикористані під час створення проекту рекомендується записувати в devDependencies. Це дуже корисно, особливо якщо ви розробляєте модуль, який використовуватиметься в сторонніх проектах.


Основна перевага використання залежностей розробки полягає в тому, що в процесі розгортання проекту менеджер пакетів завантажить лише його власні devDependencies, а не всіх модулів, які були до нього підключені.

Bundled Dependencies

Такий тип використовується у випадках, коли проект потрібно перетворити на один файл. Використовуючи команду npm pack, ви перетворите папку з проектом на цілісний архів, а щоб пакувальник зрозумів, які залежності ви хочете до нього додати, потрібно записати масив bundledDependencies або bundleDependencies.


Ця функція дуже зручна у випадках, коли потрібно розповсюдити проект – ви просто формуєте єдиний архів та відправляєте одержувачу

Optional dependencies

П'ятий тип залежності в цілому схожий на Normal dependencies, але з однією істотною відмінністю — менеджер пакетів не видає помилку, якщо не може їх завантажити.


Насправді це виглядає так: якщо після запуску команди npm install процес з якоїсь причини не може встановити залежності — немає інтернет-з'єднання, не виявлено файл та інше, optional dependencies не заважають менеджеру продовжити роботу. У тій же ситуації, при використанні нормальних залежностей ми отримали б помилку, і установка була б скасована.


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

Цей тип має ще один цікавий варіант застосування — інсталяція необов'язкових залежностей. Річ у тім, що з розробці проектів деякі системні залежності може бути опциональными.


Як приклад наведемо сумісність із платформою CI, яку можна встановлювати лише у разі використання цієї платформи, а в інших випадках – ігнорувати.


У подібних ситуаціях, при використанні повного переліку залежностей, ви можете виконувати звичайну установку NPM, а потім за допомогою команди npm install --no-optional пропускати опціональні, що позитивно позначиться на швидкодії коду.