Как импортировать модуль в es6, который сам должен вызвать / инициализировать свою функцию / класс перед импортом


Мне было интересно, как лучше всего импортировать функцию/класс модуля в другой модуль, который сам модуль должен вызвать / инициализировать свою собственную функцию / класс перед импортом в другой модуль? Не знаю, смогу ли я задать свой вопрос достаточно ясно! Давайте рассмотрим это на примере.

Это мой модуль:

// 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. или, может быть, лучше выполнить инициализацию в другой функции, а затем экспортировать оба класса и функция, а затем вызвать функцию, чтобы выполнить задание инициализации в импортированном модуле?

Большое всем спасибо! Я очень ценю любую помощь в этом отношении:)

2 3

2 ответа:

Как насчет предложения импортировать класс или его экземпляр? Например:

// 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';

Что делать, depeneds о том, что вы хотите сделать с вашим модулем. Если вы хотите, чтобы ваше приложение использовало один общий экземпляр объекта класса MyModule, вы должны использовать export и import экземпляр, как показано выше. Если вы хотите создать несколько экземпляров в разных контекстах, вы экспортируете сам класс или фабричную функцию, чтобы вернуть новый экземпляр.

Чтобы сохранить его еще больше чистый, вы бы сохранили класс в еще одном отдельном файле и import его в модуль, обеспечивающий фабрику / создание экземпляра.

Обновить

Чтобы ответить на ваш первый вопрос: вы можете import модули, которые не имеют никаких export определенных. Модуль будет загружен и его логика будет выполнена. Дело в том, что до тех пор, пока он не изменит глобальные переменные (например, window в веб-разработке), он не будет иметь никакого эффекта, поскольку все внутри модуля происходит в изолированной области. Как ты возможно, вы уже догадались, что смена модулей global vars-далеко не лучшая практика.

Большое спасибо, ребята, за ваши ответы. Я действительно ценю это. На самом деле я действительно запутался в проекте, над которым работаю, поэтому, возможно, я не смог выразить то, что я пытаюсь сделать...

Но в любом случае, я пишу свои собственные ответы на мои вопросы, может быть, кто-то еще найдет их полезными:
  1. Всегда полезно иметь export default или export для модуля, который мы собираемся написать. Потому что каждый фрагмент кода имеет тенденцию иметь некоторые результаты, верно? Таким образом, в модуль, мы должны подумайте, чего мы собираемся достичь в конце, а затем экспортируйте это. Экспортируйте свои выходные данные, то, что вы ожидаете от вашего модуля, когда он будет импортирован в другое место.

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

  3. Возможно, вам это тоже понравится! Но сначала подумайте о вашем случае использования. Как только модуль будет импортирован в другое место, все коды внутри него будут выполнены. Поэтому делайте все, что вам нравится, а затем экспортируйте конечные результаты.