如何判断javascript库是否支持AMD

时间:2013-11-24 22:56:55

标签: javascript amd

所以我开始学习如何使用requirejs并将其与其他一些可用的javascript库结合起来。据我所知,你需要填充所有不是Asynchronous module definition compatible (AMD)的库,但除了在库代码中搜索“require”之外,还有一种更简单的方法可以找出哪些库支持AMD而哪些库不支持?作为一个例子,我知道jquery支持AMD,但jqueryui没有,我只知道这是因为“有人告诉我”。

2 个答案:

答案 0 :(得分: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甚至没有全局。

答案 1 :(得分:2)

您将在消息来源中寻找AMD format define()个来电,它们通常有三种类型:

  • 未定义AMD模块,您必须在RequireJS中配置填充程序;
  • 可选的AMD支持,通常会对底部全局变量中的define()依赖关系进行一些嗅探;
  • 一流的AMD模块,其中所有内容都包含在define()的调用中。

值得注意的是,如果您试图错误地填充AMD模块,或者将脚本加载为永远不会调用define()创建一个模块的AMD模块,那么您将收到错误。