name
Пока мы не публикуем пакет в репозитории, поле можно и «зюками» забить. Вопрос в том, что это поле удобно использовать для именования файла инсталляции или, например, для показа имени продукта на его веб-странице. В общем «как вы яхту назовёте,..»
version
Основная идея — не забывать увеличивать номер версии при расширении функциональности, исправлении ошибок,… К сожалению, у нас в конторе ещё можно встретить продукты с неизменной версией 0.0.0. А потом поди догадайся, какая именно функциональность работает у клиента…
main
Это
поле сообщает, какой файл будет запущен при старте нашего приложения (`npm start`). Если пакет используется в качестве зависимости, то какой файл будет импортирован при использовании нашего модуля другим приложением. Текущим каталогом считается каталог, где находится файл `package.json`.
А ещё, если мы, например, используем
vscode, то файл, указанный в этом поле, будет запущен при вызове отладчика или при запуске команды «выполнить».
Расширение ".js" может быть опущено. Это скорее следствие всех возможных вариантов использования, поэтому в документации напрямую не прописано.
engines
Это поле содержит кортеж: { «node»:
version, «npm»:
version,… }.
Мне известны поля «node» и «npm». Они определяют версии node.js и npm, необходимые для работы нашего приложения. Версии проверяются при выполнении команды «npm install».
Поддерживается стандартный синтаксис определения версий пакетов зависимостей: без префикса (единственная версия), префикс "~" (два первых числа версии должны совпадать) и префикс "^" (только первое число версии должно совпадать). При наличии префикса, версия должна быть больше или равна указанной в этом поле.
Некоторые контейнеры, как минимум в документации, пишут, что подходящие версии будут использованы по умолчанию. В данном случае речь идёт об Azure.
Пример:
"engines": {
"node": "~8.11", // require node version 8.11.* starting from 8.11.0
"npm": "^6.0.1" // require npm version 6.* starting from 6.0.1
},
очередные «грабли»
А король-то голый!
С клиентом было неоднократно оговорено, что требуемая версия `node.js` должна быть не меньше 8. При поставке начальных версий приложения всё работало. «В один прекрасный день» после поставки новой версии у клиента приложение перестало запускаться. В наших тестах всё работало.
Проблема была в том, что в этой версии мы стали использовать функциональность, которая поддерживалась только, начиная с версии 8 node.js. Поле «engines» не было заполнено, поэтому раньше никто не замечал, что у клиента была установлена древняя версия node.js. (Azure web services default).
scripts
Поле содержит кортеж вида: { «script1»:
script1, «script2»:
script2,… }.
Существуют стандартные скрипты, которые выполняются в той или иной ситуации. Например скрипт «install» выполнится после отработки «npm install». Очень удобно, например, чтобы проверить наличие программ, необходимых для работы приложения. Или, скажем, для сжатия всех статических файлов, доступных через наш веб-сервис, чтобы их не приходилось сжимать налету.
При этом можно не ограничиваться только стандартными именами. Для того, чтобы выполнить произвольный скрипт, нужно запустить «npm run
script-name».
Это удобно, чтобы собрать все используемые скрипты в одном месте.
Пример:
"scripts": {
"install": "node scripts/install-extras",
"start": "node src/well/hidden/main/server extra_param_1 extra_param_2",
"another-script": "node scripts/another-script"
}
P.S. Расширение ".js" можно в большинстве случаев опускать.