#node.js
#node.js
Вопрос:
Я смотрел на https://github.com/mars/heroku-cra-node репозиторий github, и я заметил, что в package.json
, есть скрипт, определенный как "start": node server
(сервер — это имя папки, содержащей index.js файл).
Что именно делает эта строка? Когда мы передаем имя папки в качестве параметра, выполняет ли узел поиск файла внутри этой папки index.js
?
Ответ №1:
Узел будет выполнять ограниченный поиск, когда точный файл не может быть найден.
В случае предоставления server
в качестве аргумента «script» для node
:
Сначала node
попытаемся открыть файл с именем server
.
Если не найден, то он будет искать server.js
, server.json
затем server.node
Если они не существуют, а параметром является каталог, node
попытается открыть и server/index.js
, server/index.json
затем server/index.node
.
Первое совпадение выигрывает.
$ strace -e stat node server
syscall_332(0xffffff9c, 0x7ffeca72d028, 0, 0xfff, 0x7ffeca72cc10, 0x7ffeca72cd20) = -1 (errno 38)
stat("/server", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/server.js", 0x7ffeca72cc90) = -1 ENOENT (No such file or directory)
stat("/server.json", 0x7ffeca72cc90) = -1 ENOENT (No such file or directory)
stat("/server.node", 0x7ffeca72cc90) = -1 ENOENT (No such file or directory)
stat("/server/index.js", 0x7ffeca72cbe0) = -1 ENOENT (No such file or directory)
stat("/server/index.json", 0x7ffeca72cbe0) = -1 ENOENT (No such file or directory)
stat("/server/index.node", 0x7ffeca72cbe0) = -1 ENOENT (No such file or directory)
stat("/server", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
stat("/server.js", 0x7ffeca72cad0) = -1 ENOENT (No such file or directory)
stat("/server.json", 0x7ffeca72cad0) = -1 ENOENT (No such file or directory)
stat("/server.node", 0x7ffeca72cad0) = -1 ENOENT (No such file or directory)
stat("/server/index.js", 0x7ffeca72ca20) = -1 ENOENT (No such file or directory)
stat("/server/index.json", 0x7ffeca72ca20) = -1 ENOENT (No such file or directory)
stat("/server/index.node", 0x7ffeca72ca20) = -1 ENOENT (No such file or directory)
internal/modules/cjs/loader.js:896
throw err;
^
Error: Cannot find module '/server'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:893:15)
at Function.Module._load (internal/modules/cjs/loader.js:743:27)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
at internal/main/run_main_module.js:17:47 {
code: 'MODULE_NOT_FOUND',
requireStack: []
}
exited with 1
Ответ №2:
Короткий ответ: да.
Длинный ответ: package.json
распознается npm. Пока на вашем компьютере установлен npm, вы можете использовать его для выполнения многих задач, таких как установка модулей NodeJS, но вы также можете использовать его для запуска небольших скриптов / команд. Эти команды должны быть добавлены в scripts
поле in package.json
. Чтобы выполнить эти команды, вы вызываете npm run <command>
. Эта функция предназначена для удобства и не имеет никакого отношения к управлению пакетами. При этом здесь доступны перехваты, которые вызываются при публикации пакета в npmjs.com (подробнее об этом позже).
NodeJS будет искать и импортировать index.js
при импорте любой папки (вероятно, здесь Node использует CommonJS, но я на 100% не уверен). Итак, в вашем примере, вызывая npm start
, вы вызываете npm, node server
который вызывает запущенный server/index.js
. Вы можете вызвать здесь все, что захотите, например, вы можете запустить сценарий оболочки, создав сценарий "my-script": "my-script.sh"
, а затем вызвать его через npm с npm run my-script
помощью . Это простой пример, но не очень полезный — когда npm-скрипты вступают в свои права, это когда у вас есть сложные команды, которые вам нужно регулярно запускать.
Например, у вас могут быть разные команды для запуска программы с разными контекстами:
{
"scripts": {
"start": "set NODE_ENV=developmentamp;amp; webpack --watch",
"clean": "rimraf dist",
"build-production": "set NODE_ENV=productionamp;amp; npm run clean amp;amp; webpack",
"deploy": "sam deploy"
}
}
npm start
для разработкиnpm run build-production
для упаковки рабочей сборкиnpm run deploy
для развертывания кода на сервере
Обратите внимание, что в предыдущем абзаце я просто использовал npm start
, а не npm run start
как описано ранее — есть зарезервированные имена сценариев, которые обладают дополнительной функциональностью, см. Страницу npm-scripts для получения полной информации.
Комментарии:
1. Спасибо за ваш подробный ответ. Мой вопрос был больше о команде
node server
, чем о более общем варианте использования сценариев npm. Я хотел знать, что ищет узел, когда параметры команды узла на самом деле являются папкой, а не файлом напрямую (например, если вызывается мой файл app.js и не index.js , будет ли это проблемой при выполнении этого скрипта ?)2. Просто чтобы продолжить мой предыдущий комментарий, я просто попытался переименовать файл на разные имена, и единственный случай, когда команда
node server
работает, — это когда имя файла на самом деле index.js .3. Я думаю, что ответ Мэтта охватывает это идеально. В будущем я бы посоветовал исключить ненужную информацию из вашего вопроса. Из используемого примера / формулировки у меня (очевидно) сложилось впечатление, что вы хотели знать, как npm выполняет сценарии.