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

 若有錯誤,歡迎指正。

相關文章
相關標籤/搜索