requirejs定義的模組返回的永遠是單例對象,可以藉助javascript中的類解決模組間的相互幹擾問題
RequireJS中定義一個模組,總的來說有2種方式:簡單鍵值對和函數依賴式。
1.簡單鍵值對:一個模組僅含有值對,沒有任何依賴
define({ color: "black", size: 1, method1: function() {}, method2: function() {}});
這種寫法雖然簡單,但是有很大的局限性,僅僅是定義了該模組的返回值,不能做一些額外的初始化工作。
通過下面下面這種方式來定義模組,靈活性更高,我們可以在函數體內寫一些模組初始化的代碼。
define(function () { //Do initial work here return { method1: function() {}, method2: function() {} };});
2.函數依賴式:
則第一個參數是依賴的名稱數組;第二個參數是回呼函數。
在模組的所有依賴載入完畢後,回呼函數會被調用來定義該模組。
define(["module1"], function(moudle1) { function calc(){return moudle1.val;}return {"get":calc}; });
這2種定義模組的方式是等價的,requirejs能夠保證一個模組只會被載入一次,所以如果A、B模組都依賴於C模組,那麼其實A和B模組使用的都是同一個對象。
//C模組define([],function(){ var count = 0;function sayCount(){count++;return count;}return {"say":sayCount};}); // A模組require(['C'], function(module) { cosole.log(module.say());//1}); // B模組require(['C'], function(module) {cosole.log(module.say());//2});
如果我們定義了一個模組,很多時候我們希望它能夠被多個模組使用而不會相互幹擾。
//C模組define([],function(){ // 定義一個類 function DemoClass() {var count = 0;this.say = function(){count++;return count;}; } return function(){//每次都返回一個新對象return new DemoClass(); };}); // A模組require(['C'], function(module) { cosole.log(module().say());//1}); // B模組require(['C'], function(module) {cosole.log(module().say());//1});
每次調用模組C,返回都是一個新的對象,通過這種方式能夠避免A和B模組在使用模組C時候的幹擾和衝突。