不一樣的編程語言都有各自的代碼組織和複用的方式,如.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是會被忽略的。
若有錯誤,歡迎指正。