这个闭包是否会导致 Node.js 中的内存泄漏或者它是一个糟糕的编程?
Does this closure cause a memory leak in Node.js or Is it a bad programming?
这不是 will-this-closure-cause-a-memory-leak 的副本,因为那是 ios/swift 而这是 javascript/nodejs
现在我打算只将它用于调试,并继续从 mocha/test 等任何地方调用。因此它会立即将格式良好的调试信息/(复杂的 json 对象)记录到test 文件夹而不是服务器控制台。
仍然很想了解其中的含义,因为每次调用此类函数都会依次调用 require('winston')
,我不确定这是一个好的做法,其次我想确保内存泄漏。
exports.debugLog = (() => {
const winston = require('winston');
return winston.createLogger({
level: 'info',
format: winston.format.json(),
defaultMeta: {service: 'debug-service'},
transports: [new winston.transports.File({filename: 'debug.log'})]
})
})()
我不确定您认为代码的哪一部分会导致内存泄漏。
定时打电话没问题:
const winston = require('winston');
模块被缓存,因此在第一次加载模块后,对 require()
同一模块的后续调用会立即 returns 缓存导出。它很快,根本不是问题。在你的具体情况下,我可能会这样写:
const winston = require('winston');
exports.debugLog = winston.createLogger({
level: 'info',
format: winston.format.json(),
defaultMeta: {service: 'debug-service'},
transports: [new winston.transports.File({filename: 'debug.log'})]
});
只是因为它更容易理解。
完全不清楚您为什么要使用额外的函数包装器。 const winston
仅适用于此模块,因此没有真正的理由尝试将其隐藏在 IIFE 和 IMO 中,包装器只会使代码更加混乱,无法立即理解它在做什么。
Still curious to understand implication because for each call to such function will in turn call require('winston') which I am not sure is a good practice and second I want to ensure about memory leak.
每次调用 debugLog()
都不会再次调用 require('winston')
。 debugLog
被分配了 winston.createLogger()
的结果,所以这就是您重复调用的内容,而不是您创建的外部包装函数。该包装函数仅在启动时执行一次。
这不是 will-this-closure-cause-a-memory-leak 的副本,因为那是 ios/swift 而这是 javascript/nodejs
现在我打算只将它用于调试,并继续从 mocha/test 等任何地方调用。因此它会立即将格式良好的调试信息/(复杂的 json 对象)记录到test 文件夹而不是服务器控制台。
仍然很想了解其中的含义,因为每次调用此类函数都会依次调用 require('winston')
,我不确定这是一个好的做法,其次我想确保内存泄漏。
exports.debugLog = (() => {
const winston = require('winston');
return winston.createLogger({
level: 'info',
format: winston.format.json(),
defaultMeta: {service: 'debug-service'},
transports: [new winston.transports.File({filename: 'debug.log'})]
})
})()
我不确定您认为代码的哪一部分会导致内存泄漏。
定时打电话没问题:
const winston = require('winston');
模块被缓存,因此在第一次加载模块后,对 require()
同一模块的后续调用会立即 returns 缓存导出。它很快,根本不是问题。在你的具体情况下,我可能会这样写:
const winston = require('winston');
exports.debugLog = winston.createLogger({
level: 'info',
format: winston.format.json(),
defaultMeta: {service: 'debug-service'},
transports: [new winston.transports.File({filename: 'debug.log'})]
});
只是因为它更容易理解。
完全不清楚您为什么要使用额外的函数包装器。 const winston
仅适用于此模块,因此没有真正的理由尝试将其隐藏在 IIFE 和 IMO 中,包装器只会使代码更加混乱,无法立即理解它在做什么。
Still curious to understand implication because for each call to such function will in turn call require('winston') which I am not sure is a good practice and second I want to ensure about memory leak.
每次调用 debugLog()
都不会再次调用 require('winston')
。 debugLog
被分配了 winston.createLogger()
的结果,所以这就是您重复调用的内容,而不是您创建的外部包装函数。该包装函数仅在启动时执行一次。