我见过几个使用它的例子:
main.js
/*global require*/
'use strict';
require.config({
paths: {
angular: './angular',
app: './Content/app',
ngAnimate: './Scripts/angular-animate',
uiRouter: './Scripts/angular-ui-router'
},
shim: {
angular: {
exports: 'angular'
}
}
});
require(['angular', 'app'], function (angular) {
angular.bootstrap(document, ['app']);
});
有人可以向我解释为什么需要垫片吗?我的应用程序使用其他模块,如angular-ui路由器,jQuery等。我是否需要做类似的事情并为这些添加垫片?
答案 0 :(得分:8)
规则很简单:如果库/脚本/包/插件是支持AMD的,那么你就不需要垫片了。 (实际上,你一定不能使用垫片。)如果它不支持AMD,那么你需要一个垫片。
如果一个库/ etc检测到AMD加载器存在并且调用define
使其自己为加载器所知,则它是AMD感知的。
define
。另一方面,Angular不会调用define
。
要知道某段特定代码是否需要填充程序,您可以阅读其文档,或者如果文档不清楚,那么您可以检查源代码以查询define
。例如jQuery 1.11.0有这段代码:
// Register as a named AMD module, since jQuery can be concatenated with other
// files that may use define, but not via a proper concatenation script that
// understands anonymous AMD modules. A named AMD is safest and most robust
// way to register. Lowercase jquery is used because AMD module names are
// derived from file names, and jQuery is normally delivered in a lowercase
// file name. Do this after creating the global so that if an AMD module wants
// to call noConflict to hide this version of jQuery, it will work.
if ( typeof define === "function" && define.amd ) {
define( "jquery", [], function() {
return jQuery;
});
}
它的外观会因情况而异,但您想要查找的基本思路是检查define
是否存在,是一个函数,是否设置了amd
属性并且致电define
。
(请注意,jQuery是一种特殊情况,他们决定在define
调用中对模块的名称进行硬编码(第一个参数:jquery
)。通常,模块的名称赢了&#39 ; t存在于define
调用中,但将由RequireJS根据文件名进行推断。)