Как проверить, был ли узел 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