Javascript импортирует все модули из файла как глобальные переменные

#javascript

#javascript

Вопрос:

В script1.js , у меня есть следующие экспортные:

 export function test1() {
  // do something
}

export function test2() {
  // do something
}
 

Я импортирую script1.js в script2.js:

 import * as functions from './script1.js';

functions.test1();
functions.test2();
 

Мне интересно, есть ли способ импортировать все модули из script1.js , и непосредственно помещать их внутрь глобальных переменных script2.js . Таким образом, я могу напрямую обращаться к ним с помощью test1(), test2(), без промежуточного этапа помещения их в объект.

Я знаю, что мы можем сделать import {test1, test2} from './script1.js'; , но если у меня будет много экспорта, то деконструкция будет утомительной.

Другими словами, то, что я ищу, является чем-то эквивалентным:

 import * from './script1.js';

test1();
test2();
 

Приведенный выше блок кода является гипотетическим, и он не работает.

Комментарии:

1. import './script1' должен это сделать

2. Ужасное решение для подобной проблемы: если with было разрешено в строгом режиме, вы могли бы это сделать with (functions) { , но, к счастью, модули должны быть строгими.

3. Только что попробовал, import './script1' выдает ошибку

Ответ №1:

Учитывая ваш текущий код, это невозможно. Весь смысл модулей заключается в том, чтобы избежать неявного глобального загрязнения. Чтобы сделать что-то подобное, вам нужно будет явно назначить функции глобальному объекту внутри модуля, например, изменить:

 export function test1() {
  // do something
}
 

Для

 window.test1 = function test1() {
  // do something
};
 

а затем, когда модуль будет импортирован, функции будут доступны глобально:

 import './script1.js';
 

Но это антипаттерн:

но если у меня много экспорта, то демонтаж будет утомительным.

Для этого требуется некоторый шаблон, но не бойтесь этого — в более крупных проектах наличие явных цепочек зависимостей является огромным плюсом для удобства обслуживания. Он также разрешает встряхивание дерева, что невозможно только для модулей с побочными эффектами (например, присвоение глобальному объекту).

Ответ №2:

вы также можете очень просто автоматически сгенерировать импорт с помощью такого скрипта:

 import * as functions from './script1.js';

const function_names = Object.keys(functions).join(',')

console.log( function_names ) //output: test1,test2
 

ваш список готов в вашей консоли!