为什么在使用Require.js时我需要为AngularJS添加“垫片”?

时间:2014-05-29 15:00:15

标签: requirejs

我见过几个使用它的例子:

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等。我是否需要做类似的事情并为这些添加垫片?

1 个答案:

答案 0 :(得分:8)

规则很简单:如果库/脚本/包/插件是支持AMD的,那么你就不需要垫片了。 (实际上,你一定不能使用垫片。)如果它不支持AMD,那么你需要一个垫片。

如果一个库/ etc检测到AMD加载器存在并且调用define使其自己为加载器所知,则它是AMD感知的。

从大约1.8开始的jQuery不需要垫片,因为它调用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根据文件名进行推断。)