Импортируйте функцию модуля Node.js, не вызывая ее

У меня есть модуль Node.js с функцией, которая экспортируется и предназначена для вызова при запуске скрипта из командной строки:

function init() {
  console.info('initializing');
}
init();

module.exports = { init };

Я хотел бы потребовать/импортировать базовый метод в другой модуль без оценки init. К сожалению, require, кажется, оценивает это:

> require('./test.js').init;
initializing
{ init: [Function: init] }

Можно ли потребовать этот метод, не оценивая его в этом сценарии?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 220
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ваша проблема связана с тем, что вы сами вызываете функцию init. Просто не вызывайте ее в модуле, который содержит реализацию, вместо этого вызывайте функцию после ее запроса в любом другом модуле.

function init() {
  console.info('initializing');
}
// warning! do not call invoke init function here
// init()

module.exports = { init };

Мне специально нужно вызвать его в этом случае использования

Allyl Isocyanate 13.03.2019 00:56

Не могли бы вы расширить вариант использования? В настоящее время невозможно проанализировать модуль без анализа каждого оператора, включая вызов init()

sleighty 13.03.2019 01:08

В этом случае он будет вызываться всегда, поскольку находится в глобальной области видимости модуля.

Alex 13.03.2019 01:08
Ответ принят как подходящий

Как насчет помещать часть, которую вам нужно запустить, когда скрипт вызывается из командной строки, внутри проверки на 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.

Другие вопросы по теме