2014-01-25 31 views
1

我需要編寫一個可用作AMD模塊和非AMD(同步加載)JavaScript文件的JavaScript插件。我可以編寫一個JavaScript文件,可選地使用require.js指定依賴關係嗎?

它依賴於「Jockey.js」和jquery庫。

換句話說,我想構造文件,以便它在傳統非異步html結構中使用時不會失敗(通過腳本標記加載,在通過腳本標記加載其依賴關係後) ,但這樣它也可以作爲AMD模塊工作而不需要填充,並指定它的依賴關係。這可以做到,或者是墊片做到這一點的唯一方法?

回答

3

它可以做到。我有一個這樣的插件right here。這裏的一般結構:

(function (factory) { 
    // If in an AMD environment, define() our module, else use the 
    // jQuery global. 
    'use strict'; 
    if (typeof define === 'function' && define.amd) 
     define(['jquery'], factory); 
    else 
     factory(jQuery); 
}(function ($) { 
    'use strict'; 

    // This is the plugin proper. 
    $.fn.myMethod = function(/* ... */) { 
     // Code for the method... 
    }; 
})); 

需要其他的東西不僅僅是jQuery的會使用上面進行了以下修改的結構的插件:

  1. define調用,列出所需要的附加模塊。

  2. A factory(jQuery)jQuery之後調用(在非AMD分支中,當RequireJS未加載插件時使用)從全局空間傳遞附加值。

  3. 工廠函數function ($)有額外的參數來接收傳遞給它的附加值。

因此,如果需要的插件模塊foo其中出口本身在全球空間foo,並用RequireJS配置名稱它"foo",則:

(function (factory) { 
    // If in an AMD environment, define() our module, else use the 
    // jQuery global. 
    'use strict'; 
    if (typeof define === 'function' && define.amd) 
     define(['jquery', 'foo'], factory); 
    else 
     factory(jQuery, foo); 
}(function ($, foo) { 
    'use strict'; 

    // This is the plugin proper. 
    $.fn.myMethod = function(/* ... */) { 
     // Code for the method... 
     foo.blah(); 
    }; 
})); 
+0

你能向我解釋了什麼'factory '變量是在這種情況下? – fraxture

+0

'factory'是第一個匿名函數中唯一的參數。在最頂層的第一個代碼片段中,你有一個匿名函數('function(factory){...}'),它是用另一個匿名函數('function($){...}')調用的參數。所以,當第一個匿名函數執行時,'factory'參數的值是'function($){...}'。 – Louis

相關問題