Как импортировать модуль в 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
, все работает нормально, когда модуль был импортирован куда-то еще... Пока все идет хорошо! Но Я ищу лучшую практику, если она есть!
Итак, вот мои вопросы относительно таких случаев:
- можно ли импортировать модуль, у которого нет ничего для экспорта?
- должны ли мы установить класс как
export default
, хотя мы делаем еще некоторые работы вне класса в модуле (инициализирующее задание, которое происходит после определения класса)? - или, может быть, лучше выполнить инициализацию в другой функции, а затем экспортировать оба класса и функция, а затем вызвать функцию, чтобы выполнить задание инициализации в импортированном модуле?
Большое всем спасибо! Я очень ценю любую помощь в этом отношении:)
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-далеко не лучшая практика.
Большое спасибо, ребята, за ваши ответы. Я действительно ценю это. На самом деле я действительно запутался в проекте, над которым работаю, поэтому, возможно, я не смог выразить то, что я пытаюсь сделать...
Но в любом случае, я пишу свои собственные ответы на мои вопросы, может быть, кто-то еще найдет их полезными:
Всегда полезно иметь
export default
илиexport
для модуля, который мы собираемся написать. Потому что каждый фрагмент кода имеет тенденцию иметь некоторые результаты, верно? Таким образом, в модуль, мы должны подумайте, чего мы собираемся достичь в конце, а затем экспортируйте это. Экспортируйте свои выходные данные, то, что вы ожидаете от вашего модуля, когда он будет импортирован в другое место.Если ваш модуль представляет собой один класс, то хорошо бы
export default
его использовать. В противном случае, как я уже сказал в первом ответе, все зависит от того, чего вы собираетесь достичь в своем модуле и каковы ваши результаты. Экспортируйте все результаты, полезные функции и т. д...Возможно, вам это тоже понравится! Но сначала подумайте о вашем случае использования. Как только модуль будет импортирован в другое место, все коды внутри него будут выполнены. Поэтому делайте все, что вам нравится, а затем экспортируйте конечные результаты.