这个闭包是否会导致 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() 的结果,所以这就是您重复调用的内容,而不是您创建的外部包装函数。该包装函数仅在启动时执行一次。