- PVSM.RU - https://www.pvsm.ru -
Если кто не знаком с предметной областью, то NPM [1] — node package manager (аналог bundler/composer/easy_install/nuget) – средство для управления зависимостями в вашем Node.js проекте, что по совместительсву может выполнять некоторое количество полезных функций. Написан Айзеком Шлютером [2], что его достаточно радикальным образом продвигал в начале своей истории (рассылая всем существующим Node.js проектам пулл-реквесты с добавлением package.json — манифестом зависимостей).
Все нижеприведенные вещи известны многим, но для некоторых это может стать приятным открытием, что сэкономит некоторое количество набираемых в символов.
Иногда, в целях автоматизации некоторой рутины, но при малом желании тащить за собой N мегабайт зависимостей в виде разных билд-инструментов, а в некоторых случаях под впечатлением от статьи [3] за авторством @substack'а [4], разработчики могут начать в своих npm script'ах [5] писать длиннющие строки, состоящие из перечня команд и '&&'. По крайней мере, одним из выходов может служить разбитие одной сложной команды на несколько более простых. Самым замечательным является тот факт, что когда вы запускаете свой скрипт npm run-script myscript, npm также попытается выполнить команды, что занесены в premyscript и postmyscript перед и после выполнения вашего скрипта соответственно. Таким образом, 3 сложных команды, что раньше составляли один скрипт, можно просто разнести в три скрипта.
Код, что отвечает за это, довольно таки прост [6], и пытается добавить к названию команды pre-/post- и запустить их в случае, если это сама по себе не pre/post команда и не команда 'restart', что обрабатывается особым способом.
Заголовок, в принципе, всё описывает: очень часто вместо «npm run-script» можно увидеть «npm run», или «npm i», что соответствует запуску команды «npm install». Код, что делает это, прост [7]: используя библиотеку abbrev-js [8] все команды из списка превращаются в огромный словарь, в котором ключами служат сокращения слов, вида:
{
i: 'install',
in: 'install',
ins: 'install',
...
И запускает соответствующую команду.
Иногда npm скрипты используются, чтобы запускать локально установленные npm пакеты с бинарниками. Но часто люди не знают об одной приятно особенности: npm во время исполнения добаляет [9] папку node_modules/.bin в аналог переменой PATH. То есть, если у вас локально установленная mocha, вам не нужно писать
"scripts": {
"test": "./node_modules/.bin/mocha"
}
А достаточно лишь написать "test": "mocha". Приятным бонусом этого является то, что разработчики под виндоус перестанут жаловаться на то, что у них ничего не запускается (причина в том, что используются разные разделители в пути).
Команда require, оказывается, при работе с названиями модулей (а не относительными путями) может не только загрузить index.js/index.node файл из корня нашего модуля, что установлен в node_modules, но и предоставить возможность загрузить произвольный файл изнутри модуля (нарушая любую инкапсуляцию, но иногда может быть полезно). Поэтому можно делать require('module/lib/hidden-stuff').
В нпм есть парочку забавных пасхалок [10].
Автор: BenalishTrapper
Источник [11]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/javascript/65718
Ссылки в тексте:
[1] NPM: http://github.com/npm/npm
[2] Айзеком Шлютером: https://github.com/isaacs
[3] статьи: http://substack.net/task_automation_with_npm_run
[4] @substack'а: https://www.npmjs.org/~substack
[5] npm script'ах: https://www.npmjs.org/doc/misc/npm-scripts.html
[6] таки прост: https://github.com/npm/npm/blob/master/lib/run-script.js#L115-L124
[7] прост: https://github.com/npm/npm/blob/master/lib/npm.js#L161
[8] abbrev-js: https://github.com/isaacs/abbrev-js
[9] добаляет: https://github.com/npm/npm/blob/master/lib/utils/lifecycle.js#L80
[10] забавных пасхалок: https://github.com/npm/npm/blob/master/lib/npm.js#L154-L156
[11] Источник: http://habrahabr.ru/post/230821/
Нажмите здесь для печати.