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

时间:2016-08-16 17:15:30

标签: 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课程,因为这不是{{1}中发生的唯一事情。文件!我在定义它之后也初始化了类...(我知道即使我将我的类设置为myModule.js,在将模块导入到其他地方时,初始化仍然可以正常工作...)< / p>

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

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

  1. 导入一个没有出口的模块是否可以?
  2. 我们应该将类设置为export default,尽管我们在模块中的类之外做了更多的工作(定义类之后发生的初始化工作)?
  3. 或者可能在另一个函数中执行初始化作业然后导出类,函数,然后调用函数在导入的模块中执行初始化作业?
  4. 非常感谢大家!我真的很感激任何帮助:)

2 个答案:

答案 0 :(得分:15)

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

// 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类对象的一个​​共享实例,则需要exportimport如上所示的实例。如果要在不同的上下文中创建多个实例,则可以导出类本身或工厂函数以返回新实例。

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

<强>更新

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

答案 1 :(得分:-1)

非常感谢你们的回答。我真的很感激。实际上我对我正在进行的项目感到很困惑,所以也许我无法表达我想要做的事情......

但无论如何,我会自己回答我的问题,或许其他人发现它们很有用:

  1. 对于我们将要编写的模块,export defaultexport始终是一个好习惯。因为每一段代码都会有一些结果,对吧?因此,在一个模块中,我们应该考虑我们最终要实现的目标,然后将其导出。导出您的输出,即您希望模块在其他地方导入时提供的内容。

  2. 如果您的模块是单个课程,那么它对export default有好处。否则,正如我在第一个答案中所说,这完全取决于您在模块中将要实现的目标以及您的结果。导出所有结果,效用函数等......

  3. 您也可以这样做!但首先想想你的用例。一旦将模块导入其他地方,就会执行其中的所有代码。所以你喜欢做什么,然后导出最终结果。