通常我们用exports 或module.exports 来导出一个文件中的接口和字段,用require来引用导出的对象.那么这个exports 和 module.exports到底有啥关联呢?

1.新建app.js 然后写代码 :console.log({} instanceof Object) 结果是true  说明{} 是一个Object 的实例对象,这里是字面量的形式.

2.在app.js 中写上 console.log(module)

然后运行,结果类似下面的:可知module.exports 是一个{} 形式的对象.

Module {
id: '.',
exports: {},
parent: null,
filename: '/Users/johnson/Documents/app.js',
loaded: false,
children: [],
paths:
[ '/Users/johnson/Documents/node_modules',
'/Users/johnson/node_modules',
'/Users/node_modules',
'/node_modules' ] }

3. 而单独运行console.log(exports)  结果是 {}

4. 不过console.log(exports ==={}) ,console.log(module.exports ==={}) 都是false,说明{}是一个全新的Object 对象.

5.再写个: console.log(exports === module.exports)  结果是true  可以知道module.exports  和  exports 是相同的对象.

注意:{}表示创建了一个新的对象, 这种是Object 对象的字面量形式,比较对象的时候,比较的还是地址.

由以上结论可以知道,平时我导出接口的时候,用exports 和  module.exports 没有什么区别,应为它们的指向是一样的,类似下面的代码:

module.exports = exports = {}

不过还有一点,require 的时候,我们用的究竟是module.exports 呢还是 exports 呢?

新建js文件test.js:

module.exports.minus = function(a,b){
return a - b;
}
exports.multiply = function(a,b){ return a * b;
} // exports = {} // module.exports = {}

新建js文件app.js:

var t = require('./test')

console.log(t.minus(3,2))
console.log(t.multiply(3,2))

经过测试exports = {} 注释或不注释都不会影响结果 ,但是如果把下面的那句注释去掉,则运行报错,找不到导出的接口.

这说明,require 引用的是module.exports 对应的对象. 而exports 的意义就在于省略了一个module而已.

nodejs 包引用的终极结论的更多相关文章

  1. .Net Core 项目中的包引用探索(使用VSCode)

    本文组织有点乱,先说结论吧: 1 在 project.json 文件中声明包引用. 而不是像以前那样可以直接引用 dll. 2 使用 dotnet restore 命令后,nuget 会把声明的依赖项 ...

  2. 使用rust调用c++静态库并编译nodejs包

    在项目上经常要用到身份证阅读器.护照阅读仪.指纹仪等各种品牌硬件,假如每套系统的都做集成开发那代码的维护成本将变得很高,为此采用rust来调用厂家提供的sdk c++开发包并封装成nodejs包,用f ...

  3. go语言的安装和配置,以及包引用

    1.下载和安装 首先大家可以去官网下载 http://golang.org/dl/ 如果官网你看不懂的话,可以到这里下载: http://golangtc.com/download ,这里也提供了百度 ...

  4. python 子包引用父包和其他子包

    python 子包引用父包和其他子包 python引用子目录很简单, 里面放个__init__.py就可以了. 如何在子目录里面引用其他目录(父目录,爷目录和同辈分目录)呢? 例如: python有项 ...

  5. shiro-core包引用的版本问题

    在做shiro学习时,遇到这样的问题: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/ ...

  6. 在Android Studio添加本地aar包引用

    1.如何在Android Studio添加本地aar包引用 https://jingyan.baidu.com/article/2a13832890d08f074a134ff0.html 2.完成上述 ...

  7. [Dynamic Language] Python非子包引用

    Python非子包引用 python的搜索路径其实是一个列表(sys.path) 导入模块时python会自动去找搜索这个列表当中的路径,如果路径中存在要导入的模块文件则导入成功. 在项目中如果要引用 ...

  8. golang包引用解析

    golang包引用解析 环境变量配置如下: GOROOT----[C:\Go] GOPATH----[F:\workspace\go_home] vs code配置如下: F:\workspace\g ...

  9. 项目中nodejs包高效升级插件npm-check-updates

    nodejs包高效升级插件npm-check-updates 最近想升级npm的包 1.//常规的包升级方式/2.npm update (包) 到npm一搜发现了一个很好的升级工具 npm-check ...

随机推荐

  1. linux学习之linux的hostname修改详解《转》

    linux的hostname是一个kernel变量,可以通过hostname命令来查看本机的hostname.也可以直接cat /proc/sys/kernel/hostname查看. #hostna ...

  2. 在路由器上搭建SVN服务器

    在路由器上搭建SVN服务器 SVN托管服务大家都不陌生了,我最早开始用的是谷歌提供的SVN,因为在上面托管的项目都是开源的,所以当有些项目不方便在网上公开的时候,就需要自己搭建SVN服务器了.wind ...

  3. java.lang.NoClassDefFoundError: com.umeng.analytics.MobclickAgent

    07-24 09:58:23.239: E/AndroidRuntime(29487): FATAL EXCEPTION: main 07-24 09:58:23.239: E/AndroidRunt ...

  4. table指定位置添加行

    <html> <head> <script type="text/javascript"> //global var //to find the ...

  5. Elasticsearch中doc_value的认识

    前言:本文的目的是为后续磁盘空间利用优化做铺垫.主要知识点来源于官网文档 一.doc_value是什么 绝大多数的fields在默认情况下是indexed,因此字段数据是可被搜索的.倒排索引中按照一定 ...

  6. webpack中加载CSS

    webpack强大之处在于可以将CSS当做一个资源模块进行管理和加载 基本使用: 安装webpack的加载插件style-loader和css-loader: npm install style-lo ...

  7. GMap学习笔记

    GMap学习笔记 1.GMap体系详解 What is the map control (GMapControl)? This is the control which renders the map ...

  8. iOS开源项目周报0112

    由OpenDigg 出品的iOS开源项目周报第五期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. GD ...

  9. Dos.ORM Select查询 自定义列

    自定义列 .Select( p = >new{ test = p.id}) // 同sql 列名 as 新列名 如下是 自己在写代码的例子,查询,分页,where条件,排序 var where ...

  10. Spring总结 0.概述

    由于之前学了好多知识,感觉挺乱的.趁放假,想对这些知识复习归纳下.所以就有了这些随笔啦.随笔中可能会出现错误哈,万一有人看了并且发现了留言哈.勿喷,谢谢哈~先对Spring进行简要概括,以下内容有些摘 ...