我知道模块加载应该在node.js中如何工作,但我没有观察到正确的行为(如果你查看以下评论,实际上似乎存在轻微的差异) this answer)
使用nodejs 8.2.1,我有以下结构:
app
|
+ server.js
+ log
| |
| + index.js
+ db
|
+ index.js
在 server.js 中,我调用 require('./log')
,在/log/index.js 中,我 require('winston')
并像这样配置它:
let logger = new (winston.Logger)({
transports: [
new (winston.transports.Console)({
name: 'console',
level: logLevel,
handleExceptions: true,
json: false,
colorize: process.env.NODE_ENV === 'dev',
timestamp: true
})
]
});
根据this answer ,我应该能够从任何其他模块中 require('winston')
,并且我将获得相同的配置实例。我实际看到的是,当我在 db/index.js
中 require('winston')
时,默认的 winston
实例位于内存,无需任何配置。我也逐步完成了 require.cache
;没有其他模块添加到缓存中,因此据我所知,如果缓存正常工作,应该返回相同的配置实例。我已验证 log/index.js
中的代码在加载 db/index.js
中的模块之前被调用。
有什么想法吗?我应该在所有依赖模块中require
我的./log
模块吗?
最佳答案
Any ideas? Should I just be requireing my ./log module in all my dependent modules?
是的,你应该这样做。就像你说的,当你需要一个父模块已经需要的模块时,你正在访问同一个对象。但实际上,使用 winston,您正在导入一个构造函数(事实上,为了配置它,您定义一个名为 logger 的变量,并创建一个新的 winson 记录器)。
你应该只从logs/index.js导出记录器(并使用const而不是let)
const logger = new (winston.Logger)({ ... })
module.exports = logger
在另一个模块中你可以这样做
const logger = require('./log/index.js') // './log' is the same
记录器将始终是同一个对象:)
关于javascript - 调用 require 不会返回相同的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46719785/