Недавно, начав изучать React, я увидела, что многие люди (включая меня) путались, видя npx вместо привычного npm.
Некоторые из нас считали это странным, но не вдавались в детали. Что хуже, другие думали, что это опечатка, и даже пытались «исправить» её, запустив npm вместо npx.
Когда я вижу что-то странное более одного раза, я считаю, что аномалию стоит изучить углублённо. Я сделала это и решила поделиться своими наблюдениями в этой статье:
Это не опечатка, это npx, НЕ npm!
NPM
Как мы уже знаем, npm — менеджер пакетов для Node.js, задачей которого является автоматическое разрешение зависимостей и управление пакетами.
Это означает, что мы можем указать все необходимые проекту пакеты в файле package.json и запустить npm install для их установки.
npm также позволяет указать, от каких конкретных версий зависит наш проект, чтобы предотвратить многие проблемы после обновления или переустановки.
NPX
С другой стороны, npx является инструментом для выполнения пакетов Node и поставляется в комплекте с npm, начиная с версии 5.2.
Npx делает следующее:
1. Проверяет, существует ли в нашем проекте пакет, который должен быть выполнен;
2. Существует — выполняем его;
3. Не существует — npx устанавливает последнюю версию пакета и лишь затем выполняет;
Это поведение npx по умолчанию, но есть флаги, которые можно использовать для изменения алгоритма.
Например, выполнение npx some-package --no-install говорит npx лишь попытаться выполнить some-package, если последний уже установлен. В противном случае вы получите ошибку.
Больше про флаги npx можно почитать здесь.
Пример
Допустим, существует пакет my-package, и мы хотим его выполнить.
Без npx придётся запускать его по локальному пути, например, так:
./node_modules/bin/my-package
или же определять его как отдельный скрипт в разделе scripts в файле package.json:
{
"name": "something",
"version": "1.0.0",
"scripts": {
"my-package": "./node_modules/bin/my-package"
}
}
чтобы можно было выполнять npm run my-package.
Но с npx мы можем писать npx my-package сразу.
Заключение
Надеюсь, что эта статья помогла понять главное различие между npm и npx. Одной тайной меньше!
Спасибо, что дочитали. Хорошего кодинга!