如何判断javascript库是否支持AMD

如何判断javascript库是否支持AMD,javascript,amd,Javascript,Amd,因此,我开始学习如何使用requirejs,并将其与其他可用的javascript库相结合。据我所知,您需要填充所有不支持AMD的库,但除了在库代码中搜索“require”之外,还有没有更简单的方法来确定哪些库支持AMD,哪些库不支持AMD?例如,我知道jquery支持AMD,但jqueryui不支持,我之所以知道这一点,是因为“有人告诉我的”。这就是jquery声明AMD的方式。这只是一堆if语句。除非库中有一些library.AMD===true,否则无法从库本身进行检查 if ( type

因此,我开始学习如何使用requirejs,并将其与其他可用的javascript库相结合。据我所知,您需要填充所有不支持AMD的库,但除了在库代码中搜索“require”之外,还有没有更简单的方法来确定哪些库支持AMD,哪些库不支持AMD?例如,我知道jquery支持AMD,但jqueryui不支持,我之所以知道这一点,是因为“有人告诉我的”。

这就是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; } );
  }
}
但是,有一种方法可以检查已加载的模块。您可以检查的状态
require.s.contexts.\uu.defined
,该对象包含已加载模块的名称定义映射

例如,如果我将jQuery(默认情况下具有AMD)加载到同样具有RequireJS的页面中,则该对象中将存在一个
jQuery
属性,并包含与全局对象相同的jQuery对象。然后你可以比较。以下内容将返回
true

require.s.contexts._.defined.jquery === jQuery
require.s.contexts._.defined.jquery === $
但是,这假设您知道模块名称和/或有一个全局名称可供比较。这可能并不适用于所有情况。例如,jQueryUI不仅仅是一大块代码。它是一堆封装在
jqueryui.js
下的插件。有一种可能性,它们可以被集体命名,也可以被每个小部件命名为一个模块。jQuery UI甚至没有全局调用。

您将在源代码中查找
define()
调用,它们通常有三种类型:

  • 没有定义AMD模块,您必须在RequireJS中配置一个垫片
  • 可选的AMD支持,通常在底部的globals中对
    define()
    依赖项进行一些嗅探
  • 第一类AMD模块,其中所有内容都封装在对
    define()
    的调用中

值得注意的是,如果您试图错误地填充AMD模块,或者将脚本作为AMD模块加载,但从未调用
define()
来创建一个AMD模块,则会出现错误。

当您谈论AMD时,您可能会提示人们,您不是在谈论CPU/视频半导体公司,但我猜你在说什么。@jfriend00,你知道
OP
的意思,是吗?我不知道他们的意思。我以为他们在问AMD视频卡的兼容性问题。只有当我在谷歌上搜索时,我才找到他们的意思。我将自己编辑这个问题,以确保其他读者清楚。YUI3有一个完整而复杂的模块加载器,因此它不需要requirejs。该库也是非常模块化的,它使用异步。从一开始就为自己的(非常多的)模块加载机制。URL:你说得对,我应该想到AMD模棱两可的含义:-)谢谢你澄清这个问题。只是出于好奇,我做了一个快速测试,如果我填充AMD兼容库,我是否会出错,或者如果我填充visa兼容库,我是否会出错,但据我所知,控制台日志中没有任何内容。你有一个简短的例子来说明这一点吗?