#javascript #node.js
#javascript #node.js
Вопрос:
Я хотел бы попробовать новый DOM-совместимый EventTarget
класс, который доступен по состоянию на Node.js 14.7.0.
Я могу это сделать, только если использую его из CommonJS
модуля, но не из модуля ES6. Например:
Запуск node --expose-internals test.js
работает, где test.js
:
const { Event, EventTarget } = require('internal/event_target');
const et = new EventTarget();
Если я использую его из модуля ES6, я получаю сообщение об ошибке:
test.mjs
:
import { Event, EventTarget } from 'internal/event_target';
const et = new EventTarget();
node --expose-internals test.mjs
Сбой при запуске:
SyntaxError: The requested module 'internal/event_target' does not provide an export named 'Event'
Есть ли способ заставить его работать с ES6?
Ответ №1:
Похоже, что он предоставляет только экспорт по умолчанию, который является объектом, а не именованным экспортом. Итак, вам нужно импортировать значение по умолчанию, а затем использовать деструктурирование:
import event_target from 'internal/event_target';
const { Event, EventTarget } = event_target;
const et = new EventTarget();
Комментарии:
1. Это работает, большое спасибо! Случайно, есть ли какой-либо параметр командной строки или переменная среды, чтобы заставить его работать по умолчанию без необходимости импорта
internal/event_target
?2. @noseratio — Вы имеете в виду, так что вы можете просто сделать
const { Event, EventTarget } = event_target;
? Или просто использоватьEvent
иEventTarget
ничего не делать? Я не знаю переменной среды илиpackage.json
настройки (но тогда я не Node.js эксперт), но ваш модуль ввода всегда может сделать их глобальными:import event_target from "internal/event_target"; ({Event: globalThis.Event, EventTarget: globalThis.EventTarget} = event_target);
Тогда все остальные модули в приложении будут иметь доступ к ним как к глобальным.3. Я подумал, может быть, есть способ сделать
EventTarget
просто быть доступным в глобальном пространствеimport
имен вообще, так же, как это легко доступно в браузере. Но, возможно, это невозможно. Спасибо за вашу помощь!4. @noseratio — Может быть лучший способ, о котором я не знаю, но в противном случае код в комментарии выше делает это, если он находится в модуле точки входа.
5. В итоге я использовал его только для тестирования, это модуль, который можно использовать как в узле (где я все еще использую EventEmitter), так и в браузере (где я использовал EventTarget). Ваш ответ отлично подходит для этой цели.