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