2017-05-26 95 views
0

有三个模块:a.js,b.js,c.js,a.js是导出数据库连接,b.js,c.js是导入连接,就像在两个不同的http路由中一样,所以连接模块(a .js文件)将被导入两次,这是否意味着驱动程序将连接到数据库两次?我与node.js中的模块相混淆

我已经试过这样: test.js

let a = 20; 
let b = 30; 
console.log('I am test'); 
let obj = { 
    a, 
    b 
} 
module.exports = obj; 

en.js

let obj = require('./test'); 

console.log('I am en.js') 

module.exports = obj; 

hi.js

let obj = require('./test'); 
let obj2 = require('./en'); 

console.log(obj2) 

运行hi.js和结果:

I am test 
I am en 
{a:20,b:30} 

en.js和hi.js都导入test.js,从结果来看似乎test.js只运行一次,所以为什么呢?希望你的帮助。

回答

0

模块是他们第一次加载后缓存。这意味着(除其他外)每次调用require('foo')都会返回完全相同的对象,如果它解析为同一个文件。

你可以在这里阅读更多

https://nodejs.org/api/modules.html#modules_caching

+0

感谢,现在很明显。 – laoqiren

+0

其实模块不仅缓存。模块系统正确地实现了Singleton模式。 node.js上的所有模块都是单例。这比单纯的缓存功能强大得多,这意味着从模块导入的所有代码实际上都获得了相同的对象。是的,Singleton设计模式通常用于缓存,但真正的意图是在流程中创建单个gobal对象。 – slebetman