Если кто не знаком с предметной областью, то NPM — node package manager (аналог bundler/composer/easy_install/nuget) – средство для управления зависимостями в вашем Node.js проекте, что по совместительсву может выполнять некоторое количество полезных функций. Написан Айзеком Шлютером, что его достаточно радикальным образом продвигал в начале своей истории (рассылая всем существующим Node.js проектам пулл-реквесты с добавлением package.json — манифестом зависимостей).
Все нижеприведенные вещи известны многим, но для некоторых это может стать приятным открытием, что сэкономит некоторое количество набираемых в символов.
pre-/post- myscript
Иногда, в целях автоматизации некоторой рутины, но при малом желании тащить за собой N мегабайт зависимостей в виде разных билд-инструментов, а в некоторых случаях под впечатлением от статьи за авторством @substack'а, разработчики могут начать в своих npm script'ах писать длиннющие строки, состоящие из перечня команд и '&&'. По крайней мере, одним из выходов может служить разбитие одной сложной команды на несколько более простых. Самым замечательным является тот факт, что когда вы запускаете свой скрипт npm run-script myscript
, npm также попытается выполнить команды, что занесены в premyscript и postmyscript перед и после выполнения вашего скрипта соответственно. Таким образом, 3 сложных команды, что раньше составляли один скрипт, можно просто разнести в три скрипта.
Код, что отвечает за это, довольно таки прост, и пытается добавить к названию команды pre-/post- и запустить их в случае, если это сама по себе не pre/post команда и не команда 'restart', что обрабатывается особым способом.
npm run вместо run-script, npm i вместо npm install
Заголовок, в принципе, всё описывает: очень часто вместо «npm run-script» можно увидеть «npm run», или «npm i», что соответствует запуску команды «npm install». Код, что делает это, прост: используя библиотеку abbrev-js все команды из списка превращаются в огромный словарь, в котором ключами служат сокращения слов, вида:
{
i: 'install',
in: 'install',
ins: 'install',
...
И запускает соответствующую команду.
Нет необходимости писать пути для исполняемых файлов в скриптах
Иногда npm скрипты используются, чтобы запускать локально установленные npm пакеты с бинарниками. Но часто люди не знают об одной приятно особенности: npm во время исполнения добаляет папку node_modules/.bin в аналог переменой PATH. То есть, если у вас локально установленная mocha, вам не нужно писать
"scripts": {
"test": "./node_modules/.bin/mocha"
}
А достаточно лишь написать "test": "mocha"
. Приятным бонусом этого является то, что разработчики под виндоус перестанут жаловаться на то, что у них ничего не запускается (причина в том, что используются разные разделители в пути).
Бонус: require на файлах модуля
Команда require, оказывается, при работе с названиями модулей (а не относительными путями) может не только загрузить index.js/index.node файл из корня нашего модуля, что установлен в node_modules, но и предоставить возможность загрузить произвольный файл изнутри модуля (нарушая любую инкапсуляцию, но иногда может быть полезно). Поэтому можно делать require('module/lib/hidden-stuff')
.
Бонус #2: пасхалки в npm
В нпм есть парочку забавных пасхалок.
Автор: BenalishTrapper