1、模塊化的由來
所有方法寫在一塊兒,容易命名衝突,而且污染global全局javascript
function foo(){} function bar(){}
減小了全局的變量,可是仍然能夠經過myFunc.foo去操做數據,不安全html
var myFunc = { _private:'no safe', foo: function(){ console.log(this._private) } } myFunc._private = 5; myFunc.foo();
函數時javascript中惟一的localScope, 沒法操做裏面的數據前端
var module = (function(){ var _private = 'safe now'; var foo = function(){ console.log(_private); } return { foo:foo } })(); 或者 (function(){ var _private = 'safe now'; var foo = function(){ console.log(_private); } // 暴露模塊 window.module = { foo:foo } })() module._private; // undefined module.foo();
有時候,咱們的功能須要依賴模塊才能完成,此時須要蔣模塊注入進來java
// 這就是模塊模式的基礎 var module = (function($){ var _private = $('body'); var foo = function(){ console.log(_private); } // 暴露模塊 return { foo:foo } // 引入模塊 })(JQuery); 或者 (function(global){ var _private = 'safe'; var foo = function(){ console.log(_private); } // 暴露模塊 global.module = { foo:foo } // 引入模塊 })(window) module.foo();
2、模塊化規範
暴露模塊:默認exports是{}, 第一種至關於把exports覆蓋了,第二種至關於時往exports中添加屬性。node
引入模塊:web
實現:npm
瀏覽器端:使用browserify打包工具 不然瀏覽器不能識別json
browserify src/app.js -o bundle.js
代碼演示:segmentfault
// module1.js module.exports = { msg: 'module1', foo: function () { console.log(this.msg); } };
// module2.js module.exports = function () { console.log('module2'); };
// module3.js exports.foo = function () { console.log('foo module3'); }; exports.bar = function () { console.log('bar module3'); }; exports.arr = [1, 224, 2, 4, 2, 4784, 3];
// app.js const uniq =require('uniq') const module1 = require('./module1'); const module2 = require('./module2'); const module3 = require('./module3'); module1.foo(); module2(); module3.foo(); module3.bar(); console.log(uniq(module3.arr));
3、commonjs詳解
Node.js的模塊分爲兩類:數組
Tips:Node.js對原生模塊和文件模塊都進行了緩存,因而在第二次require時,是不會有重複開銷的。其中原生模塊都被定義在lib這個目錄下面,文件模塊則不定性。
要點:
require方法接受如下幾種參數的傳遞:
module path的生成規則爲
// 從當前文件目錄開始查找node_modules目錄 // 而後依次進入父目錄,查找父目錄下的node_modules目錄 // 依次迭代, 直到根目錄下的node_modules目錄 [ '/home/jackson/research/node_modules', '/home/jackson/node_modules', '/home/node_modules', '/node_modules' ] // 除此以外還有一個全局module path,是當前node執行文件的相對目錄 (../../lib/node)。 // 若是在環境變量中設置了HOME目錄和NODE_PATH目錄的話,整個路徑還包含NODE_PATH和HOME目錄下的.node_libraries 與.node_modules [ NODE_PATH, HOME/.node_modules, HOME/.node_libraries, execPath/../../lib/node ]
Node.js在沒有找到目標文件時,會將當前目錄看成一個包來嘗試加載,因此在package.json文件中最重要的一個字段就是main。對於require,只須要main屬性便可。
可是在除此以外包須要接受安裝、卸載、依賴管理,版本管理等流程,因此CommonJS爲package.json文件定義了以下一些必須的字段
contributors : 包貢獻者的數組。第一個就是包的做者本人。在開源社區,若是提交的patch被merge進master分支的話,就應當加上這個貢獻patch的人。格式包含name和email。
"contributors": [{ "name": "Jackson Tian", "email": "mail @gmail.com" }, { "name": "fengmk2", "email": "mail2@gmail.com" }],
licenses : 包所使用的許可證。例如:
"licenses": [{ "type": "GPLv2", "url": "http://www.example.com/licenses/gpl.html", }]