热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

module.exports与exports.xxx的区别

1.原理解析NodeJS中使用了CommonJS的模块化标准,Node内部提供一个Module构建函数。所有模块都是Module的实例。每个模块内部,

1. 原理解析

NodeJS中使用了CommonJS的模块化标准,Node内部提供一个Module构建函数。所有模块都是Module的实例。每个模块内部,都有一个module对象,代表当前模块。而这个module对象中,就存在一个成员 exports,该成员也是一个对象。也就是说,如果你需要对外导出成员,只需要把导出的成员挂载到 module.exports 上就可以了,最终module对象中会执行 retrun module.exports 将挂载的值返回给require的对象。

var module = {exports: {// 挂载的对象都放到这里}
}

所以,原理是你是可以这么写的

function add(a, b) {return a + b
}module.exports.add = add

运行结果也无报错
在这里插入图片描述
但是你会发现,这样做的话,每次都需要写那么长的一截 module.exports.xxx ,很麻烦,于是就引入一个 exports 变量 (注意:就只是个变量名,不是module里面的那个exports对象)
var exports = module.exports;
如果是学过指针或者对数据结构比较熟悉的同学,一看到这个代码就明白是怎么一回事了,它是一个引用传递,就只是把 exports 指向了和module.exports 的同一块内存空间。
在这里插入图片描述
因此,exports变量就可以向exports对象中添加方法或属性
也就是说exports.addmodule.exports.add 的作用是一样的。
而当你操作exports变量指向其他空间的时候,它就与exports对象断联了,比如说: exports = add,这个语句是直接将exports指向了add 方法的返回值
在这里插入图片描述


2. 用法区别

一般来说,导出多个成员可以沟通过使用多个 exports.xxx = xxx 或者使用一个 module.exports = {}的方式来实现,而导出单个成员时使用module.exports = xxx

你肯定很疑惑为什么说导出单个的时候使用 module.exports = xxx ?人家做exports变量不就是方便你使用的吗?你怎么辜负别人的好心?

举个例子你就明白了

还是上面的那个两数相加的案例,和上面不同的是,我直接写了module.exports = add 而不是 module.exports.add = add

function add(a, b) {return a + b
}module.exports = add

接下来我在另外一个文件中,导入这个文件,并调用它的add方法。

const wantAdd = require('./module')
console.log(wantAdd(1,2))

输出的结果为 3
在这里插入图片描述
而如果改成了 exports.add = add 的方式导出的话

const wantAdd = require('./module')// console.log(wantAdd(1,2))
console.log(wantAdd.add(1,2))

输出结果同样为3
在这里插入图片描述
那有什么不同呢? 聪明的你一定发现了,使用 module.exports = xxx 的时候,我调用 add 方法是直接通过 wantAdd(1, 2) 来实现的;而使用 exports.add = add 的时候,调用add方法需要通过 wantAdd.add(1, 2) 来实现的。
原理就是由于module.exports = xxx是直接导出了 exports对象,也就说exports对象就是add方法;而exports.add = add 相当于 module.exports.add = add ,是在 exports 中新加了一个变量去指向 add 方法,所以你用wantAdd变量接收exports对象时,还需要调用 add 变量去使用到 add方法。
所以在导出单个的时候,使用 module.exports 会更方便些。


总结

exports 与 module.exports 本是同根生,在用法上稍稍不同,原理上也比较简单易懂。exports.xxx = xxx 在传递多个对象的时候,写法看起来优雅一些,算是一种快捷方式。若你实在是感受不到 exports 的好处或者分不清 exports变量与module.exports的区别,那你就使用module.exports 就好了,绝对不会有问题的。


推荐阅读
  • 使用 Vue 集成 iScroll 实现移动端表格横向滚动与固定列功能 ... [详细]
  • 本文深入探讨了 Vue.js 中异步组件的应用与优化策略。首先,文章介绍了异步组件的基本概念及其在现代前端开发中的重要性。为了确保最佳实践,建议使用 Webpack 作为模块打包工具,因为 Browserify 默认不支持异步组件的加载。接着,详细解释了异步组件的使用方法,并提供了官方文档的相关链接以供参考。此外,文章还讨论了多种优化技巧,包括代码分割、懒加载和性能调优,以提升应用的整体性能和用户体验。 ... [详细]
  • 基于Node.js的高性能实时消息推送系统通过集成Socket.IO和Express框架,实现了高效的高并发消息转发功能。该系统能够支持大量用户同时在线,并确保消息的实时性和可靠性,适用于需要即时通信的应用场景。 ... [详细]
  • JavaScript最初并非设计为纯粹的面向对象编程(OOP)语言,因为直到ES5标准中仍未引入类的概念。然而,随着ES6的发布,JavaScript正式引入了类的语法,使得开发者能够更加直观地实现继承机制。本文将深入探讨JavaScript中多样的继承实现方法,包括原型链、寄生组合式继承等技术,并分析它们的优缺点及适用场景。 ... [详细]
  • Mongoose E11000 错误:集合中出现重复键问题分析与解决 ... [详细]
  • 为了深入了解某些测试框架的工作原理,并在培训中构建一个简单的测试框架,我系统地研究了 should.js 的源代码。本文将分享我的学习过程和分析结果,帮助读者更好地掌握 should.js 的核心机制。 ... [详细]
  • React组件是构成用户界面的基本单元,每个组件都封装了特定的功能和逻辑,具备高度的独立性和可复用性。通过将不同大小和功能的组件组合在一起,可以构建出复杂且功能丰富的页面,类似于拼图游戏中的各个部分,最终形成一个完整的视觉效果。 ... [详细]
  • 在Java中,匿名函数作为一种无名的函数结构,无法独立调用;而在JavaScript中,不仅有类似的匿名函数,还有立即执行函数(IIFE)和闭包等高级特性。立即执行函数同样基于匿名函数实现,但会在定义时立即执行,而闭包则通过嵌套函数来捕获外部变量,实现数据封装和持久化。这些不同的函数形式在实际开发中各有应用场景,理解其特点有助于更好地利用语言特性进行编程。 ... [详细]
  • 深入解析:JavaScript中的表达式与语句有何不同
    深入解析:JavaScript中的表达式与语句有何不同 ... [详细]
  • 【前端开发】深入探讨 RequireJS 与性能优化策略
    随着前端技术的迅速发展,RequireJS虽然不再像以往那样吸引关注,但其在模块化加载方面的优势仍然值得深入探讨。本文将详细介绍RequireJS的基本概念及其作为模块加载工具的核心功能,并重点分析其性能优化策略,帮助开发者更好地理解和应用这一工具,提升前端项目的加载速度和整体性能。 ... [详细]
  • 根据不同环境需求,利用 Vue CLI 的 `npm run build` 命令对项目进行定制化打包,如测试、预发布和生产环境。通过配置 `process.env` 变量,实现不同环境下接口和服务的动态切换,确保应用在各阶段都能高效运行和调试。 ... [详细]
  • 这篇文章将揭示 Vue 和 React 组件库中五个鲜为人知的强大工具。这些工具均以纯 JavaScript 实现,功能卓越。其中,async-validator 是一个数据验证插件,不仅预置了 URL 和电子邮件的验证规则,还支持异步验证功能。 ... [详细]
  • npm 发布 WhalMakeLink 包:链接管理与优化的新选择
    WhalMakeLink 是一个强大的 npm 工具,专为项目管理和优化而设计。它能够自动在项目的 README 文件中生成当前工程目录下所有子项目的链接地址,极大提升了开发效率和文档维护的便捷性。通过简单的 `npm init` 命令即可快速启动和配置该工具,适用于各种复杂项目结构。 示例演示了其基本用法和功能。 ... [详细]
  • 初次接触AJAX是在去年,当时主要是通过手动编写客户端代码来实现,还需处理被请求的页面,过程相当繁琐。尽管之前就听说过AJAX.NET,但一直没有机会深入了解。本文将作为初学者的指南,详细介绍AJAX.NET的基本概念、核心功能及其在实际项目中的应用技巧,帮助读者快速上手并掌握这一强大的开发工具。 ... [详细]
  • 本文详细介绍了如何在微信小程序中使用JavaScript实现图片上传至PHP服务器的方法。通过具体的代码示例,帮助开发者掌握从客户端选择图片、处理图片数据到服务器端接收并保存图片的完整流程。同时,文章还提供了常见问题的解决方案和优化建议,确保上传过程的高效性和稳定性。 ... [详细]
author-avatar
_我的最愛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有