node.js中的exports和module.exports

不一样的编程语言都有各自的代码组织和复用的方式,如.net、php中的命名空间,python中的import,ruby中的module等,来避免命名空间污染。一直都没搞清楚node中的exports和module.exports的区别,借此搞清楚node的代码模块复用方式。php

 

首先怎么建立node中的modules。node

能够直接建立一个文件做为module,以下module.jspython

function writeLine(){
    console.log("module.js");
}
exports.dbleNum=function(num){
    return num*2;
}
exports.tripleNum=function(num){
    return num*3;
}

 

 其中,咱们exports两个函数,在example.js文件中(以下),咱们能够利用require就能取得这两个函数npm

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,做者,版本等等,咱们简略一下就不写那么多,主要写了以下json

{
  "name": "module",
  "description": "example",
  "version": "0.0.1",
  "dependencies": {
    },
  "main": "module",
  }

 

 通常模块中的主文件是index.js,也就是"main":"index.js"。这里模块咱们写的是module.js,我也就懒的改了,因此写成了module。ruby

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是不能够的,以下ui

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是会被忽略的。

 若有错误,欢迎指正。

相关文章
相关标签/搜索