nodejs 包引用的终极结论
通常我们用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 包引用的终极结论的更多相关文章
- .Net Core 项目中的包引用探索(使用VSCode)
本文组织有点乱,先说结论吧: 1 在 project.json 文件中声明包引用. 而不是像以前那样可以直接引用 dll. 2 使用 dotnet restore 命令后,nuget 会把声明的依赖项 ...
- 使用rust调用c++静态库并编译nodejs包
在项目上经常要用到身份证阅读器.护照阅读仪.指纹仪等各种品牌硬件,假如每套系统的都做集成开发那代码的维护成本将变得很高,为此采用rust来调用厂家提供的sdk c++开发包并封装成nodejs包,用f ...
- go语言的安装和配置,以及包引用
1.下载和安装 首先大家可以去官网下载 http://golang.org/dl/ 如果官网你看不懂的话,可以到这里下载: http://golangtc.com/download ,这里也提供了百度 ...
- python 子包引用父包和其他子包
python 子包引用父包和其他子包 python引用子目录很简单, 里面放个__init__.py就可以了. 如何在子目录里面引用其他目录(父目录,爷目录和同辈分目录)呢? 例如: python有项 ...
- shiro-core包引用的版本问题
在做shiro学习时,遇到这样的问题: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/ ...
- 在Android Studio添加本地aar包引用
1.如何在Android Studio添加本地aar包引用 https://jingyan.baidu.com/article/2a13832890d08f074a134ff0.html 2.完成上述 ...
- [Dynamic Language] Python非子包引用
Python非子包引用 python的搜索路径其实是一个列表(sys.path) 导入模块时python会自动去找搜索这个列表当中的路径,如果路径中存在要导入的模块文件则导入成功. 在项目中如果要引用 ...
- golang包引用解析
golang包引用解析 环境变量配置如下: GOROOT----[C:\Go] GOPATH----[F:\workspace\go_home] vs code配置如下: F:\workspace\g ...
- 项目中nodejs包高效升级插件npm-check-updates
nodejs包高效升级插件npm-check-updates 最近想升级npm的包 1.//常规的包升级方式/2.npm update (包) 到npm一搜发现了一个很好的升级工具 npm-check ...
随机推荐
- 使用VS2010命令提示窗口操作程序集强命名
说明:文中示例均以将文件置于D盘根目录(D:\)下为例. 一.查看程序集是否具有强命名 sn -T d:\LicBase.dll 若有则会显示PublicKeyToken值,反之不会. 二.给无强命名 ...
- golang环境搭建
golang环境搭建 好久没写博客了,最近加班好厉害,加到自己都觉得不太适合这个行业了,每天头都是沉甸甸的,可惜今年注定不是收获的季节. 最近忙里偷闲在学习nodejs,赶巧看到golang的文章,一 ...
- Sublime和Codeblocks支持C++11
Sublime和Codeblocks支持C++11 闲来没事看了一下C++11,比起C++0x多了很多新功能,像auto变量,智能指针等,g++4.7以上版本也提供了对C++11的支持,但是,如何在你 ...
- 多个AsynceTask无法同时运行的现象分析
关于这篇博客所提到的问题是在一段再简单不过的代码中意外出现的.当时我使用了两个不同'AsyncTask'帮助我执行两个需要在后台执行任务.并且这两个'AsyncTask'几乎是同时运行的.原本会正常运 ...
- BF533的SPORT接口
BF533的SPORT接口 1.特性 bf533有两个SPORT口(synchronous serial Port),即同步串行接口.完全独立的接收和发送通道,且每个通道都具有缓冲,最高速度可达SCL ...
- jquery禁用右键单击、F5刷新
1.禁用右键单击功能 $(document).ready(function() { $(document).bind("contextmenu",function(e) { ale ...
- WordPress 4.3 Beta 1 全新发布,改进了后台功能和用户体验
WordPress 4.3 Beta 1 发布,此版本是开发版本,不建议在生产环境使用.如果要测试 WordPress 4.3 Beta 版本,可以使用 WordPress Beta Tester 插 ...
- iOS7 Sprite Kit 学习
iOS7 Sprite Kit 学习 iOS 7有一个新功能 Sprite Kit 这个有点类似cocos2d 感觉用法都差不多.下面简单来介绍下Sprite Kit About Sprite Kit ...
- [置顶] Oracle学习路线与方法
还没有整理好.... 1.学习路线 Oracle官方文档:2 Day DBA-->2 Day+Performance Tuning Guide--->Administrator's Gui ...
- 闭包、lambda和interface
闭包.lambda和interface 人们都很喜欢讨论闭包这个概念.其实这个概念对于写代码来讲一点用都没有,写代码只需要掌握好lambda表达式和class+interface的语义就行了.基本上只 ...