如何加载角度模块,这些模块在页面之间是常见的和动态的?

时间:2015-06-19 22:35:27

标签: angularjs

我有一个由多个开发人员开发的网站,该网站有多个页面。每个“页面”通过调用angular.module(等)来初始化角度。

我的问题是,所有页面共享一些模块,有些页面使用特定模块。实现这一目标的最佳做法是什么?我是否相信开发人员会插入整个网站所需的正确模块(即Google Analytics),或者我是否创建了一个共享我所有加载所有模块的页面的调用。还有办法做到这两点吗?例如,初始化所有页面所需的模块,然后在各自的页面上动态加载特定模块。

4 个答案:

答案 0 :(得分:7)

我会创建一个由每个应用程序加载的全局模块,就像加载'ngAnimate'之类的模块一样......全局模块可以初始化所有页面共有的功能,例如Google分析。

这需要对所有涉及的开发人员进行一些监管,但这是一个很好的做法,通过代码审查等。

示例页面:

angular.module('individualPage', [
    'globalModule',
    'customPageModule'
]).config(
    // etc
);

全球模块:

angular.module('globalModule', [
    'googleAnalytics'
]).config(
    // etc
);

答案 1 :(得分:4)

我有一个由多个开发人员开发的网站,该网站有多个页面。每个“页面”通过调用angular.module(等)来初始化角度。

我的问题是:

  1. 所有页面共享一些模块,有些页面使用特定模块。实现这一目标的最佳做法是什么?
  2.   

    我不知道处理多个页面时的最佳做法。   恕我直言,创建多个页面现在是一个不好的做法。我想   具有不同视图和状态而非Web的Web应用程序(SPA)   网页脱节的网站。所以,如果你选择去   SPA(单页面应用)方式,你可以加载你所有的核心/常见   应用程序引导之前的模块。需要的视图/页面   特定模块可以使用类似的东西来延迟加载它们   oclazyload

    1. 我相信开发人员会插入整个网站所需的正确模块(即Google Analytics),或者我是否创建了一个共享我所有加载所有模块的页面的调用。
    2.   

      我不能说很多关于信任的问题,因为我不了解你   开发人员很好。一般来说,开发人员永远不会   值得信赖,他们会做任何看似有效的事情,高五   他们自己并称之为一天。您的想法是“信任但验证”   不必电话轻拍他们的电话或阅读他们的电子邮件,但从来没有   永远把你的目光从主要的git或svn存储库中移开。无处不在,如果   你按照我上面建议的SPA来使用oclazyload,你会的   只需要担心动态加载'view / page'具体   开发人员可以自行配置的模块。

      1. 还有办法做到这两点吗?例如,初始化所有页面所需的模块,然后在各自的页面上动态加载特定模块。
      2.   

        是的,是的,我已经概述了...... SPA方法   以上。我还建议使用angular-ui-router   国家和观点的方法。我们的想法是设计您的应用程序   同时将其视为桌面或移动胖客户端   状态转换等等。

答案 2 :(得分:2)

  

我有一个由多个开发人员开发的网站,该网站有多个页面。

     

每个"页面"通过调用angular.module(等)来初始化角度。

     

我的问题是,所有页面共享一些模块,有些页面使用特定模块。

     

实现这一目标的最佳做法是什么?

     

我相信开发人员会插入整个网站所需的正确模块(即Google Analytics)   或者我是否创建了一个共享我所有加载所有模块的页面的调用。

     

还有办法做到这两点吗?   例如,初始化所有页面所需的模块,然后在各自的页面上动态加载特定模块。

我首先要定义页面是什么。

您是在谈论 SPA 还是更传统的设置,客户端在具有常规<a href="/page">的网页之间进行转换, 服务器为客户端提供一块HTML?

如果后者属实,那么我建议您重新考虑您对Angular应用程序的基本方法。

最佳(或更确切地说,首选)的做事方式是为客户端提供单个HTML,然后 页面之间的转换(从现在开始,我将它们称为状态),使用ngRouteangular router (2)或 更好 - ui-router

对于我的回答,我将假设您实际上正在使用SPA。

  

实现这一目标的最佳做法是什么?

按照目前的情况,我会坚持认为没有针对您提出的案例定义的最佳做法。 有很多方法可以做到,就我而言,核心开发团队/社区标准都没有正式推荐。

您可以使用webpack-angularjs-lazyloadrequirejs (angular-requirejs-seed)requirejs (angularAMD)SystemJS等。 选择你喜欢的毒药!

  

我相信开发人员会插入整个网站所需的正确模块(即Google Analytics)   或者我是否创建了一个共享我所有加载所有模块的页面的调用。

如果网站上需要angular.module中包含的代码,我会将其附加到应用程序模块。

如:

/** Define core functionality that _is_ essential to the application running as expected **/
angular.module('core-module', [ 'route-definitions', 'http-interceptors', 'google-analytics' ]);

/** Inject the core functionality into a bundle module **/
angular.module('main-bundle-module', [ 'core-module' ]);

/** Bootstrap the bundle module as your application **/
angular.bootstrap(/* DOM element */, ['main-bundle-module']);

现在,每当有人为特定状态创建 new 模块时,他们都需要将所述模块注入main-bundle-module(禁止延迟加载的模块)。 因此,在您的Google Analytics案例中,核心功能将始终提供并可用。从某种意义上说,你只是撕毁了 信任障碍。

退一步,让我们暂时假设你使用SPA - 你实际上正在重新初始化 每页转换的角度应用(坏移动)。您如何确保始终存在所需的功能?

装饰angular.module方法。

注意:这不是官方支持的,要警惕你在做什么。在我看来,它也违背了模块化的目的,但我还是会 展示这样做的方式。

我估计你可以选择两种方式:

  • 如果所需模块不是开发人员模块定义的一部分,则终止执行JS。
    • &#34;坏警察。&#34;
    • 这会抓住“不受信任的开发者”。在开发期间,他/她的轨道,以确保他们遵循项目标准。
  • 协助“不受信任的开发者”&#39;通过自动执行需要模块的任务。
    • &#34;好警察。&#34; (好吧,有点......)
    • 这将确保始终存在所需的模块,尽管在每个模块中。

&#34; Good Cop&#34;

(function(angular) {

  // The always required module(s).
  var ALWAYS_REQUIRED = ['cs.core'];
  // Keep a reference to the original angular.module function.
  var originalFn      = angular.module;
  // Keep track of registered modules.
  var registered      = {};

  angular.module = function (name, dependencies, configFunction) {
    var loaded;

    // Ensure that we are always working with an array of dependencies.
    dependencies = dependencies || [];

    // If the module has not already been registered
    if (!registered[name]) {

      // Ensure that the required modules are available.
      ALWAYS_REQUIRED.forEach(function (required) {
        if (dependencies.indexOf(required) === -1) {
          dependencies.push(required);
        }
      });

      // Register the module and store it in the registered object for future reference.
      loaded = registered[name] = original(name, dependencies, configFunction);
    } else {
      // Do not re-register the module, simply load it as per 'angular.module('name_of_module')';
      loaded = original(name);
    }

    // Return the loaded module.
    return loaded;
  };

})(angular);

&#34; Bad Cop&#34;

(function(angular) {

  var ALWAYS_REQUIRED = ['cs.core'];
  var originalFn      = angular.module;

  angular.module = function (name, dependencies, configFunction) {

    ALWAYS_REQUIRED.forEach(function (required) {
      if (dependencies.indexOf(required) === -1) {
        throw new Error('You need to add ' + required + ' to ' + name + '\'s module dependencies!');
      }
    });

    return originalFn(name, dependencies, configFunction);
  };

})(angular);

这是杀死信任问题的两种方法,但在此过程中我们引入了代码;

  • 不是很漂亮。
  • 绝对没有经过良好测试/战斗证明。
  • 杀死模块化以启动。
  

还有办法做到这两点吗?   例如,初始化所有页面所需的模块,然后在各自的页面上动态加载特定模块。

我想说最好的方法是:

  1. 采取必要的步骤转换为SPA。
  2. 为所有开发人员编写一些文档,以便让他们快速了解项目的要求。
  3. 创建包含所需core功能的独立模块,并将其附加到ng-app / angular.bootstrap模块。
  4. 获取ui-routerui-router-extrasocLazyLoad以允许延迟加载的模块/状态/组件定义。
  5. 请查看以下一些链接,了解适合您具体项目的灵感/想法:
  6. TL;博士

    • 转换为SPA。
    • 使用提供的核心功能引导应用程序。
    • 为不受信任的开发人员撰写一些文档。
      • 更好的是,建立信任。 :)
    • 需要时延迟加载特定于模块的模块。

答案 3 :(得分:-4)

您可以尝试browserify在单个文件中加载和构建您的javascript。 有了这个,您可以轻松缩小javascript代码,还可以加载nodejs模块,如事件等,但这不是您的问题。