У меня есть модуль Node.js с функцией, которая экспортируется и предназначена для вызова при запуске скрипта из командной строки:
function init() {
console.info('initializing');
}
init();
module.exports = { init };
Я хотел бы потребовать/импортировать базовый метод в другой модуль без оценки init. К сожалению, require, кажется, оценивает это:
> require('./test.js').init;
initializing
{ init: [Function: init] }
Можно ли потребовать этот метод, не оценивая его в этом сценарии?





Ваша проблема связана с тем, что вы сами вызываете функцию init.
Просто не вызывайте ее в модуле, который содержит реализацию, вместо этого вызывайте функцию после ее запроса в любом другом модуле.
function init() {
console.info('initializing');
}
// warning! do not call invoke init function here
// init()
module.exports = { init };
Не могли бы вы расширить вариант использования? В настоящее время невозможно проанализировать модуль без анализа каждого оператора, включая вызов init()
В этом случае он будет вызываться всегда, поскольку находится в глобальной области видимости модуля.
Как насчет помещать часть, которую вам нужно запустить, когда скрипт вызывается из командной строки, внутри проверки на require.main === module? Таким образом, init() вызывается только в том случае, если вы вызываете этот скрипт с помощью node test.js. Так:
function init() {
console.info('initializing');
}
if (require.main === module) {
init();
}
module.exports = { init };
Это как бы отвечает на ваш вопрос в обратном направлении, но я думаю, что это может быть близко к тому, что вы ищете.
Возможно, вы захотите следить за изменения в этой функции в отношении флага --experimental-modules.
Это означает, что init() не должно выполняться автоматически, и должны быть разные точки входа.
Одна точка входа для программного использования (test.js). Еще один, который будет использоваться в качестве исполняемого файла командной строки (test-cli.js):
require('./test.js').init()
Это обычный сценарий для пакетов NPM. Точка входа в CLI может быть указана в пакете bin.
Мне специально нужно вызвать его в этом случае использования