操作module.exports和require

时间:2018-02-27 10:36:36

标签: javascript node.js

对于使用NodeJS的module.exports和require(),我真的不了解一件事。由于我无法正确解释,我无法找到我要查找的信息,所以我在这里寻求帮助寻找答案。

我可以导出以下功能:

example1.js

module.exports = {
    hello: function() {
        return 'Hello world';
    });
}

OR

example2.js

module.exports = function(data) {
    return data;
}

我可以使用类似的东西:

console.log(require('./example1.js').hello());

OR

console.log(require('./example2.js')('hello world'));

从那里开始,如果我在server.js中调用NPM模块,如: var bcrypt = require('bcrypt');并且我想在另一个模块中使用它,最好将它传递给函数,如:

example3.js

module.exports = function(bcrypt) {
    return  bcrypt.hashSync('hello', 5);
}

之后(记录哈希):

console.log(require(./example3.js)(bcrypt));

或直接在模块中声明它?

example3bis.js

var bcrypt = require('bcrypt');
module.exports = function() {
    return  bcrypt.hashSync('hello', 5);
}

另一个问题,如果我在server.jsexample3bis.js这样的特定模块中声明bcrypt,这是否意味着我重复代码?

最后,是否有关于模块的良好实践?

我不知道我是否清楚地解释了事情,但是我尝试了解模块周围的事情(npm或导出)以及如果我多次调用它们,代码是如何复制的。

提前感谢您的回答!

3 个答案:

答案 0 :(得分:1)

好的,这是答案

  1. require文件中使用该模块的模块,不要传递它。

  2. require只维护已加载的模块的缓存,因此多次require模块没有任何性能损失,并且没有代码重复

  3. 所以一般来说,根本不需要担心代码重复或性能问题,这些已经在模块系统中考虑过,只需要模块,在需要它的文件中而不是作为参数传递,这导致清洁代码

答案 1 :(得分:0)

你可以这样做,但我建议只需要()在你需要的其他模块中再次使用它。这样你就不会自己缓存和传递模块,这会消耗更多的资源。

模块被缓存,所以第一次需要()一个模块时,它就在内存中并保持不变直到被删除。所以没有代码重复。因此,只需要在每个其他模块中使用您需要的模块,您将获得其导出的相同存储/缓存副本。

答案 2 :(得分:0)

正如Topian所说,你可以两种方式使用,

但是,你应该在require时使用require() 像:
var bcrypt = require('bcrypt'); module.exports = function() { return bcrypt.hashSync('hello', 5); }

它看起来比绕过括号更好

逻辑上两种方式都正确,因为Jiby Jose表示没有重复代码和应用程​​序性能的问题