Впевнений, що ви вже чули про npm5: про те, що він швидше, стабільніше і безпечніше. Нещодавно команда npm в своєму блозі повідомила про випуск npm5 як результату місяців тяжкої роботи всієї команди.
Так що ж нового?
Наявна система кешування більше не буде використовуватися. Вам потрібно буде знову завантажити всі кешовані пакунки. Тепер для кешування використовується pacote та cacache, більше про це можна почитати тут.
npm тепер зберігатиме залежності за умовчуванням. В минулих версіях щоб зберегти пакунок як залежність в package.json
, ми використовували опцію --save
, а робити це потрібно було часто. Тепер npm робить це автоматично:
#npm 5
npm install package-name
# Раніше
npm install package-name --save
Лишили, звісно, і можливість повернути стару поведінку (без автозбереження): вам потрібно вказати це в конфігу:
npm config set save false
Подивится поточне налаштування можна так:
npm config get save
Новий package-lock.json. Файл package-lock.json
буде створено автоматично. Це нова, стандартизована для роботи з різними пакетними менеджерами, фіча. За її допомогою поточні версії пакетів в проекті блокуються. Це корисно коли оновлення пакунків ламають сумісність, з блокуванням такого не буде.
lockfile створюється автоматично. Він блокує версії встановлених залежностей і залежностей залежностей. Він розроблений з розрахунком на сумісність між менеджерами залежностей (npm, Yarn, Bower, JSPM).
Найбільшою відмінністю між локфайлом Yarn та npm є форматування цього файлу. В Yarn його простіше читати, а конфлікти злиття (merge conflict) в системі контролю версій вирішуються автоматично. Ось приклад такого файлу (Yarn):
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
abbrev@1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"
accepts@~1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.3.tgz#c3ca7434938648c3e0d9c1e328dd68b622c284ca"
dependencies:
mime-types "~2.1.11"
negotiator "0.6.1"
Ось приклад цього файлу з npm:
{
"name": "react-example",
"version": "1.0.0",
"lockfileVersion": 1,
"dependencies": {
"has-flag": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
"integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo="
},
"supports-color": {
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
"integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY="
}
}
}
Опції --cached-min
--cached-max
замінені на --prefer-offline
та --prefer-online
.
#npm 4
npm install package-name --cache-min=999999
npm install package-name --cache-max=0
#npm 5
npm install package-name --prefer-offline
npm install package-name --prefer-online
Коли ви будете офлайн, npm спробує пошукати пакунки в кеші, замість того щоб наполягати на підключенні до мережі.
Блокування залежностей тепер розповсюджується і на optionalDependencies
. Без цього іноді бували помилки, коли при розгортанні на бойовому сервері npm намагався встановити залежності для розробки.
Коротко про головні фічі
Тепер ніякого дерева залежностей на весь екран. Натомість npm виведе коротенький підсумок встановлених пакунків.
$ npm install
npm added 125, removed 32, updated 148 and moved 5 packages in 5.032s.
Нова опція --prefer-offline
змушує npm не робити запити-перевірки (304), якщо пакунок є в кеші. Запити будуть здійснюватися коли це дійсно потрібно.
Наприклад, при виконанні команди:
npm install nodemon --prefer-offline
Пакунки будуть встановлюватися з кешу, якщо це можливо. Інтернет буде використовуватися лише якщо якогось пакунку в кеші немає.
А це означає, що встановлення пакунків буде проходити куди швидше, адже інтернет-запити забирають досить багато часу.
Нова опція --prefer-online
навпаки змушує npm перевіряти актуальність кешу для кожного пакунку (перевірка на 304), і поновлювати його за необхідності.
npm install nodemon --prefer-online
Нова опція --offline
при встановленні пакунку змушує npm використовувати лише кеш. Якщо потрібного пакунку там немає — встановлення припиняється з помилкою ENOTCACHED
.
npm install nodemon --offline
Слід зауважити, що через зміну механізму кешування npm 5 може зламати наявний код. Вам потрібно знову завантажити всі закешовані пакунки:
npm install
Цікаво спостерігати як конкуренція змушує розробників працювати активніше та покращувати свої продукти. Ще недавно спільнота гуділа про Yarn та називала його закінченням ери npm. А через деякий час розробники представляють npm 5, що став помітно кращим.
Я запустив невеличкий бенчмарк на своєму комп'ютері щоб порівняти швидкість. npm 4 встановив всі залежності за 36 секунд, а npm 5 — за 25.
І невеличкі гіфки для візуалізації.
До того ж нещодавно була випущена Node 8, в комплекті якої вже є npm 5 (а ще підтримка async/await).
Повний ченджлог можна почитати на GitHub та Medium, а оновитися можна за допомогою цієї команди:
npm install -g npm@next
Що думаєте? Продовжите використовувати Yarn, повернетесь до npm? Чи може взагалі не будете нічого робити? Розкажіть в коментарях.
Ще немає коментарів