node.js中的exports和module.exports
不同的编程语言都有各自的代码组织和复用的方式,如.net、php中的命名空间,python中的import,ruby中的module等,来避免命名空间污染。一直都没搞清楚node中的exports和module.exports的区别,借此搞清楚node的代码模块复用方式。
首先怎么创建node中的modules。
可以直接创建一个文件作为module,如下module.js
function writeLine(){
    console.log("module.js");
}
exports.dbleNum=function(num){
    return num*2;
}
exports.tripleNum=function(num){
    return num*3;
}
其中,我们exports两个函数,在example.js文件中(如下),我们可以利用require就能取得这两个函数
var module = require('./module');
console.log(module.dbleNum(3));
console.log(module.tripleNum(3));
这样就可以用module.js中的函数了。其中./表示这模块和当前的调用模块在同一目录下,若是放在子目录lib下面,就是require('./lib/module'),不需要后缀.js的。
当然这是简单的单个文件的模块,如果是比较复杂的可以以包的形式,也即n像pm安装的包那样子。如上module.js文件,我们将其放在example_module文件夹下,里面新建一个package.json文件(这是是包的主要信息),有名称,描述,依赖,main,作者,版本等等,我们简略一下就不写那么多,主要写了如下
{
  "name": "module",
  "description": "example",
  "version": "0.0.1",
  "dependencies": {
    },
  "main": "module",
  }
一般模块中的主文件是index.js,也就是"main":"index.js"。这里模块我们写的是module.js,我也就懒的改了,所以写成了module。
var module = require('./example_module');
console.log(module.dbleNum(3));
console.log(module.tripleNum(3));
这样就可以调用example_module这个包了。由于不是通过npm安装,不能直接require('example_module');自己尝试了下,如果新建个node_modules文件夹,把example_module放里面,就可以直接require('example_module'),应该是因为npm安装的包也是会安装到node_modules中的。
说到现在还没说exports和module.exports的区别,囧。
如果创建了一个module,想返回其中的一个变量或者函数,将其直接赋给exports是不可以的,如下
var calcNum = function(){};
calcNum.prototype.dbleNum=function(num){
    return num*2;
}
calcNum.prototype.tripleNum=function(num){
    return num*3;
}
exports = calcNum;
这样是不可以的。但是如果可以将exports换成module.exports就是可行的。此时倒出的calcNum,如果在example.js中调用就要像下面这样子。
var module = require('module');
var test = new module;
console.log(module.dbleNum(3));
console.log(module.tripleNum(3));
这是因为exports是module.exports的全局引用,exports.myfunc是module.exports.myfunc的缩略写法。于是,如果将任何函数、对象、变量赋给exports就断开了exports与module.exports的引用关系,而事实上module.exports是真正的出口,所以直接将变量或者函数赋给exports是不可以的(exports.myfunc=myfun是可以的,因为没有切断exports和module.exports的引用关系)。因此,在同一个module中,如果exports和module.exports同时存在,exports是会被忽略的。
如有错误,欢迎指正。
node.js中的exports和module.exports的更多相关文章
- Node.js中的模块接口module.exports浅析
		
在写node.js代码时,我们经常需要自己写模块(module).同时还需要在模块最后写好模块接口,声明这个模块对外暴露什么内容.实际上,node.js的模块接口有多种不同写法.这里作者对此做了个简单 ...
 - Node.js中的模块接口module.exports
		
在写node.js代码时,我们经常需要自己写模块(module).同时还需要在模块最后写好模块接口,声明这个模块对外暴露什么内容.实际上,node.js的模块接口有多种不同写法.在此做了个简单的总结. ...
 - Node.js中exports与module.exports的区别
		
原文:http://www.hacksparrow.com/node-js-exports-vs-module-exports.html 你肯定对Node.js模块中用来创建函数的exports对象很 ...
 - Node.js中exports,module.exports以及require方法
		
在Node.js中,使用module.exports.f = ...与使用exports.f = ...是一样的,此时exports就是module.exports的一种简写方式.但是,需要注意的是, ...
 - node.js模块中exports和module.exports的区别
		
Node应用由模块组成,采用CommonJS模块规范. 根据这个规范,每个文件就是一个模块,有自己的作用域.在一个文件里面定义的变量.函数.类,都是私有的,对其他文件不可见. CommonJS规范规定 ...
 - Node.js中的exports与module.exports的区分
		
1. module应该是require方法中,上下文中的对象 2. exports对象应该是上下文中引用module.exports的新对象 3. exports.a = xxx 会将修改更新到mod ...
 - Node.js 中 exports 和 module.exports 的区别
		
每一个模块中都有一个 module 对象, module 对象中有一个 exports 对象 我们可以把需要导出的成员都放到 module.exports 这个接口对象中,也就是 module.exp ...
 - Node.js exports与module.exports的关系
		
今天搜索module.exports时看到CNode社区上发的Hack Sparrow一篇相关文章的链接 Node.js Module – exports vs module.exports 一篇5年 ...
 - (译)Node.js的模块-exports和module.exports
		
原文标题:Node.js Module – exports vs module.exports 原文链接:http://www.hacksparrow.com/node-js-exports-vs-m ...
 
随机推荐
- Python+Selenium中级篇之-封装一个自己的类-浏览器引擎类
			
前一篇文章我们知道了,如何去封装几个简单的Selenium方法到我们自定义的类,这次我们编写一个类,叫浏览器引擎类,通过更改一个字符串的值,利用if语句去判断和控制启动那个浏览器.这里我们暂时,支持三 ...
 - vlc无法播放.flv视频文件
			
解决方法:https://videoconverter.wondershare.com/vlc/flv-not-displaying-video-vlc-media-player.html. 在pre ...
 - IE IE8 iframe的onload方法分析 IE浏览器onload事件失效
			
判断iframe是否加载完成的完美方法 IE 支持 iframe 的 onload 事件,不过是隐形的,需要通过 attachEvent 来注册. 第二种方法比第一种方法更完美(采用readystat ...
 - C#中var、int、object性能比较(已修正)
			
var关键字是.net3.5推出的关键字,主要是让编译器自动推断并判断变量类型,类似javascript中的var. 在使用一些性能优化软件时,在代码优化时,我发现不管定义什么类型的变量,变量的类型都 ...
 - HDU 3622  Bomb Game(二分+2-SAT)
			
Bomb Game Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
 - BZOJ 3462 DZY Loves Math II ——动态规划 组合数
			
好题. 首先发现$p$是互质的数. 然后我们要求$\sum_{i=1}^{k} pi*xi=n$的方案数. 然后由于$p$不相同,可以而$S$比较小,都是$S$的质因数 可以考虑围绕$S$进行动态规划 ...
 - 安装淘宝内核LVS
			
具体安装方法按照淘宝twiki来:http://kernel.taobao.org/index.php?title=Documents/Kernel_build. 但是有些问题是要注意的: 1. 修改 ...
 - 笔记:CS231n+assignment2(作业二)(二)
			
一.参数更新策略 1.SGD 也就是随机梯度下降,最简单的更新形式是沿着负梯度方向改变参数(因为梯度指向的是上升方向,但是我们通常希望最小化损失函数).假设有一个参数向量x及其梯度dx,那么最 ...
 - CCC2019游记
			
好吧其实是清华游记,$CCC2019$ 在中国只有北京和天津举办,要选去加拿大的人很少,估计是最近两国关系有点紧张的缘故吧 但实际上是某些已经被清华钦点的人去预览一下他们未来的栖息所 $13:30$ ...
 - hash function 字符串哈希函数
			
#include <stdio.h> int hash(const char *str) { ; ;;i++) { if (str[i] == '\0') break; sum += (( ...