Node.js командная строка с именем папки в качестве параметра

#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 выполняет сценарии.