将可选参数传递给 require()

pass optional parameters to require()

所以,我有这个问题 - 当我遇到 JavaScript 或节点问题时,不可避免地是我的编码问题 ;)

所以冒着被嘲笑的风险,这就是问题所在:

我有一个模块有一个可选的配置参数

使用标准模式,这是我的:

module.exports = function(opts){
    return {
        // module instance
    };
}

在调用代码中有这个

var foo = require('bar')({option: value})

如果没有要传递的选项,代码如下所示

var foo = require('bar')({})

哪个有点丑

所以,我想这样做

var foo = require('bar')

这不起作用,因为导出是一个函数调用

那么,进入正题

a) 有什么方法可以实现这个崇高的目标吗? b) 是否有更好的向模块传递参数的模式?

非常感谢 - 我希望一旦笑声过去,您将能够向我提供一些帮助:)

tldr:坚持 require('foo')('bar');

无法将其他参数传递给 require。这是 source code,请注意它只需要一个参数:

Module.prototype.require = function(path) {
  assert(util.isString(path), 'path must be a string');
  assert(path, 'missing path');
  return Module._load(path, this);
};

如果你真的真的很想避免()(),你可以尝试这样的事情:

b.js

'use strict';

module.exports = {
    x: 'default',
    configure: function (x) {
        this.x = x;
    },
    doStuff: function () {
        return 'x is ' + this.x;
    }
};

a.js

'use strict';

var b = require('./b');

// Default config:
console.log(b.doStuff()); // 'x is default'

// Reconfigure:
b.configure(42);

console.log(b.doStuff()); // 'x is 42'

不过我觉得比较丑...坚持原来的想法

您可以使选项参数选项不再需要空对象,而不是完全删除函数调用:

module.exports = function(opts) {
    opts = opts || {};
    return {
        // module instance
    };
}

它并没有完全消除对 () 的需求,但比 ({}) 更好。