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,那么当模块被导入其他地方时一切正常......到目前为止一切都很好!但是如果有的话,我正在寻找最佳实践!
以下是关于此类案例的问题:
export default,尽管我们在模块中的类之外做了一些更多的工作(定义类之后发生的初始化工作)? 非常感谢大家!我非常感谢有关这方面的任何帮助:)
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类对象的一个共享实例,那么您export和import实例如上所示.如果要在不同的上下文中创建多个实例,则可以导出类本身或工厂函数以返回新实例.
为了使它更加干净,您可以将该类保存在另一个单独的文件中,并将import其保存到提供工厂/实例化的模块中.
更新
回答第一个问题:您可以使用import没有任何已export定义的模块.将加载模块并执行其逻辑.问题在于,只要它不会改变全局变量(如window在Web开发中),它就不会产生任何影响,因为模块内部的所有内容都发生在隔离的范围内.您可能已经猜到,让模块更改全局变量远非最佳实践.