循环内导入模块是一个坏习惯吗?

时间:2019-05-08 12:29:21

标签: javascript node.js

我有一个javascript模块,我将其导入到主代码/主代码的开头,并在其中执行forEach,在此主代码中有一个调用模块方法的循环:

results.forEach(function(result) {
     for(const item of items .......){
        exampleModule.metodo(result, item)
     }
});

到目前为止,问题是模块的值正在混合,模块根据结果X的项Y是不动态的,有点“干扰”了一切……

我想到了一种解决方法,我不知道这是否是最佳实践,在对象内声明const exampleModule = require('./modules/example.js')并为该对象提供引用,例如作为商品ID,因为每个ID都是唯一的:

let objetos = {}
results.forEach(function(result) {
     for(const item of items .......){
        objetos[item.id] = require('./modules/example.js')
        objetos[item.id].metodo(result, item)
     }
});

简而言之,我希望每个循环项都创建一个模块实例而不会受到干扰,如果我在位置0的项目中实例化该模块,则模块中的所有内容仅应由该项目0使用,如果第1项是同一件事,1 n可以更改位置0使用的模块的值,依此类推,这可能吗?有人可以帮我吗?

2 个答案:

答案 0 :(得分:1)

我有相同的想法,并对其进行了一次检查,但这基本上是require()函数返回的单例。

如果有

jQuery = require('jquery');
jQuery.fn.foobar = function() {
   this.css({color:red});
}

然后在另一个文件中可以

$ = require('jquery');
$('hello').foobar();

唯一的条件是您用于require()的字符串大小写相同。

require('libs/myModule.js') != require('libs/mymodule.js');

在后台创建地图:

 objects = {
    'jquery' : ....
    'add' : ....
    'strcasecomp' : ....
    '/www/htdocs/site/libs/myModule.js' : ...
 }

require()发生的情况是,如果对象存在于地图中,则将其返回。如果不存在,则会找到,实例化,映射并返回相关文件。

答案 1 :(得分:1)

Node.js缓存导入的模块。因此,将它们循环需要没有副作用。 here in docs说明了缓存。

是的,最好不要在代码深处导入模块,因为它被认为不易读。您可以随时执行以下操作:

let objetos = {}
const exampleModule = require('./modules/example.js');
results.forEach(function(result) {
     for(const item of items .......){
        objetos[item.id] = Object.assign({}, exampleModule);
        objetos[item.id].metodo(result, item)
     }
});