【问题标题】:How to import a module in es6 that itself needs to invoke/initialize its function/class before being imported如何在 es6 中导入一个模块,该模块本身需要在导入之前调用/初始化其函数/类
【发布时间】:2016-12-23 04:16:55
【问题描述】:

我想知道将模块的函数/类导入另一个模块的最佳实践是什么,模块本身需要在导入另一个模块之前调用/初始化自己的函数/类?我不知道我是否可以足够清楚地问我的问题!所以我们举个例子吧。

这是我的模块:

// 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. 或者,在另一个函数中完成初始化工作,然后导出类和函数,然后调用函数在导入的模块中完成初始化工作是不是很好?

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

【问题讨论】:

  • 因为这不是唯一发生的事情”不应阻止您(默认)导出任何内容。
  • 你需要类的多个实例吗?
  • 我想知道如果我有一个工厂函数(在其中我不仅要实例化类,还要做一些其他工作)我喜欢它被自我调用。如何导出自调用函数?
  • 一般我想知道我们如何导出自调用函数?
  • 放弃自调用,ES6 模块无论如何都是自包含的。只需在模块级别范围内执行你的东西,导出结果。

标签: javascript class module ecmascript-6 es6-module-loader


【解决方案1】:

提供导入类或它的实例怎么样?喜欢:

// 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),它就不会产生任何影响,因为模块内的所有内容都发生在一个孤立的范围内。您可能已经猜到了,让模块更改全局变量远非最佳实践。

【讨论】:

  • 当我们喜欢导入类的实例时,您的解决方案可能会起作用......但是如果我们喜欢调用工厂函数然后导出它呢?有什么我不知道的建议方法吗?
  • 你的意思是在我们导入的模块中调用工厂函数并导出创建的实例?然后你就不需要工厂了,因为你可以将所有要完成的东西直接写入模块本身,而不必将它封装到另一个函数中(比如 //export instance of MyModule directly 之前已经完成了一些东西)。但是,您将无法传递任何参数。
  • 不,当然我们可以轻松导出类的实例而没有任何问题...不用担心!让我们忘记实例化......这是我的问题:如何导出自调用函数?
  • export default function() { ... }(); 但它有什么意义呢?它将在模块被导入时作为模块中的所有其他代码执行。因此,无论您的代码是在函数内部还是外部,都没有区别。如果你真的需要一个独立的作用域,这可能是一个提示,你应该将代码分离到它自己的模块中。
【解决方案2】:

非常感谢大家的回答。我真的很感激。实际上,我对我正在从事的项目感到非常困惑,所以也许我无法表达我想要做什么......

但不管怎样,我自己写了我的问题的答案,也许其他人会觉得它们有用:

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

  2. 如果您的模块是单个类,最好export default 它。否则,正如我在第一个答案中所说,这完全取决于您将在模块中实现什么以及您的结果是什么。导出所有结果、实用函数等...

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

【讨论】:

    猜你喜欢
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 2021-09-17
    • 2021-09-22
    • 1970-01-01
    相关资源
    最近更新 更多