AngularJS是否像RequireJS一样支持AMD?

Dan*_*nze 19 javascript requirejs angularjs

这个回购中, AngularJS对AMD的RequireJS表示赞赏.

这个回购中,AngularJS团队为AMD开发了一个不包含RequireJS 的AngularJS项目.

  • 我是否以错误的方式思考这个问题 - IE是否解决了不同的问题?
  • AngularJS图书馆现在支持AMD吗?
  • 是否不再需要将RequireJS与AngularJS项目一起使用?

leo*_*eog 27

将RequireJS与AngularJS一起使用是有意义的,但前提是你理解它们如何在依赖注入方面工作,因为虽然它们都注入依赖关系,但它们注入了非常不同的东西.

AngularJS有自己的依赖系统,允许您将AngularJS模块注入新创建的模块,以便重用实现.假设你创建了一个实现AngularJS过滤器"greet"的"第一个"模块:

angular
  .module('first', [])
  .filter('greet', function() {
    return function(name) {
      return 'Hello, ' + name + '!';
    }
  });
Run Code Online (Sandbox Code Playgroud)

现在让我们假设您想在另一个名为"second"的模块中使用"greet"过滤器来实现"再见"过滤器.您可以将"第一"模块注入"第二"模块:

angular
  .module('second', ['first'])
  .filter('goodbye', function() {
    return function(name) {
      return 'Good bye, ' + name + '!';
    }
  });
Run Code Online (Sandbox Code Playgroud)

问题是,为了在没有RequireJS的情况下使其正常工作,您必须确保在创建"第二个"AngularJS模块之前在页面上加载"第一个"AngularJS模块.引用文件:

根据模块的不同,需要在加载需求模块之前加载所需的模块.

从这个意义上讲,这里是RequireJS可以帮助您的地方,因为RequireJS提供了一种向页面注入脚本的简洁方法,可帮助您组织彼此之间的脚本依赖关系.

回到"第一个"和"第二个"AngularJS模块,下面是如何使用RequireJS将不同文件上的模块分开以利用脚本依赖性加载:

// firstModule.js file
define(['angular'], function(angular) {
  angular
    .module('first', [])
    .filter('greet', function() {
      return function(name) {
        return 'Hello, ' + name + '!';
      }
    });
});
Run Code Online (Sandbox Code Playgroud)
// secondModule.js file
define(['angular', 'firstModule'], function(angular) {
  angular
    .module('second', ['first'])
    .filter('goodbye', function() {
      return function(name) {
        return 'Good bye, ' + name + '!';
      }
    });
});
Run Code Online (Sandbox Code Playgroud)

你可以看到我们依赖于"firstModule"文件在可以执行RequireJS回调的内容之前注入,需要加载"第一个"AngularJS模块来创建"第二个"AngularJS模块.

附注:为了在RequireJS回调函数中使用AngularJS,需要在"firstModule"和"secondModule"文件上注入"angular"作为依赖项,并且必须在RequireJS config上配置它以将"angular"映射到库代码.你也可以用传统的方式将AngularJS加载到页面(脚本标记),尽管会损害RequireJS的好处.

有关在我的博客文章中从2.0版本获得AngularJS核心的RequireJS支持的更多细节.

基于我的博客文章"用AngularJS理解RequireJS",这里是链接.


Nic*_*ner 20

是的,你可以使用带棱角的RequireJS.您需要做一些额外的工作才能使其正常运行,如您所包含的链接,但它是可能的.

但总的来说,我还没有发现AMD对Angular有任何需求.AMD的整个想法是,它允许您以声明方式指定脚本之间的依赖关系,而不必担心将它们包含在页面中的顺序.但是,Angular通过其依赖注入机制为您解决了这个问题,因此在这方面使用AMD并没有真正获得任何好处.

tl; dr我没有找到使用AMD与Angular.js的令人信服的理由.

  • 请参考我的回答,因为在特定情况下使用RequireJS是完全有意义的. (3认同)
  • 您是否可以想到"任何"好处或者您会遇到的情况会让您想要将Angquir.js与Reular.js一起使用?以下是有助于此讨论的相关链接:http://stackoverflow.com/questions/12529083/does-it-make-sense-to-use-require-js-with-angular-js (2认同)
  • 有没有办法异步加载angularjs模块? (2认同)
  • AngularJS不像requireJS那样以异步方式加载模块.请查看文档http://docs.angularjs.org/tutorial/step_07.因此,对于延迟加载,您需要requireJS. (2认同)
  • RequireJS和Angular注入了不同的东西.需要可用于管理所有第三方脚本(想想jQuery,下划线,引导程序和角度本身),然后将这些脚本依赖项注入到角度应用程序中. (2认同)