Как проверить, был ли узел EsModule импортирован или запущен напрямую

Node.js 13 недавно выпустил экспериментальный загрузчик ESModule, который начал отказываться от CommonJS. Однако код, выполняемый в ESModule в Node.js, не предоставляетсяrequire функция, вместо этого требуя использования нового import синтаксис.

Моя проблема в том, что обычно способ узнать, был ли модуль загружен через импорт или запущен непосредственно из командной строки, требует require функция должна быть предоставлена, потому что она проверяет requireс main свойство против текущего модуля moduleобъект. посколькуrequire не предоставляется в ESModule в Node.js, как мне проверить, был ли мой ESModule импортирован или запущен непосредственно из командной строки?

1 ответ

учитывая, что у вас есть «некоторая функция», которую вы хотите экспортировать или запустить, если ваш модуль вызывается напрямую, через node my-script.js,

      // my-script.js
export async function myTask() {
  console.log('hi');
}

Вы можете запустить, добавив:

      import { createRequire } from 'module';
import { fileURLToPath } from 'url'

const __filename = fileURLToPath(import.meta.url)

// existing
export async function myTask() {
  console.log('hi');
}
// end existing

let entryFile = process.argv?.[1];

if (entryFile === __filename) {
  myTask();
}

таким образом, другие скрипты могут

      import { myTask } from './my-script.js';

не вызывая myTaskнемедленно, как вы хотели бы при вызове из CLI с помощью node

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