Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS/ES6:在模块上设置属性后是否需要重新导出模块?_Javascript_Ecmascript 6_Es6 Modules - Fatal编程技术网

Javascript JS/ES6:在模块上设置属性后是否需要重新导出模块?

Javascript JS/ES6:在模块上设置属性后是否需要重新导出模块?,javascript,ecmascript-6,es6-modules,Javascript,Ecmascript 6,Es6 Modules,据我从模块系统了解,每当我导入文件中的“某个模块”时,我总是会得到该模块的相同实例,而不是每次导入时的不同实例 但如果这是真的,我有点不理解我在一些应用程序中看到的这种模式: // in a 'config_some_module.js' file import SomeModule from 'some_module'; SomeModule.attribute = 'something'; export default SomeModule; // in a different fil

据我从模块系统了解,每当我
导入文件中的“某个模块”
时,我总是会得到该模块的相同实例,而不是每次导入时的不同实例

但如果这是真的,我有点不理解我在一些应用程序中看到的这种模式:

// in a 'config_some_module.js' file
import SomeModule from 'some_module';

SomeModule.attribute = 'something';

export default SomeModule;

// in a different file;
import SomeModule from './config_some_module';
如果每次导入模块时都会得到相同的实例(而不是新实例),那么为什么需要重新导出该模块以使用在上一个文件中完成的配置来访问它


另外,还有第二个问题:如果不需要,如何确保在第二个文件中,当已设置该属性时,导入将获得该模块?我假设如果两个导入都得到相同的实例,那么最终属性将出现在第二个文件的
SomeModule
中,但可能我上面提到的模式是有用的,因为您可以确定对模块的更改已经应用了?

您需要
导出
的原因是,
config\u某些模块.js
只会产生副作用。如果要直接从中导入,则需要导出一个值。如果您没有从
config\u some\u module.js
导出任何内容,则需要执行以下操作
导入带有副作用的修改对象:

// in 'config_some_module.js' file
import SomeModule from 'some_module';

SomeModule.attribute = 'something';
要记住的一点是,不管导入多少次
config\u some\u module.js
,副作用只会发生一次


最后,只要您的使用发生在两者之后,您在消费者中执行
import
语句的顺序并不重要。

您需要
export
的原因是,否则,
config\u some\u module.js
只会产生副作用。如果要直接从中导入
,则需要导出一个值。如果您没有从
config\u some\u module.js
导出任何内容,则需要执行以下操作
导入带有副作用的修改对象:

// in 'config_some_module.js' file
import SomeModule from 'some_module';

SomeModule.attribute = 'something';
要记住的一点是,不管导入多少次
config\u some\u module.js
,副作用只会发生一次


最后,只要您的使用发生在两者之后,您在消费者中执行
import
语句的顺序并不重要。

关于您的最后一句话-由于ES6导入是静态的,您始终需要在任何其他语句之前声明所有导入。尽管导入不一定发生在同一文件中,因此,在副作用发生之前仍然可以使用该对象。@amankkg您不需要在文件顶部声明它们,它们是“提升的”@amankkg并不总是正确的,例如您可以执行
import('module')。然后()
@XanderLuciano您是对的,但动态导入不是ES2015/ES6,关于您的最后一句话,上面已经给出了一个即使使用ES6导入也可能出现问题的示例-由于ES6导入是静态的,因此您始终需要在任何其他声明之前声明所有导入。尽管导入不一定发生在同一个文件中,因此,在副作用发生之前仍然可以使用该对象。@amankkg您不需要在文件顶部声明它们,它们是“提升的”@amankkg并不总是正确的,例如您可以执行
import('module')。然后()
@XanderLuciano您是对的,但动态导入不是ES2015/ES6,上面已经给出了一个即使使用ES6导入也可能出现问题的示例,您确实应该将导出视为不可变的。使用命名导出,然后从“some_module”执行
export*,而不是默认导出不可变对象;导出常量属性='something'
在您的配置模块中,您将从“/config_some_module”导入为
import*as SomeModule。您确实应该将导出视为不可变的。使用命名导出,然后从“some_module”执行
export*,而不是默认导出不可变对象;导出常量属性='something'
在您的配置模块中,您将从“/config_some_module”导入为
import*as SomeModule