探索 Node.js 中 'module.exports' 和 'exports' 之间的差异
在 Node.js 模块系统中,有有两个值得注意的变量:“module.exports”和“exports”。虽然它们看起来可以互换,但理解它们之间的细微差别对于有效的模块开发至关重要。
考虑所提供问题中提到的契约:
module.exports = exports = nano = function database_module(cfg) {...}
这种语法提出了一个问题:什么是“module.exports”和“exports”之间的区别,以及为什么两者都被使用?
要解开这个谜题,让我们假设每个模块都以以下几行开头:
var module = new Module(...); var exports = module.exports;
本质上,“module.exports”和“exports”最初指向同一个对象。当您为“exports”赋值时,您实际上是在修改“module.exports”引用的对象。
在示例合约中,我们首先考虑“安全”方法:
// Using module.exports module.exports.a = function() { console.log('a'); } module.exports.b = function() { console.log('b'); }
这里,“安全”意味着“module.exports”仍然是包含导出函数的对象。当你需要这个模块时,你会得到这个对象。
但是,分配给'exports'可能是“危险的”:
// Using exports exports.a = function() { console.log('a'); } exports.b = function() { console.log('b'); }
虽然'module.exports'和'exports'最初指向同一个对象,直接分配给“exports”会破坏该引用。结果,'module.exports' 仍然指向一个空对象 {},当需要模块时会返回该对象。
值得注意的是,为 'module.exports' 分配一个构造函数可以有与“导出”的含义不同:
// Assigning constructor to module.exports module.exports = function Something() { console.log('bla bla'); }
在这种情况下,返回结果的“typeof”将是 '功能。'这允许您直接将模块作为函数来 require 和调用。
但是,将构造函数分配给 'exports' 将不会产生相同的效果:
// Assigning constructor to exports exports = function Something() { console.log('bla bla'); }
通过重新分配 'exports, ' 你切断了 'module.exports' 和构造函数之间的连接,将 'module.exports' 留为空
总之,理解“module.exports”和“exports”之间的细微差别对于开发有效的 Node.js 模块至关重要。虽然两个变量最初都指向同一个对象,但“module.exports”应被视为从模块导出值的官方方法,因为它始终指向导出的对象。另一方面,当您需要直接修改导出的对象或分配构造函数时,“导出”可能很有用。
以上是Node.js 中的'module.exports”和'exports”有什么区别,为什么都使用?的详细内容。更多信息请关注PHP中文网其他相关文章!