13 приёмов работы с npm, которые помогают экономить время
Каждый день миллионы разработчиков, создавая свои JavaScript-приложения, обращаются к npm (или к Yarn). Выполнение команд наподобие npm init или npx create-react-app стало привычным способом начала работы над практически любым JavaScript-проектом. Это может быть сервер, клиент, или даже настольное приложение.
Но утилита npm способна не только на инициализацию проектов или на установку пакетов. Автор материала, перевод которого мы сегодня публикуем, хочет рассказать о 13 хитростях npm, которые позволят выжать из этой системы всё, что можно. Здесь будут рассмотрены приёмы разного масштаба — от использования сокращений команд до настройки поведения npm init .

Многие программисты пользуются npm ежедневно. Это значит, что в долгосрочной перспективе изменить что-то в лучшую сторону может даже небольшая экономия времени. Этот материал рассчитан, преимущественно, на начинающих разработчиков и на разработчиков среднего уровня. Однако даже если вы — профессионал, автор материала надеется, что вы сможете найти здесь пару интересных вещей, с которыми вы раньше не сталкивались.
Если вы совершенно не знакомы с npm — знайте, что интересующая нас программа устанавливается вместе с Node.js. Если вы работаете в Windows, то, чтобы воспроизвести кое-что из того, о чём здесь пойдёт речь, рекомендуется установить Git Bash.
1. Краткие варианты записи основных команд
Начнём с основ. Потратив немного времени на изучение сокращённых вариантов самых распространённых команд npm, вы сэкономите себе немало времени в будущем.
- Установка пакетов. Обычный вариант: npm install . Сокращённый вариант: npm i .
- Запуск тестов. Обычный вариант: npm test . Сокращённый вариант: npm t .
- Вызов справки. Обычный вариант: npm —help . Сокращённый вариант: npm -h .
- Флаг глобальной установки. Обычный вариант: —global . Сокращённый вариант: -g .
- Флаг установки пакета в качестве зависимости разработки. Обычный вариант: —save-dev . Сокращённый вариант: -D .
- Принятие установок npm init , применяемых по умолчанию. Обычный вариант: npm init —yes или npm init —force . Сокращённый вариант: npm init -y или npm init -f .
▍Краткие варианты записи менее распространённых команд
Вот ещё несколько полезных сокращений, которые, однако, используются не так широко как те, что мы только что рассмотрели.
- Сохранение пакета в виде опциональной зависимости. Обычный вариант: —save-optional . Сокращённый вариант: -O .
- Сохранение сведений о точной версии пакета. Обычный вариант: —save-exact . Сокращённый вариант: -E .
▍Сокращение для корневой директории
Обычно символ «точка» ( . ) используется для представления корневой директории приложения, или (в зависимости от контекста) — для представления точки входа в приложение. В npm это — то, что задано в качестве значения свойства main в файле package.json :
Это сокращение можно использовать, например, с командами наподобие npx create-react-app . Так, вместо того, чтобы запускать эту команду в виде npx create-react-app my-app (что приведёт к созданию новой папки my-app ), можно запустить эту команду так: npx create-react-app . (обратите внимание на точку, которая идёт после команды). Это позволит создать шаблонный проект React-приложения в той папке, в которой вы находитесь в момент запуска команды.
2. Установка значений по умолчанию для npm init
Постоянно запуская команду npm init для создания нового проекта, вы скорее всего обнаружите, что снова и снова вводите в ответ на вопросы системы одни и те же данные. Например — вполне вероятно то, что именно вы являетесь автором большинства создаваемых вами проектов. Для того чтобы сэкономить время на вводе одних и тех же данных, вы можете установить собственные значения по умолчанию для соответствующих полей:
Для того чтобы проверить правильность добавления подобных сведений в систему — введите команду npm config edit . Это приведёт к открытию конфигурационного файла в системном редакторе. Если вы хотите отредактировать глобальные параметры npm — воспользуйтесь командой npm config edit -g .
Для того чтобы вернуться к настройкам по умолчанию — можете воспользоваться следующим скриптом. Его первая строка удаляет из файла конфигурационные данные, а вторая заполняет его значениями по умолчанию.
Вышеприведённый скрипт сбрасывает значения по умолчанию для пользователя. Следующий скрипт сбрасывает к исходному состоянию глобальные значения по умолчанию:
3. Кросс-платформенные скрипты
Любой код, выполняемый в командной строке, может столкнуться с проблемами совместимости. Особенно это касается несовместимости между системами, основанными на Windows и на Unix (сюда входят Mac и Linux). Это — не проблема, если над неким проектом работаете вы и только вы. Но во многих случаях кросс-платформенная совместимость скриптов весьма важна. Например, работа независимо от операционной системы — это огромный плюс для любого опенсорсного, учебного или демонстрационного проекта.
К счастью, решить проблему совместимости скриптов не особенно сложно. В нашем распоряжении есть несколько вариантов. Однако тут мне хотелось бы рассказать об одном из них, о том, используя который я получил наилучшие результаты. Речь идёт о пакете cross-env. Его нужно установить как зависимость разработки с использованием команды npm i -D cross-env . Затем нужно поставить cross-env перед каждой переменной окружения. Например — это может выглядеть так:
Я обнаружил, что пакет cross-env — это самый удобный инструмент для достижения кросс-платформенной совместимости скриптов. Но вам полезно будет взглянуть ещё и на следующие два популярных инструмента, которые могут помочь в решении этой задачи:
- Пакет rimraf. Его, для запуска кросс-платформенных скриптов, можно установить глобально.
- Пакет ShellJS. Это — переносимая Node.js-реализация командной оболочки Unix.
4. Параллельный запуск скриптов
Для того чтобы организовать последовательное выполнение команд в командной оболочке Linux используется конструкция && . А как насчёт параллельного запуска скриптов? Для достижения этой цели можно подобрать соответствующий npm-пакет. Самыми популярными пакетами такого рода являются concurrently и npm-run-all. Здесь мы продемонстрируем применение пакета concurrently.
Для начала выбранный пакет нужно установить в качестве зависимости разработки: npm i -D concurrently . Затем в package.json можно воспользоваться конструкцией следующего вида:
5. Запуск скриптов, находящихся в различных директориях
Иногда приходится сталкиваться с приложениями, в которых имеется несколько файлов package.json , расположенных в различных директориях. Удобно было бы, например, запускать объявленные в них скрипты, находясь в корневой директории проекта. Это — куда лучше, чем необходимость путешествовать по разным папкам всякий раз, когда нужно запустить некий скрипт. Для того чтобы это сделать можно воспользоваться следующими двумя подходами.
Для начала, можно воспользоваться командой cd для организации автоматического перехода в нужную директорию. Выглядеть это может примерно так:
Но эту задачу можно решить и более интересным способом. Он заключается в использовании флага —prefix , с помощью которого можно указать путь:
Ниже показан пример применения этого решения из реального приложения. Тут нам нужно выполнить npm start для клиентской и серверной частей проекта. Их код, соответственно, находится в папках client и server .
6. Откладывание запуска скрипта до тех пор, пока не будет доступен некий ресурс
При разработке фулстек-приложений часто возникает нужда в том, чтобы запускать и клиентскую, и серверную часть приложения. Пакет wait-on позволяет обеспечить синхронизацию выполнения неких процессов. В нашем случае нужно, чтобы перед запуском клиентской части приложения был бы доступным определённый порт.
Например, есть dev-скрипт, который используется в Electron-приложении, интерфейс которого написан с помощью React. Скрипт, используя concurrently , параллельно запускает презентационный слой приложения и окно Electron. Но с использованием wait-on можно сделать так, чтобы окно Electron открылось бы только тогда, когда презентационный слой React будет готов к работе и окажется доступен по адресу http://localhost:3000 . Вот как выглядит использование wait-on :
Кроме того, стандартным поведением React-проектов является автоматическое открытие окна браузера. В случае использования React с Electron в этом нет необходимости. Отключить это можно с помощью переменной окружения BROWSER=none , перед которой, ради кросс-платформенной совместимости решения, находится команда cross-env .
7. Вывод списка доступных скриптов и работа с ними
Для того чтобы вывести список скриптов, доступных в package.json , достаточно перейти в корневую директорию проекта и выполнить в терминале команду npm run .
Но есть и ещё более удобный способ вывода списка скриптов. При его использовании нужный скрипт можно сразу же выбрать из списка и запустить. Для того чтобы воспользоваться этим способом работы со скриптами, нам понадобится глобально установить модуль ntl (Npm Task List):
Затем в папке проекта нужно выполнить команду ntl . Она выведет список доступных скриптов и даст возможность выбрать скрипт, который нужно запустить. Вот как это выглядит.

Использование команды ntl
Эта возможность может оказаться очень кстати в том случае, если вы не знаете точно о том, какие скрипты есть в проекте. Хороша она и в тех случаях, когда программист хочет заменить ввод длинной команды для запуска скрипта на ввод короткой команды и быстрое нажатие ещё нескольких клавиш на клавиатуре.
8. Запуск pre-скриптов и post-скриптов
Возможно, вы знакомы со скриптами prebuild и postbuild , которые позволяют запускать некий код до и после запуска скрипта build . Такие вот pre- и post-скрипты можно определить и для любого другого скрипта. Включая те, описания которых добавляет в p ackage.json сам программист.
Это не только позволяет сделать код чище, но и способствует запуску pre- и post-скриптов в изоляции.
9. Управление версией приложения
Вместо того, чтобы вручную менять версию приложения, программист может воспользоваться специальными командами npm . Для того чтобы увеличить соответствующую часть номера версии приложения, можно воспользоваться командой npm version , за которой идёт major , minor или patch :
В зависимости от того, как часто вы обновляете своё приложение, вы можете сэкономить время, задав автоматическое увеличение номера версии каждый раз, когда развёртываете новую версию приложения. Например — так:
10. Редактирование package.json из командной строки
Файл package.json — это обычный json-файл, поэтому его можно редактировать прямо из командной строки с использованием утилиты json. Это открывает новые возможности в тех ситуациях, когда нужно изменить package.json , позволяя создавать собственные сокращённые варианты команд. Установим пакет json глобально:
Затем утилиту json можно использовать для быстрого редактирования файла с помощью ключа -I . Например, для того чтобы добавить в файл новый скрипт foo со значением bar , можно воспользоваться такой командой:
В следующем разделе вы увидите более практичный пример использования утилиты json .
11. Автоматизация настройки и открытия репозитория
Если в вашем файле package.json есть запись «repository» — это значит, что вы можете открыть страницу репозитория в браузере, используемом в системе по умолчанию. Для этого применяется команда npm repo .
Если ваш проект уже подключён к удалённому репозиторию и у вас установлена утилита командной строки git , это значит, что выяснить адрес своего свой репозитория вы можете с помощью такой команды:
Но и это ещё не всё. Если вы, в соответствии с предыдущим советом, установили у себя утилиту json , то вы можете воспользоваться следующим скриптом для автоматического добавления корректных сведений о репозитории в package.json :
12. Создание собственного скрипта, управляющего работой команды npm init
Теперь поговорим о решении более масштабной задачи. А именно, мы собираемся разработать собственный скрипт, управляющий работой команды npm init , который принимает URL GitHub-репозитория и автоматически отправляет в него первый коммит. Здесь мы поговорим о том, как создавать подобные скрипты. А в следующем разделе, который будет представлять наш последний совет, мы поговорим о работе с git .
Настроить поведение команды npm init можно с помощью файла .npm-init.js . Создадим такой файл в домашней директории текущего пользователя (в Windows это обычно C:/Users/<username> , а в Mac — /Users/<username> ). После этого выполним следующую команду, указывающую npm на то, где именно находится этот файл:
Прежде чем заниматься интеграцией c git , давайте посмотрим на простой пример файла .npm-init.js , в котором воспроизведены вопросы, которые система задаёт пользователю при использовании команды npm init без дополнительных настроек:
Каждый вопрос строится по следующему шаблону:
Для того чтобы указать некое значение и не задавать при этом вопрос пользователю, достаточно просто убрать метод prompt .
Если вы хотите вернуться к стандартным настройкам npm init — просто удалите файл .npm-init.js .
13. Отправка первого коммита в GitHub-репозиторий с помощью npm init
Для того чтобы выполнять команды git в файле .npm-init.js нам понадобится найти способ работы с командной строкой. Для этого можно воспользоваться модулем child_process . Мы подключаем его в верхней части файла, и, так как нам нужна только функция execSync , импортируем лишь её, воспользовавшись деструктурированием:
Кроме того, создадим вспомогательную функцию, которая выводит результаты работы нашей функции в консоль:
И, наконец, давайте создадим соответствующий prompt-блок для обработки URL GitHub-репозитория. Если URL имеется в распоряжении скрипта — мы создадим файл README.md и отправим в репозиторий первый коммит.
Итак, одним из элементов объекта module.exports файла .npm-init.js должен быть следующий код:
Вот как после этого добавления должен выглядеть полный код файла .npm-init.js :
Вот как выглядит файл package.json , который система создаёт с использованием этого .npm-init.js :
Настраивая процесс инициализации новых проектов, вы можете пойти и дальше. Например — сделать так, чтобы при создании проекта создавался бы и новый репозиторий для него.
Управление модулями Node.js с помощью npm и package.json
Благодаря высокой производительности ввода/вывода (I/O), хорошо известному синтаксису JavaScript и другим удобным функциям Node.js быстро стал популярной средой выполнения для веб-разработки бэкенда. Но по мере роста изначально сложного приложения управлять его кодовой базой и ее зависимостями становится все труднее. Node.js решает эту проблему с помощью модулей. Модули – это отдельные файлы JavaScript, содержащие функции или объекты, которые могут использоваться другими программами или модулями. Набор из одного или нескольких модулей обычно называется пакетом, такими пакетами обычно управляют менеджеры пакетов.
npm (или Node.js Package Manager) – это самый популярный стандартный менеджер пакетов в экосистеме Node.js. В основном он используется для установки и управления внешними модулями в проектах, а также для установки широкого спектра инструментов CLI и запуска сценариев. npm отслеживает установленные в проекте модули с помощью файла package.json, который находится в каталоге проекта и содержит:
- Все необходимые проекту модули и их установленные версии.
- Все метаданные проекта, такие как автор, лицензия и т.п.
- Скрипты, которые можно запускать для автоматизации задач в рамках проекта.
По мере усложнения проектов Node.js файл package.json становится особенно важным: он обеспечивает удобное управление метаданными и зависимостями, а также предоставляет вам более предсказуемые сборки, поскольку все внешние зависимости не изменятся. Файл будет автоматически отслеживать всю нужную информацию.
Редактировать этот файл можно и напрямую, но вам редко придется это делать.
В этом руководстве вы узнаете, как управлять пакетами с помощью npm. Сначала мы создадим файл package.json и ознакомимся с его содержимым. Затем мы попробуем использовать его для отслеживания всех модулей вашего проекта. Мы также составим полный список зависимостей пакета, обновим свои пакеты, удалим их и выполним аудит, чтобы обнаружить в пакетах уязвимости.
Требования
Для работы вам понадобится установка Node.js на вашей машине разработки. Здесь мы используем версию 10.17.0. Чтобы установить Node.js на macOS, следуйте мануалу Установка Node.js и настройка локальной среды разработки в macOS. Чтобы установить Node.js в Ubuntu 18.04 с помощью архива PPA, читайте Установка Node.js в Ubuntu 18.04.
Пакетный менеджер npm устанавливается вместе с Node.js; в руководстве мы используем его версию 6.11.3.
1: Создание файла package.json
Мы начнем нашу работу с создания тестового проекта – вымышленного модуля Node.js по имени locator, который принимает IP-адрес пользователя и возвращает страну происхождения этого адреса. Писать код модуля вам не придется: мы просто примем такой условный контекст, чтобы рассмотреть пакеты, которые были бы актуальны в подобном проекте.
Сначала создайте файл package.json для хранения метаданных о проекте и управления зависимыми модулями проекта Node.js. Как следует из расширения, это файл JSON (JavaScript Object Notation) – это стандартный формат для совместного использования кода, основанный на объектах JavaScript; JSON состоит из данных, хранящихся в виде пар «ключ-значение».
Читайте также: Основы работы с JSON
Поскольку файл package.json содержит множество свойств, его может быть сложно создать вручную с нуля, без шаблона. Чтобы упростить вам работу, npm предоставляет команду init. Это интерактивная команда, которая задает пользователю ряд вопросов и на основе полученных ответов создает файл package.json.
Команда init
Давайте настроим тестовый проект, чтобы позже попрактиковаться в управлении модулями на его примере. В оболочке создайте новую папку locator:
Перейдите в нее:
Теперь инициализируйте интерактивную командную строку:
Примечание: Если вы собираетесь использовать Git для контроля версий вашего кода, сначала создайте репозиторий Git, а затем запустите команду npm init. Команда автоматически поймет, что находится в папке с поддержкой Git. Если у вас установлен удаленный репозиторий Git, команда автоматически заполнит в файле package.json поля repository, bugs и homepage. Если вы инициализировали репозиторий после создания файла package.json, вам придется добавить эту информацию самостоятельно.
Читайте также:
Вы получите следующий вывод:
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (locator)
Сначала вам будет предложено ввести название нового проекта. По умолчанию команда предполагает, что это имя папки, в которой вы находитесь в данный момент. Значения по умолчанию для каждого свойства указаны в скобках (). Поскольку значение name по умолчанию нам подходит, нажмите Enter, чтобы принять его.
Следующее значение, которое нужно ввести, – это version, версия. Как и name, это поле обязательно нужно заполнить, если ваш проект будет доступен другим пользователям в репозитории пакетов npm.
Примечание: Пакеты Node.js должны соответствовать семантическому управлению версиями (Semantic Versioning, semver). Исходя из этого, первое число в номере версии – это версия MAJOR (оно изменяется только при изменении API). Второе число – версия MINOR (изменяется при добавлении функций). Последнее число в номере версии – версия PATCH (это число изменяется при исправлении ошибок).
Нажмите Enter, чтобы принять номер версии по умолчанию.
Следующее поле – описание, description – полезная строка, объясняющая, что умеет этот модуль Node.js. Наш вымышленный проект locator принимает IP-адрес пользователя и возвращает страну происхождения этого адреса. Потому в поле description можно ввести что-то вроде:
Finds the country of origin of the incoming request
и нажать Enter. Описание очень помогает при поиске модулей.
В следующем запросе команда предложит указать точку входа, entry point. Если кто-то установит ваш модуль и объявит его зависимостью проекта, то значение entry point будет первой частью загруженной программы. Здесь следует указать относительный путь к файлу JavaScript, который будет добавлен в свойство main в package.json. Нажмите Enter, чтобы сохранить значение по умолчанию.
Затем вам будет предложено указать test command – это исполняемый скрипт или команда для тестового запуска вашего проекта. Многие популярные модули Node.js тестируются с помощью Mocha, Jest, Jasmine или других тестовых фреймворков. Тестирование выходит за рамки данной статьи, потому пока что оставьте этот параметр пустым и нажмите Enter, чтобы продолжить.
Потом команда init запросит репозиторий проекта на GitHub. В этом мануале мы не будем использовать его, поэтому также оставьте поле пустым.
После репозитория команда запрашивает ключевые слова, keywords. Это свойство представляет собой массив строк, содержащий полезные термины, которые люди могут использовать для поиска вашего проекта. Лучше всего использовать здесь небольшой набор слов, действительно имеющих отношение к вашему проекту – тогда поиск будет более точным.
Перечислите эти ключевые слова через запятую в виде строки. Для нашего тестового проекта мы используем ip, geo, country. Следовательно, в готовом пакете package.json в массиве keywords будет три элемента.
Следующее поле – author, автор. Оно поможет пользователям вашего модуля связаться с вами в случае необходимости. Например, если кто-то обнаружит в модуле уязвимость, он сможет сообщить вам о проблеме, чтобы вы ее исправили.
Поле author представляет собой строку в следующем формате: “имя \<почта\> (сайт)”. В нашем случае она может выглядеть так: “8host \<8host@your_domain\> (https://your_domain)”. Электронную почту и данные о веб-сайте указывать не обязательно – достаточно просто ввести имя автора. Добавьте контактные данные автора и подтвердите их, нажав Enter.
Теперь вам будет предложено ввести лицензию, license. Эта строка определяет юридические права пользователей и ограничения на использование вашего модуля. Многие модули Node.js имеют открытый исходный код, поэтому npm по умолчанию устанавливает ISC.
На этом этапе вы должны рассмотреть варианты лицензирования и решить, что лучше всего подходит для вашего проекта. Подробные сведения о разных типах открытых лицензий можно найти в этом списке. Если вы не хотите предоставлять лицензию закрытого репозитория, вы можете ввести UNLICENSED. Мы будем использовать здесь стандартную лицензию ISC. Введите ISC в командную строку и нажмите Enter, чтобы завершить процесс создания файла.
Теперь команда init выведет на экран файл package.json, который она собирается создать. Наш файл будет выглядеть примерно так:
About to write to /home/8host/locator/package.json:
«description»: «Finds the country of origin of the incoming request»,
«test»: «echo \»Error: no test specified\» && exit 1″
«author»: «8host <8host@your_domain> (https://your_domain)»,
Если данные в файле соответствуют вашим ожиданиям, нажмите Enter, чтобы завершить этот процесс и создать файл package.json. С помощью этого файла вы будете вести учет модулей, которые вы устанавливаете для своего проекта.
Теперь, когда у вас есть файл package.json, вы можете попробовать выполнить установку модулей.
2: Установка модулей
Для выполнения вспомогательных задач в разработке программного обеспечения часто используются внешние библиотеки. Это позволяет разработчикам сосредоточиться на бизнес-логике, быстрее и эффективнее создавать приложение.
Например, если нашему условному модулю locator нужно отправить внешний API запрос для получения географических данных, мы могли бы упростить эту задачу с помощью библиотеки HTTP. Поскольку основная цель нашего модуля – сообщить пользователю соответствующие географические данные, мы могли бы также установить пакет, который упростит выполнение HTTP-запросов, и не писать самостоятельно код, который выходит за рамки модуля.
Давайте остановимся на этом примере. В приложении locator мы будем использовать библиотеку axios, которая поможет обрабатывать HTTP-запросы. Установите ее:
npm install axios —save
Команда npm install (вы можете также использовать ее сокращенный вариант, npm i) установит пакет, имя которого вы укажете. Чтобы установить несколько пакетов, укажите их имена через пробел. В данном случае мы устанавливаем только axios. В конце команды можно указать опции, в данном случае мы используем опцию –save, которая указывает, что библиотека axios сохранится как зависимость проекта.
NPM. Package.json. Установка модулей. Определение команд¶
Кроме встроенных и кастомных модулей Node.js существует огромный пласт различных библиотек и фреймворков, разнообразных утилит, которые создаются сторонними производителями и которые также можно использовать в проекте, например, express, grunt, gulp и так далее. И они тоже нам доступны в рамках Node.js. Чтобы удобнее было работать со всеми сторонними решениями, они распространяются в виде пакетов. Пакет по сути представляет набор функциональностей.
Для автоматизации установки и обновления пакетов, как правило, применяются систему управления пакетами или менеджеры. Непосредственно в Node.js для этой цели используется пакетный менеджер NPM (Node Package Manager). NPM по умолчанию устанавливается вместе с Node.js, поэтому ничего доустанавливать не требуется. Но можно обновить установленную версию до самой последней. Для этого в командной строке/терминале надо запустить следующую команду:
Чтобы узнать текущую версию npm , в командной строке/терминале надо ввести следующую команду:
Для нас менеджер npm важен в том плане, что с его помощью легко управлять пакетами. К примеру, создадим на жестком диске новую папку modulesapp (В моем случае папка будет находиться по пути C:\node\modulesapp ).
Далее для примера установим в проект express . Express представляет легковесный веб-фреймворк для упрощения работы с Node.js. В данном случае мы не будем пока подробно рассматривать фреймворк Express, так как это отдельная большая тема. А используем его лишь для того, чтобы понять, как устанавливаются сторонние модули в проект.
Для установки функциональности Express в проект вначале перейдем к папке проекта с помощью команды cd . Затем введем команду

После установки express в папке проекта modulesapp появится подпапка node_modules , в которой будут храниться все установленные внешние модули. В частности, в подкаталоге node_modules/express будут располагаться файлы фреймворка Express.
Далее определим файл простейшего сервера. Для этого в корневую папку проекта modulesapp добавим новый файл app.js :
Первая строка получает установленный модуль express , а вторая создает объект приложения.
В Express мы можем связать обработку запросов с определенными маршрутами. Например, / — представляет главную страницу или корневой маршрут. Для обработки запроса вызывается функция app.get() . Первый параметр функции — маршрут, а второй — функция, которая будет обрабатывать запрос по этому маршруту.
И чтобы сервер начал прослушивать подключения, надо вызвать метод app.listen() , в который передается номер порта.
Запустим сервер командой node app.js :

И в адресной строке браузера введем адрес http://localhost:3000/ :

Файл package.json¶
Для более удобного управления конфигурацией и пакетами приложения в npm применяется файл конфигурации package.json . Так, добавим в папку проекта modulesapp новый файл package.json :
Здесь определены только две секции: имя проекта — modulesapp и его версия — 1.0.0 . Это минимально необходимое определение файла package.json . Данный файл может включать гораздо больше секций. Подробнее можно посмотреть в документации.
Далее удалим из проекта каталог node_modules . То есть в папке проекта modulesapp будут два файла app.js и package.json .
Теперь снова добавим express с помощью следующей команды:
Флаг —save указывает, что информацию о добавленном пакете надо добавить в файл package.json .

И после выполнения команды, если мы откроем файл package.json , то мы увидим информацию о пакете:
Информация обо всех добавляемых пакетах, которые используются при запуске приложения, добавляется в секцию dependencies .
Файл package.json играет большую роль и может облегчить разработку в различных ситуациях. Например, при размещении в разных репозиториях нередко мы ограничены выделяемым дисковым пространством, тогда как папка node_modules со всеми загруженными пакетами может занимать довольно приличное пространство. В этом случае удобнее разместить основной код проекта без node_modules . В этом случае мы можем определить все пакеты в файле package.json , а затем для загрузки всех пакетов выполнить команду
Эта команда возьмет определение всех пакетов из секций dependencies и загрузит их в проект.
devDependencies¶
Кроме пакетов, которые применяются в приложении, когда оно запущено, например, express, то есть в состоянии «production», есть еще пакеты, которые применяются при разработке приложения и его тестировании. Такие пакеты добавляются в другую секцию — devDependencies . В вышеприведенном примере она не определена, но если бы мы добавили какой-нибудь grunt или gulp, то они бы были именно в секции devDependencies .
Например, загрузим в проект пакет jasmine-node , который используется для тестирования приложения:
Флаг —save-dev указывается, что информацию о пакете следует сохранить в секции devDependencies файла package.json :
Удаление пакетов¶
Для удаления пакетов используется команда npm uninstall . Например:
Эта команда удаляет пакет из папки node_modules , в то же время в файле package.json информация о данном пакете остается. Чтобы удалить информацию также и из package.json , применяется флаг —save :
Семантическое версионирование¶
При определении версии пакета применяется семантическое версионирование. Номер версии, как правило, задается в следующем формате major.minor.patch . Если в приложении или пакете обнаружен какой-то баг и он исправляется, то увеличивается на единицу число patch . Если в пакет добавляется какая-то новая функциональность, которая совместима с предыдущей версией пакета, то это небольшое изменение, и увеличивается число minor . Если же в пакет вносятся какие-то большие изменения, которые несовместимы с предыдущей версией, то увеличивается число major . То есть глядя на разные версии пакетов, мы можем предположить, насколько велики в них различия.
В примере с express версия пакета содержала, кроме того, дополнительный символ карет: ^4.14.0 . Этот символ означает, что при установке пакета в проект с помощью команды npm install будет устанавливаться последняя доступная версия от 4.14.0 . Фактически это будет последняя доступная версия в промежутке от 4.14.0 до 5.0.0 ( >=4.14.0 и <5.0.0 ). Более подробно про семантическое версионирование в npm можно посмотреть здесь.
Команды npm¶
NPM позволяет определять в файле package.json команды, которые выполняют определенные действия. Например, определим следующий файл app.js :
В данном случае мы получаем переданные при запуске приложению параметры.
И определим следующий файл package.json :
Здесь добавлена секция scripts , которая определяет две команды. Вообще команд может быть много в соответствии с целями и задачами разработчика.
Первая команда называется start . Она по сути выполняет команду node app.js , которая выполняет код в файле app.js
Вторая команда называется dev . Она также выполняет тот же файл, но при этом также передает ему два параметра.
Названия команд могут быть произвольными. Но здесь надо учитывать один момент. Есть условно говоря зарезервированные названия для команд, например, start , test , run и ряд других. Их не очень много. И как раз первая команда из выше определенного файла package.json называется start . И для выполнения подобных команд в терминале/командной строке надо выполнить команду
Например, для запуска команды start
Команды с остальными названия, как например, dev в вышеопределенном файле, запускаются так: