pnpm чи npm
Пласке дерево npm
Починаючи з версії 3, npm підтримує «пласке» дерево залежностей. Це призводить до меншого роздування дискового простору, а побічним ефектом є безлад у теці node_modules
.
З іншого боку, pnpm керує node_modules
за допомогою жорстких посилань і символічних посилань на глобальне сховище вмісту на диску, що адресується. Це дає змогу значно зменшити використання дискового простору, а також зробити ваші node_modules
охайними. Існує документація щодо store layout, якщо ви бажаєте дізнатися більше.
Перевагою правильної структури node_modules
у pnpm є те, що вона «допомагає уникнути безглуздих помилок», унеможливлюючи використання модулів, які не вказано у package.json
проєкту.
Встановлення
pnpm не дозволяє встановлювати пакунки без збереження їх у package.json
. Якщо до pnpm add
не передано жодних параметрів, пакунки буде збережено як звичайні залежності. Як і у випадку з npm, --save-dev
і --save-optional
можна використовувати для встановлення пакунків як dev або необовʼязкових залежностей.
Як наслідок цього обмеження, проєкти не матимуть жодних сторонніх пакунків, коли вони використовують pnpm, якщо тільки вони не видалять залежність і не залишать її сиротою. Саме тому реалізація команди prune у pnpm не дозволяє вам вказувати пакунки для відсікання — вона ЗАВЖДИ вилучає усі зайві та осиротілі пакунки.
Тека dependencies
Тека dependencies починається з префікса file:
і вказує на теку у файловій системі. Як і npm, pnpm звʼязує ці залежності. На відміну від npm, pnpm не виконує встановлення для файлових залежностей.
Це означає, що якщо у вас є пакунок з назвою foo
(<root>/foo
), який має bar@file:../bar
як залежний, pnpm не виконуватиме встановлення для <root>/bar
під час запуску pnpm install
з foo
.
Якщо вам потрібно запустити встановлення декількох пакунків одночасно, наприклад, у випадку монорепо, зверніться до документації pnpm -r
.