如何确定一个JavaScript库是否支持AMD

8

所以我开始学习如何使用requirejs并将其与其他javascript库相结合。据我了解,您需要对所有不兼容异步模块定义(AMD)的库进行shim,但除了搜索库代码中的“require”外,还有更简单的方法来确定哪些库支持AMD和哪些库不支持吗?例如,我知道jquery支持AMD,但jqueryui不支持,我只知道这是因为“有人告诉我”。


你可能需要向人们提醒一下,当你谈论 AMD 时,你不是在谈论 CPU/视频半导体公司,而是在讨论 异步模块定义,这是我的猜测。 - jfriend00
1
@jfriend00,异步模块定义,你知道 OP 意味着什么,对吧? - The Alpha
2
我不知道他们的意思。我以为他们在询问AMD显卡的兼容性。只有当我在Google上搜索时,我才知道他们的意思。我会自己编辑问题,以确保其他读者能够理解。 - jfriend00
YUI3拥有完整而复杂的模块加载器,因此不需要requirejs。该库也非常模块化,从一开始就使用异步加载机制来加载其自己(非常众多的)模块。URL:http://yuilibrary.com/ - Mörre
你说得对,我应该想到 AMD 的歧义含义 :-) - Stig Perez
2个回答

5
这是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._.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格式 define()调用,通常有以下三种情况:
  • 没有定义AMD模块,您需要在RequireJS中配置一个shim;
  • 可选的AMD支持,在底部通常会对全局变量进行define()依赖嗅探;
  • 一流的AMD模块,其中所有内容都包装在一个define()调用中。
请注意,如果您错误地尝试将AMD模块作为shim使用,或者加载从未调用define()创建的脚本作为AMD模块,您将会收到错误提示。

1
感谢您澄清这一点,Filip。出于好奇,我进行了一个快速测试,看看是否会在我将AMD兼容库或反之互换时出现错误,但据我所见,控制台日志中没有任何输出。您有一个简短的示例可以展示吗? - Stig Perez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接