Введение в пакетный менеджер NPM для начинающих
Node.js делает возможным написание серверных приложений на JavaScript. Он построен на движке JavaScript V8 и написан на C++ — и поэтому он быстрый. Изначально он создавался как серверное окружение для приложений, но разработчики начали использовать его для создания инструментов, помогающих автоматизировать выполнение локальных задач. В итоге возникшая вокруг Node.js новая экосистема инструментов (типа Grunt и Gulp), привела к трансформации процесса фронтенд-разработки.
Чтобы использовать все эти инструменты (или пакеты) в Node.js нам нужна возможность устанавливать и управлять ими. Для этого создан npm, пакетный менеджер Node.js. Он устанавливает нужные вам пакеты и предоставляет удобный интерфейс для работы с ними. Но перед тем как начать использовать npm, вам надо установить в своей системе Node.js.
Установка Node.js
Перейдите на страницу загрузок Node.js и скачайте нужную вам версию. Есть установщики для Windows и Mac, а также скомпилированные бинарники и исходный код для Linux. Кроме того, в Linux вы можете установить Node.js с помощью пакетного менеджера, все это описано в документации.
В этой статье мы будем использовать стабильную версию 5.7.0.
Посмотреть, где установлен Node и проверить версию можно следующими командами:
Чтобы удостовериться, что установка прошла успешно, выполним несколько команд в простой интерактивной среде Node (REPL).
Установка работает, поэтому теперь мы можем сфокусироваться на npm, который включен в установку.
Пакеты Node
С помощью npm можно устанавливать пакеты локально или глобально. В локальном режиме пакеты устанавливаются в каталог node_modules родительского каталога. Владельцем каталога является текущий пользователь. Глобальные пакеты устанавливаются в каталог /lib/node_modules/ , владельцем которого является root (префиксом в данном случае обычно является каталог /usr/ или /usr/local ). Это значит, что вам надо использовать sudo для глобальной установки пакетов, что может повлечь ошибки с полномочиями при разрешении сторонних зависимостей, а также создает проблему для безопасности. Изменим это:
Изменение места установки глобальных пакетов
Посмотрим, что скажет нам команда npm config .
Мы получили основную информацию об установке. Теперь важно узнать место установки глобальных пакетов:
Этот префикс мы хотим изменить так, чтобы устанавливать пакеты в свой домашний каталог. Для этого создайте в домашнем каталоге папку .node_modules_global и укажите ее в качестве места установки пакетов в конфигурации:
Внеся такую небольшую правку в конфигурацию, мы изменили место для глобальной установки пакетов. Также в нашем домашнем каталоге появился файл .npmrc .
Сам npm по-прежнему установлен в каталог, владельцем которого является root. Но так как мы поменяли место установки глобальных пакетов, мы можем использовать полученное преимущество. Мы установим npm еще раз, но теперь в место, указанное нами. Заодно мы получим последнюю версию npm.
Наконец, нам надо добавить .node_modules_global/bin в нашу переменную окружения $PATH , чтобы мы могли запускать глобальные пакеты из командной строки. Сделаем это, добавив следующую строку в файл .profile или .bash_profile и перезапустив терминал.
Теперь командная оболочка будет сразу находить пакеты, установленные в .node_modules_global/bin и использовать корректную версию npm .
Глобальная установка пакетов
На данный момент у нас уже есть один глобальный пакет — это сам пакет npm. Изменим это и установим еще один пакет, это будет UglifyJS (инструмент для минификации JavaScript). Для глобальной установки используется флаг --global , его можно записывать сокращенно -g .
Как вы можете видеть из вывода в консоль, у нас установлены дополнительные пакеты — это зависимости UglifyJS.
Вывод списка установленных пакетов
Мы можем вывести список глобально установленных пакетов с помощью команды npm list с опцией --global :
Такой вывод списка, со всеми зависимостями, перенасыщен. Мы можем выводить его в более читаемом виде с помощью опции --depth=0 :
Стало лучше — теперь мы видим только список установленных пакетов с номерами их версий, без зависимостей.
Теперь мы можем обрабатывать файлы JavaScript в терминале с помощью UglifyJS. Например, следующая команда сделает из файла example.js минифицированный example.min.js :
Локальная установка пакетов
Локальная установка используется в npm по умолчанию, то есть достаточно не использовать флаг --global . Пакет будет установлен в каталог node_modules родительского каталога. Создадим каталог с проектом в нашем домашнем каталоге:
Вывод списка локальных пакетов
Также как и в случае с глобальными пакетами, список локальных выводится командой npm list :
Как видите, мы можем устанавливать локальные пакеты, где угодно. Это также значит, что мы можем создать другой каталог и установить туда другую версию пакета (в нашем случае это библиотека underscore).
Удаление локальных пакетов
Так как npm это пакетный менеджер, у него есть возможность удалять пакеты. Предположим, что установленная в предыдущем примере версия underscore вызывает проблемы с совместимостью. Мы можем удалить этот пакет и поставить более старую версию.
Установка определенной версии пакета
Теперь установим нужную версию underscore. В команде установки номер версии указывается после символа @ :
Обновление пакета
В последней версии underscore исправили мешавший нам баг и мы хотим обновить версию этого пакета.
Примечание: для этой статьи, библиотека underscore была указана как зависимость в package.json (см. управление зависимостями).
Поиск пакетов
Мы уже пару раз использовали команду mkdir . Есть ли пакет node с подобным функционалом?
Такой пакет нашелся (mkdirp), установим его.
Теперь создадим файл mkdir.js :
И запустим его в терминале:
Управление кэшем
После установки пакета npm сохраняет его копию в кэше, поэтому при следующей его установке вам не нужно беспокоить сеть. Кэш хранится в каталоге .npm вашего домашнего каталога.
Этот каталог со временем замусоривается старыми пакетами и иногда его полезно очищать.
Управление зависимостями
В нашем проекте пока только два пакета, но их количество очень быстро возрастает. Установка зависимостей вручную очень неудобна, поэтому для управления ими мы можем использовать файл package.json , расположив его в корне нашего проекта. Он генерируется с помощью команды npm init , которая выведет в консоль несколько вопросов для создания файла:
В результате мы получим файл со следующим содержимым:
Вы можете сгенерировать это файл и более простым способом, с помощью опции --yes (автоматический ответ “да” на все вопросы):
Файл package.json будет создан в качестве name будет использовано название каталога.
Вы также можете добавить private: true , чтобы предотвратить случайную публикацию частных репозиториев или подавления любых предупреждений при выполнении npm install . Создадим новый каталог и используем package.json для установки зависимостей.
Это показывает, как просто мы можем установить пакеты, нужные нам в другом каталоге на основе нашего файла package.json . Но как поддерживать его актуальность при установке новых пакетов? Для этого используется флаг --save .
Наш файл package.json также обновился:
Менеджеры версий
Есть пара инструментов, позволяющих использовать несколько версий Node.j на одном компьютере. Первая это n, другая — nvm(Node Version Manager). Если вас интересует эта возможность, подробнее о ней можно узнать из следующей статьи: Install Multiple Versions of Node.js using nvm.
Заключение
В этой статье освещены основы работы с npm. Я показал, как установить Node.js, как изменить место установки глобальных пакетов (так мы можем избежать использования sudo ) и как установить пакеты локально и глобально. Я также рассмотрел удаление, обновление и установку определенной версии пакета, а также управление зависимостями проекта.
В каталоге npm тысячи пакетов и их число будет расти, с учетом анонса jQuery о публикации всех плагинов как пакетов npm.