首页 > web前端 > js教程 > Node.js 中的'module.exports”和'exports”有什么区别,为什么都使用?

Node.js 中的'module.exports”和'exports”有什么区别,为什么都使用?

Patricia Arquette
发布: 2024-11-22 11:44:09
原创
243 人浏览过

What is the difference between `module.exports` and `exports` in Node.js, and why are both used?

探索 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板