当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Node.js module.exports用法及代码示例


module.exports

添加于:v0.1.16

module.exports 对象由Module 系统创建。有时这是不可接受的;许多人希望他们的模块成为某个类的实例。为此,请将所需的导出对象分配给 module.exports 。将所需对象分配给exports 将简单地重新绑定本地exports 变量,这可能不是所需的。

例如,假设我们正在制作一个名为 a.js 的模块:

const EventEmitter = require('node:events');

module.exports = new EventEmitter();

// Do some work, and after some time emit
// the 'ready' event from the module itself.
setTimeout(() => {
  module.exports.emit('ready');
}, 1000);

然后在另一个文件中我们可以这样做:

const a = require('./a');
a.on('ready', () => {
  console.log('module "a" is ready');
});

必须立即分配给module.exports。它不能在任何回调中完成。这不起作用:

x.js

setTimeout(() => {
  module.exports = { a: 'hello' };
}, 0);

y.js

const x = require('./x');
console.log(x.a);

exports捷径#

添加于:v0.1.16

exports 变量在模块的file-level 范围内可用,并在评估模块之前分配了module.exports 的值。

它允许使用快捷方式,以便 module.exports.f = ... 可以更简洁地写为 exports.f = ... 。但是,请注意,与任何变量一样,如果将新值分配给 exports ,它将不再绑定到 module.exports

module.exports.hello = true; // Exported from require of module
exports = { hello: false };  // Not exported, only available in the module

module.exports 属性被新对象完全替换时,通常还会重新分配 exports

module.exports = exports = function Constructor() {
  // ... etc.
};

为了说明这种行为,想象一下 require() 的这个假设实现,它与 require() 实际完成的非常相似:

function require(/* ... */) {
  const module = { exports: {} };
  ((module, exports) => {
    // Module code here. In this example, define a function.
    function someFunc() {}
    exports = someFunc;
    // At this point, exports is no longer a shortcut to module.exports, and
    // this module will still export an empty default object.
    module.exports = someFunc;
    // At this point, the module will now export someFunc, instead of the
    // default object.
  })(module, module.exports);
  return module.exports;
}

相关用法


注:本文由纯净天空筛选整理自nodejs.org大神的英文原创作品 module.exports。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。