对角度模块使用单个全局变量是否是一种反模式
Is using a single global variable for angular modules an anti-pattern?
我找到了一些模板,在查看它时,发现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 不会在全局范围内创建新变量,所有工件都在"注册表"(又名注入器)中查找。
- ES6 const,用于在JavaScript中创建对象原型;这是一种模式吗
- 有没有一种方法可以在设计模式下将ng模型或工厂绑定到iframe
- 在Knockout视图模型中调用jQuery插件是一种有效的模式
- 这种减少if语句中声明的变量范围的模式是一种好的做法吗
- 这是一种常见的模式吗?(返回数据而不是返回承诺)
- 对角度模块使用单个全局变量是否是一种反模式
- 有没有一种 AngularJS 方法来使用带有承诺返回的浏览器模式
- 为什么 AngularJS 中的双向数据绑定是一种反模式
- 一种模式,用于使 userId 可用于 JavaScript,而不会破坏缓存
- 将承诺包装在承诺中是一种反模式
- 在Redux中使用getState是一种反模式
- 有没有一种方法可以覆盖Vorpal模式退出命令
- 正则表达式,以包括所有特定模式并仅排除一种情况
- 有没有一种方法可以在引导模式中使用引导弹出窗口
- 从RactiveJS组件中触发事件是一种常见的模式
- 是否有一种方法可以强制Chrome在OSX上以演示模式打开
- 需要找出一种模式,使相同的代码同时适用于api和正常呈现
- 在应用程序中只使用一种设计模式
- 是否有一种方法来使用模式/纹理使用addSVG的jsPDF
- 谁能建议一种设计模式来分离JavaScript中的业务逻辑和表示逻辑?