2013-11-24 69 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兼容的库,或者反之亦然,但是我可以看到我没有在控制台日志中找到任何东西。你有一个简短的例子来说明这一点吗? –

相关问题