先导出函数,然后导出对象

Export function first and object subsequently

本文关键字:对象 然后 函数      更新时间:2023-09-26

我有一个自定义模块,希望提供一个方法在第一个require上初始化它,但在后续需要时直接返回一个对象。

但是模块在第一次需要时被缓存,因此后续的需要仍然返回init函数,而不是直接返回obj

server.js:

var module = require('./module.js');
var obj = module.init();
console.log('--DEBUG: server.js:', obj); // <-- Works: returns `obj`.
require('./other.js');

other.js:

var obj = require('./module.js');
console.log('--DEBUG: other.js:', obj); // <-- Problem: still returns `init` function.

module.js:

var obj = null;
var init = function() {
    obj = { 'foo': 'bar' };
    return obj;
};
module.exports = (obj) ? obj : { init: init };

我该如何解决这个问题?还是有一种既定的模式可以实现这一点?

但我想缓存obj,因为我真正的init做了一些我不想在每个require上做的工作。

有一些方法可以清除所需的缓存。你可以在这里检查node.jsrequire()缓存-是否可能无效?然而,我认为这不是一个好主意。我建议通过你需要的模块。即只初始化一次,然后将其分配给其他模块。

server.js:

var module = require('./module.js');
var obj = module.init();
require('./other.js')(obj);

other.js:

module.exports = function(obj) {
    console.log('--DEBUG: other.js:', obj); // <-- The same obj
}

module.js:

var obj = null;
var init = function() {
    obj = { 'foo': 'bar' };
    return obj;
};
module.exports = { init: init };