如何在 es6 中导入本身需要 invoke/initialize 其 function/class 的模块,然后再导入

How to import a module in es6 that itself needs to invoke/initialize its function/class before being imported

我想知道将模块的 function/class 导入另一个模块的最佳做法是什么,模块本身需要 invoke/initialize 自己的 function/class,然后再导入另一个模块?我不知道我是否可以清楚地问我的问题!所以让我们把它放在一个例子中。

这是我的模块:

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

let myModule = new MyModule();

这就是我喜欢将其导入另一个模块的方式:

import MyModule from './myModule';

这实际上很好用!但是正如您所看到的,在 myModule.js 文件中我没有 export default 我的 MyModule class 因为那不是 myModule.js 中发生的唯一事情文件!我还在定义 class 之后初始化它...(我知道即使我将 class 设置为 export default 初始化仍然可以正常工作,而模块被导入某处否则...)

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

所以这是我关于此类情况的问题:

  1. 可以导入一个没有任何导出的模块吗?
  2. 我们是否应该将 class 设置为 export default,尽管我们在模块中的 class 之外做了一些工作(定义class)?
  3. 或者在另一个函数中完成初始化工作,然后导出 class 和函数,然后在导入的模块中调用该函数来完成初始化工作是否好?

非常感谢大家!我非常感谢对此的任何帮助:)

提议导入 class 或其实例怎么样?喜欢:

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

为了让它更干净,您可以将 class 保存在另一个单独的文件中,并将 import 保存到提供 factory/instantiation.

的模块中

更新

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

非常感谢你们的回答。我非常感谢。事实上,我对我正在从事的项目感到非常困惑,所以也许我无法表达我正在尝试做的事情......

但无论如何,我写下了我自己的问题答案,也许其他人觉得它们有用:

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

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

  3. 你可能也想这样做!但首先考虑您的用例。一旦模块被导入到其他地方,它里面的所有代码都会被执行。所以做任何你喜欢做的事,然后导出最终结果。