/ / Як імпортувати модуль у es6, який сам повинен викликати / ініціалізувати свою функцію / клас перед імпортом - javascript, клас, модуль, ecmascript-6, es6-module-loader

Як імпортувати модуль в es6, який сам повинен імпортувати / ініціалізувати свою функцію / клас перед імпортом - javascript, class, module, ecmascript-6, es6-module-loader

Мені було цікаво, що є найкращою практикоюімпортувати функцію / клас модуля в інший модуль, який сам модуль повинен викликати / ініціалізувати власну функцію / клас перед імпортом в інший модуль? Я не знаю, чи міг би я поставити своє питання досить чітко! Тож давайте наведемо це на прикладі.

Це мій модуль:

// myModule.js
class MyModule {
constructor() {
// do sth
}
}

let myModule = new MyModule();

І ось як мені подобається імпортувати його в інший модуль:

import MyModule from "./myModule";

Це насправді працює чудово! Але, як бачите, в myModule.js файл я не "т export default мій MyModule клас, тому що "це не єдине, що відбувається в myModule.js файл! Я також ініціалізую клас після його визначення ... (Я знаю, що навіть якщо я встановив свій клас як export default ініціалізація все одно буде працювати нормально, поки модуль імпортується кудись ще ...)

Отже, не встановлюючи нічого, що експортується всередині нашого модуля, або встановлюючи клас як export default, все працює нормально, коли модуль було імпортовано кудись ще ... Поки що добре! Але я шукаю найкращу практику, якщо така є!

Тож ось мої запитання щодо таких випадків:

  1. Чи добре імпортувати модуль, який не має нічого для експорту?
  2. Давайте встановимо клас як export default, хоча ми виконуємо ще деякі роботи поза класом в модулі (Ініціалізаційна робота, яка відбувається після визначення класу)?
  3. Або, можливо, добре виконати роботу ініціалізації в іншій функції, а потім експортувати обидва, клас і функцію, а потім викликати функцію, щоб виконати роботу ініціалізації в імпортованому модулі?

Велике спасибі всім! Я дуже ціную будь-яку допомогу щодо цього :)

Відповіді:

12 для відповіді № 1

Як щодо пропозиції імпортувати клас або його екземпляр? Подібно до:

// export class itself
export class MyModule {
constructor() {
// do sth
}
}

// export instance of MyModule directly
export default new MyModule();

// export a factory function if you need more work to be done
// before the instance is created
export function myModuleFactory(...args) { // define e.g. arguments to be passed to constructor
// ... do stuff
const myModule = new MyModule(...args);
// ... do more stuff
return myModule;
}

Отже, ви можете зробити це:

// import instance
import instance from "./myModule";
// or class
import { MyModule } from "./myModule";
// or import factory
import { myModuleFactory } from "./myModule";

Що робити, залежало від того, що ви хочете досягти за допомогою свого модуля. Якщо ви хочете, щоб ваш додаток використовував один спільний екземпляр MyModule об'єкт класу export і import екземпляр, як показано вище. Якщо ви хочете створити кілька екземплярів у різних контекстах, ви експортуєте сам клас або заводську функцію, щоб повернути новий екземпляр.

Щоб зробити його ще більш чистим, ви зберігаєте клас у ще одному окремому файлі та import його в модуль, що забезпечує завод / екземпляр.

Оновити

Щоб відповісти на ваше перше запитання: Ви можете import модулі, яких немає export визначений. Модуль буде завантажений і виконана його логіка. Річ у тім, що поки це не змінить глобальних змінних (наприклад window у веб-розробці) це не матиме жодного ефекту, оскільки все, що знаходиться всередині модуля, відбувається в ізольованій області. Як ви вже здогадалися, зміна модулів у глобальних варіантах - далеко не найкраща практика.


-2 для відповіді № 2

Велике спасибі хлопці за ваші відповіді. Я дуже ціную це. Насправді я дуже заплутався у проекті, над яким я працюю, тож, можливо, я не міг висловити те, що намагаюся зробити ...

Але в будь-якому випадку, я пишу власні відповіді на свої запитання, можливо, комусь іншому вони знадобляться:

  1. Це завжди хороша практика мати export default або export для модуля, який ми збираємося написати.Тому що кожна частина коду має певні результати, чи не так? Отже, в модулі ми повинні розглянути, чого ми хочемо досягти в кінці, а потім експортувати це. Експортуйте свої результати, те, що, як ви очікуєте, надасть ваш модуль, коли він буде імпортований кудись ще.

  2. Якщо ваш модуль є одним класом, це добре export default це. В іншому випадку, як я вже говорив у першій відповіді, все залежить від того, чого ви збираєтесь досягти у своєму модулі, і які ваші результати. Експортуйте всі результати, функції утиліти тощо ...

  3. Можливо, вам теж сподобається це зробити!Але спочатку подумайте про свій варіант використання. Як тільки модуль буде імпортовано кудись ще, всі коди всередині нього будуть виконані. Тож робіть все, що хочете, а потім експортуйте кінцеві результати.