Skip to content

npx - утилита для запуска npm-пакетов

npx - это очень крутой способ выполнения Node.js кода, который также привносит много полезных фич

В данном посте я хочу вам представить очень мощную утилиту, которая доступна в npm начиная с версии 5.2 (выпущена в июле 2017) — npx.

Если вы не используете npm в качестве пакетного менеджера, вы можете установить npx как отдельный пакет

npx позволяет нам запускать код, написанный с использованием Node.js, и/или опубликованный в качестве пакета в npm registry.

Простой запуск локальных команд

Установка cowsay в качестве локальной devDependency и его запуск с помощью $ npx cowsay
Установка cowsay в качестве локальной devDependency и его запуск с помощью $ npx cowsay

Раньше Node.js разработчики распространяли большинство утилит для командной строки в качестве глобальных пакетов, чтобы те в свою очередь после установки были доступны в $PATH для выполнения.

Это было болью, потому что в таком случае вы не можете установить разные версии одного пакета. Поэтому обычно используют другой подход. Для каждого проекта устанавливают пакеты нужных версий в devDependencies, а их запуск прописывают как отдельные команды npm run-script.

Теперь нам больше не надо прописывать алиасы для вызова данных команд! Выполнение npx commandname автоматически найдет корректный путь, относящийся к данной команде, внутри директории node_modules текущего проекта. npx не принуждает нас указывать точный путь до скрипта или устанавливать пакет глобально в область видимости пользовательского $PATH.

Выполнение команды без установки

npx create-react-app my-cool-new-app временно устанавливает create-react-app и вызывает его, без замусоривания глобально установленных пакетов и делает это за один шаг!
$ npx create-react-app my-cool-new-app временно устанавливает create-react-app и вызывает его, без замусоривания глобально установленных пакетов и делает это за один шаг!

Еще одной отличной фишкой npx является возможность выполнять команды без предварительной их установки.

Это очень удобно, потому что:

  • Нам не надо ничего устанавливать
  • Мы можем запускать различные версии одно команды используя синтаксис @version

Типичная демонстрация использования npx — запуск команды cowsay. Она выводит корову, которая говорит переданное ей сообщение. Например:

cowsay "Hello" выведет в консоль:

 _______
< Hello >
 -------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

Но это произойдет в том случает, если вы до этого установили пакет cowsay глобально, иначе вы получите ошибку.

npx позволяет вам запустить данную команду npm без локальной установки:

npx cowsay "Hello"

Эта команда отработает как надо.

Ну это была довольно бесполезная команда. Вот некоторые сценарии, где npx сослужит нам добрую службу:

  • Запуск cli-инструмента vue для создания новых приложений и их запуска: npx vue create my-vue-app
  • Создание новых React приложений используя create-react-app:
    npx create-react-app my-react-app
  • и много других примеров

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

Вот некоторые интересные пакеты, которые вы можете попробовать использовать с npx: happy-birthday, benny-hill, workin-hard, cowsay, yo, create-react-app, npm-check.

Запуск команды без установки для проекта

Мы можем взять два первых примера использования npx и совместить их. Этот вариант отлично подходит для случая, когда нам необходимо вызывать некоторые команды в процессе разработки, при этом нам не понадобится устанавливать лишние npm пакеты.

Например, при разработке веб-сервера на Node.js часто требуется перезапускать процесс при изменении кода. Для этого можно использовать команду из пакета supervisor. Мы можем указать ее использование через npx в директиве scripts внутри package.json нашего проекта:

{
  "scripts": {
    "dev": "npx supervisor index.js",
    "start": "node index.js"
  }
}

Теперь при запуске npm run dev будет запускаться npx supervisor, что позволяет использовать команду без установки пакета.

Выполнение кода с использованием другой версии Node.js

Вы можете использовать особый npm-пакет node вместе с синтаксисом @, чтобы выполнить код в другой версии Node.js:

npx [email protected] -v #v6.14.3
npx [email protected] -v #v8.11.3
npx -p node-bin@<version> node -v может использоваться для однократного запуска различных версий node
npx -p [email protected]<version> node -v может использоваться для однократного запуска различных версий node

Данный кейс позволяет отказаться от nvm или других инструментов управления версий Node.js

Выполнять произвольные снипеты кода по URL

npx не ограничивает вас в использовании только пакетами, опубликованными в npm registry. Вы также можете выполнять код из GitHub gist просто передав в npx ссылку на него, например:

npx https://gist.github.com/zkat/4bc19503fe9e9309e2bfaa2c58074d32

Разумеется, вы должны быть осторожны запуская код, который не контролируется вами. С великой силой приходит великая ответственность.

Автофоллбек для командной строки

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

Что если вы хотите еще плотнее интегрировать инструменты из NPM в свой рабочий процесс? А что если я вам скажу, что npx позволяет вам это сделать!

Как уже было отмечено во втором примере, при запуске консольной команды, которой нет в нашем окружении $PATH, мы получаем ошибку. Но консоль также нам предоставляет обработчик данной ошибки и npx может внедрить в него.

Данная функция поддерживается для командных строк bash, zsh и fish. Все что вам нужно, так это добавить в конфиг вашей командной строки вызов генерации обработчика ошибки от npx (раздел в документации):

source <(npx --shell-auto-fallback bash) # для bash
source <(npx --shell-auto-fallback zsh) # для zsh
source (npx --shell-auto-fallback fish | psub) # для fish

После перезапуска консоли вы можете выполнять команды npm без необходимости обращаться напрямую к npx!

Добавление автофоллбека для npx в .zshrc означает, что вы можете сделать $ ember-cli@latest ... без ссылки на npx вообще!
Добавление автофоллбека для npx в .zshrc означает, что вы можете вызывать [email protected] без прямого вызова npx вообще!

Источник: Flavio Copes