Использование класса EventTarget нового экспериментального узла с модулями ES6

#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). Ваш ответ отлично подходит для этой цели.