【问题标题】:Use AngularJS as AMD / async loader?使用 AngularJS 作为 AMD / 异步加载器?
【发布时间】:2014-10-19 09:45:33
【问题描述】:

我正在为大型应用程序使用 RequireJS 来管理 3rd 方依赖项。它动态处理依赖关系,并在依赖管理和模块化方面有很大帮助。

Angular 可以做这样的事情,或者将它与 RequireJS 集成是否有意义?我想根据需要延迟加载第 3 方或自定义依赖项(编译像 RequireJS 优化器这样的选项也很好)。任何建议或经验将不胜感激!

【问题讨论】:

  • 您是在加载 Angular 组件还是其他任何东西,还是两者都加载?
  • 两者:Angular 组件、jQuery 插件、自定义 JS 实用程序、Underscore 等
  • 这确实很长,见this一些指点,还有很多。
  • @NikosParaskevopoulos 天才。我就这样吧。
  • 这个链接可能会有所帮助:bennadel.com/blog/… 我有几个关于一般延迟加载的答案。他们可能会给你一些关于延迟加载指令等的观点。在此处查看前几个结果:stackoverflow.com/search?q=user%3A1435655+lazy

标签: javascript angularjs requirejs dependency-management amd


【解决方案1】:

我使用 RequireJS,它非常简单:

require: require.config({
paths: {
  jquery: '/assets/js/jquery',
  "jquery.bootstrap": '/assets/js/bootstrap.min',
  angular: '/js/libs/angular/angular',
  sanitize: '/js/libs/angular/angular-sanitize',
  text: '/js/libs/require/text',
  async: '/js/libs/async/async',
  moment: '/assets/js/moment.min'
},
baseUrl: '/js',
shim: {
  'angular': {'exports' : 'angular'},
  'sanitize': {'exports' : 'sanitize', deps: ['angular']},
  'jquery.bootstrap': {deps: ['jquery']},
},
priority: [
  "angular"
]
});

require(['jquery', 'angular', 'app'], function($, angular, app){
  $(document).ready(function () {
    var $html = $('html');
    angular.bootstrap($html, [app['name']]);
    $html.addClass('ng-app');
  });
});

然后在一个名为 app 的文件中(取决于第一个 require 语句)我有

define(['angular','sanitize'], function (angular, sanitize) {
    'use strict';
    return angular.module('myApp', ['ngSanitize']);
});

【讨论】:

    【解决方案2】:

    将 RequireJS 与 AngularJS 一起使用是有意义的,但前提是您了解它们各自在 依赖注入 方面的工作原理,因为虽然它们都注入依赖项,但它们注入的东西却截然不同。

    AngularJS 有自己的依赖系统,可以让您将 AngularJS 模块注入到新创建的模块中,以便重用实现。假设您创建了一个实现 AngularJS 过滤器“greet”的“第一个”模块:

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

    现在假设您想在另一个名为“second”的模块中使用“greet”过滤器,该模块实现了“goodbye”过滤器。您可以将“第一个”模块注入“第二个”模块:

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

    问题是,为了在没有 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 + '!';
          }
        });
    });
    
    // secondModule.js file
    define(['angular', 'firstModule'], function(angular) {
      angular
        .module('second', ['first'])
        .filter('goodbye', function() {
          return function(name) {
            return 'Good bye, ' + name + '!';
          }
        });
    });
    

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

    旁注:需要在“firstModule”和“secondModule”文件中注入“angular”作为依赖项,以便在 RequireJS 回调函数中使用 AngularJS,并且必须在 RequireJS 配置中配置它以将“angular”映射到库代码。您可能也以传统方式(脚本标记)将 AngularJS 加载到页面,尽管会破坏 RequireJS 的好处。

    我的博客文章中有关从 AngularJS 核心从 2.0 版本获得 RequireJS 支持的更多详细信息。

    根据我的博文“用 AngularJS 理解 RequireJS”,这里是 link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-21
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      相关资源
      最近更新 更多