2013-11-24 49 views
7

因此,我已經開始學習如何使用requirejs並將其與其他一些可用的JavaScript庫結合使用。據我瞭解,你需要清除所有不是Asynchronous module definition compatible (AMD)的庫,但除了通過庫代碼搜索「require」之外,是否有更簡單的方法來確定哪些庫支持AMD,哪些不支持AMD?舉個例子,我知道jquery支持AMD,但jqueryui不支持,我只知道這是因爲「有人告訴我」。如何判斷一個JavaScript庫是否支持AMD

+0

當你談論AMD時,你可能會提到人們,你不是在談論CPU /視頻半導體公司,但我猜你正在談論[異步模塊定義](http:// gregfranko。 COM /博客/註冊最jQueryUI的-插件-工廠作爲-AN-AMD-模塊/)。 – jfriend00

+1

@ jfriend00,[Asynchronous_module_definition](http://en.wikipedia.org/wiki/Asynchronous_module_definition),你知道'OP'是什麼意思,不是嗎? –

+2

我不知道他們的意思。我以爲他們在問AMD顯卡的兼容性。只有當我在Google上搜索時,我才能找到他們的意思。我會自己編輯這個問題,以確保其他讀者清楚。 – jfriend00

回答

3

這是jQuery如何聲明其AMD。這只是一堆if語句。除非庫有一些library.AMD === true,否則無法從庫本身檢查。

if (typeof module === "object" && module && typeof module.exports === "object") { 
    module.exports = jQuery; 
} else { 
    window.jQuery = window.$ = jQuery; 
    if (typeof define === "function" && define.amd) { 
    define("jquery", [], function() { return jQuery; }); 
    } 
} 

但是,有一種方法可以檢查已經加載的模塊。 This answer指出您可以檢查require.s.contexts._.defined,它是一個包含已加載模塊的名稱定義映射的對象。例如,如果我將jQuery(默認情況下爲AMD)加載到同樣具有RequireJS的頁面中,那麼jquery屬性將存在於該對象中,並且包含與全局相同的jQuery對象。然後你可以比較。下面將返回true

require.s.contexts._.defined.jquery === jQuery 
require.s.contexts._.defined.jquery === $ 

然而,這種假設你知道模塊的名稱和/或有一個全球性來比較。這可能不適用於所有情況。例如,jQuery UI不只是一大塊代碼。這是一個插在jquery-ui.js下的插件。有可能他們可以被集體命名,或者每個部件都有一個模塊。 jQuery UI甚至沒有全局的。

2

你會尋找來源AMD formatdefine()電話,他們通常有三種類型:

  • 沒有AMD模塊定義,在這裏你必須配置RequireJS墊片;
  • 可選的AMD支持,其中底部全局變量中的define()依賴關係通常會發生一些嗅探;
  • 一流的AMD模塊,其中所有內容都包含在對define()的調用中。

這是很好的注意,如果你試圖通過錯誤的墊片的AMD模塊,或者加載腳本作爲AMD模塊,永遠不會調用define()創建一個,你會得到一個錯誤。

+1

謝謝你澄清,菲利普。只是爲了好奇,我做了一個快速測試,看看如果我擦亮AMD兼容的庫,或者反之亦然,但是我可以看到我沒有在控制檯日誌中找到任何東西。你有一個簡短的例子來說明這一點嗎? –

相關問題