对角度模块使用单个全局变量是否是一种反模式

Is using a single global variable for angular modules an anti-pattern?

本文关键字:一种 模式 是否是 全局变量 模块 单个      更新时间:2023-09-26

我找到了一些模板,在查看它时,发现var anApp在app.js中声明一次,随后由所有模块共享。我的问题是:1.使用单个变量会导致所有角度分量存储在全局范围内吗?2. 这是反模式,还是OK设计模式?如果对其中任何一个都持肯定态度,谁能提出最佳实践方法?

谢谢

---app.js----
 var anApp = angular.module("myApp", [
    "ui.router", 
    "ui.bootstrap", 
    "oc.lazyLoad",  
    "ngSanitize"
]); 
anApp.config(['$ocLazyLoadProvider', function($ocLazyLoadProvider) {...}]);
---controllers.js---
anApp.controller('fooCtrl', ['$scope', function($scope) {...}]);
---directives.js---
anApp.directive('ngSpinnerBar', ['$rootScope',function($rootScope) {...}]);

等。

对于非常小的应用程序,您只能使用一个模块。在这种情况下,您可以遵循许多示例并使用一个全局变量,这样就不必按名称查找模块。只有一个额外的全局变量不会受到太大伤害,特别是如果它有一个可以被每个阅读你的代码的人识别为"app"模块的名称。

但我想说的是,对于中型应用程序(甚至更大)只有一个模块是一种反模式。为每个工件(例如控制器)创建一个模块不仅是一种反模式,而且是胡说八道。为每种类型的工件('myControllers'、'myDirectives'等)创建一个模块没有多大意义,但总比没有好。

您应该以"自然"的方式识别和创建模块。

  • 哪些工件属于一起?
  • 工件和模块之间存在哪些依赖关系?
  • 依赖关系图看起来像大意大利面还是更像一棵树?
  • 是否有小单元也可以存在于另一个 Web 应用程序中?
  • 您是否有可以作为开源模块共享的工件?
  • 您可以将应用程序拆分为垂直部分(例如登录,用户管理员,统计信息等)和/或水平部分(访问层/缓存,逻辑/通信,UI)吗?

我认为在中型应用程序中,您通常会提供 10-30 个模块。一小部分(~10)可以在其他项目中重用,其余的都是特定于领域的模块。您的模块数量可能完全不同,但仍然超级有效。这取决于应用的大小以及要在模块中具有的粒度。在我看来,拥有 <30 个模块可能仍然很容易查看它们而不会迷失在 forrest 中。

对于您的其他问题:从 Angular 1.3 开始,加载应用程序后您有多少模块没有任何区别。你只有一个注入器,所有工件都将按其唯一名称注入(除了指令,你可以有多个具有相同名称的)。Angular 不会在全局范围内创建新变量,所有工件都在"注册表"(又名注入器)中查找。