如何导入es6中的模块,它本身需要在导入之前调用/初始化其函数/类

Ali*_*Ali 5 javascript module class ecmascript-6 es6-module-loader

我想知道在另一个模块中导入模块的函数/类的最佳实践是什么,模块本身需要在导入到另一个模块之前调用/初始化它自己的函数/类?我不知道我是否可以清楚地问我的问题!让我们把它放在一个例子中.

这是我的模块:

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

let myModule = new MyModule();
Run Code Online (Sandbox Code Playgroud)

这就是我喜欢在另一个模块中导入它的方式:

import MyModule from './myModule';
Run Code Online (Sandbox Code Playgroud)

这实际上工作正常!但正如你所看到的,在myModule.js文件我没有export default我的MyModule班,因为这并不是说是在发生的唯一myModule.js文件!我也在定义它之后初始化类...(我知道即使我已经设置了我的类,因为export default初始化仍然可以正常工作,而模块是在其他地方导入的......)

因此,如果没有在我们的模块中设置任何导出内容,或者将类设置为export default,那么当模块被导入其他地方时一切正常......到目前为止一切都很好!但是如果有的话,我正在寻找最佳实践!

以下是关于此类案例的问题:

  1. 导入没有任何东西用于导出的模块是否可以?
  2. 我们应该将类设置为export default,尽管我们在模块中的类之外做了一些更多的工作(定义类之后发生的初始化工作)?
  3. 或者也许在另一个函数中执行初始化作业然后导出类,函数,然后调用函数在导入的模块中执行初始化作业是否合适?

非常感谢大家!我非常感谢有关这方面的任何帮助:)

Oli*_*ver 16

如何提供导入类或它的实例?喜欢:

// 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;
}
Run Code Online (Sandbox Code Playgroud)

所以你可以这样做:

// import instance
import instance from './myModule';
// or class
import { MyModule } from './myModule';
// or import factory
import { myModuleFactory } from './myModule';
Run Code Online (Sandbox Code Playgroud)

该怎么做,取决于你想要用你的模块完成什么.如果您希望您的应用程序使用MyModule类对象的一个共享实例,那么您exportimport实例如上所示.如果要在不同的上下文中创建多个实例,则可以导出类本身或工厂函数以返回新实例.

为了使它更加干净,您可以将该类保存在另一个单独的文件中,并将import其保存到提供工厂/实例化的模块中.

更新

回答第一个问题:您可以使用import没有任何已export定义的模块.将加载模块并执行其逻辑.问题在于,只要它不会改变全局变量(如window在Web开发中),它就不会产生任何影响,因为模块内部的所有内容都发生在隔离的范围内.您可能已经猜到,让模块更改全局变量远非最佳实践.