Как я могу определить , был ли мой файл Node.js вызывается с помощью SH: node path-to-file
или JS: require('path-to-file')
?
Это Node.JS, эквивалентный моему предыдущему вопросу в Perl: Как я могу запустить свой Perl-скрипт, только если он не был загружен с require?
Ответы:
См. Документацию для этого здесь: https://nodejs.org/docs/latest/api/modules.html#modules_accessing_the_main_module
источник
require()
, но вы можете сделать это, либо импортировав файл, затем запустивeval
его, либо запустивrequire('child_process').exec('node the_file.js')
es-main
пакет, чтобы проверить, был ли модуль запущен напрямую.Есть другой, немного более короткий путь (не обозначенный в упомянутых документах).
var runningAsScript = !module.parent;
Я обрисовал в общих чертах больше деталей о том, как это все работает под капотом в этом сообщении в блоге .
источник
node script.js
но нетcat script.js | node
. Этот способ работает для обоих.Меня немного смутила терминология, использованная в объяснениях. Поэтому мне пришлось сделать пару быстрых тестов.
Я обнаружил, что они дают одинаковые результаты:
А для других сбитых с толку людей (и ответить на вопрос напрямую):
источник
Как и в Python, я всегда пытаюсь вспомнить, как написать этот проклятый фрагмент кода. Поэтому я решил создать для него простой модуль. Мне потребовалось немного времени для разработки, так как доступ к информации модуля вызывающего абонента не прост, но было интересно посмотреть, как это можно сделать.
Таким образом, идея состоит в том, чтобы вызвать модуль и спросить его, является ли модуль вызывающего абонента основным. Мы должны выяснить модуль функции звонящего. Мой первый подход был вариантом принятого ответа:
Но это не гарантирует работу.
module.parent
указывает на модуль, который загрузил нас в память, а не тот, который нам звонит. Если это был модуль вызывающего, который загрузил этот вспомогательный модуль в память, это нормально. Но если это не так, мы беспомощны. Поэтому нам нужно попробовать что-то еще. Моим решением было сгенерировать трассировку стека и получить оттуда имя модуля вызывающего:Теперь мы можем сделать:
Или более читабельно:
Невозможно забыть :-)
источник
return require.main /*this is undefined if we started node interactively*/ && require.main.filename === callerModuleName;
Попробуйте это, если вы используете модули ES6:
источник
process.mainModule
естьundefined