使用 RequireJS 延迟加载 AngularJS 模块



感谢Dan Wahlin的精彩文章,我设法实现了Angular控制器和服务的延迟加载。 但是,似乎没有一种干净的方法来延迟加载独立模块。

为了更好地解释我的问题,假设我有一个没有 RequireJS 的应用程序

结构如下:
// Create independent module 'dataServices' module with 'Pictures' object
angular.module("dataServices", []).factory("Pictures", function (...) {...});
// Create 'webapp' ng-app, with dependency to 'dataServices', defining controllers
angular.module("webapp", ['dataServices'])
.controller("View1Controller", function (...) {...})
.controller("View2Controller", function (...) {...});

以下是 Plunker 中使用 RequireJS 的示例应用:
http://plnkr.co/aiarzVpMJchYPjFRrkwn

问题的核心是 Angular 不允许在实例化后向ng-app添加依赖项。 因此,我的解决方案是使用 angular.injector 检索要在View2Controller中使用的Picture对象的实例。请参阅js/scripts/controllers/ctrl2.js文件。

这给我带来了两个问题:

  1. 注入的服务在 angular 之外运行,因此所有异步调用都必须以 $scope.$apply(( 结尾
  2. 混乱的代码,其中某些对象可以使用标准角度语法注入,而其他对象则需要显式使用注入器。

你们中有没有人想过如何使用 RequireJS 延迟加载独立模块,并以某种方式以角度钩住这个模块,以便可以使用正常的角度依赖注入语法?


问题是关于独立模块的延迟加载。 此特定示例的一个简单解决方案是在ng-app.config期间使用缓存$providers创建"Pictures"对象,但这不是我想要的。 我正在寻找适用于第三方模块的解决方案,例如 angular-resource .

我完成了自己的实现,称为angularAMD,下面是使用它的示例站点:

http://marcoslin.github.io/angularAMD/

它处理配置函数和乱序模块定义。

希望这可以帮助其他人寻找一些东西来帮助他们进行RequireJS和AngularJS集成。

看看我在GitHub上的项目:angular-require-lazy

该项目旨在展示一个想法并激发讨论。但是是你想要的(检查费用视图.js,它懒惰地加载ng网格(。

我对评论,想法等非常感兴趣。


(编辑(ng-grid Angular模块延迟加载,如下所示:

  1. 激活/expenses路由时延迟加载expenses-view.js
  2. expenses-view.js将ng-grid指定为依赖项,因此RequireJs首先加载ng-grid
  3. ng-grid是调用angular.module(...)

为了实现这一点,我用我自己的方法替换(实际上是代理(真正的angular.module方法,它支持懒惰。请参阅引导.js和路由配置.js(函数initLazyModules()callRunBlocks()(。

此实现有其缺点,您应该注意:

  1. 配置函数尚未实现。我不知道是否可以懒惰地提供配置时依赖项。
  2. 顺序在定义中很重要。如果服务 A 依赖于 B,但在模块中在 B 之后定义了 A,则 DI 将失败。这是因为 lazyAngular 代理会立即执行定义,这与真正的 Angular 不同,后者确保在执行定义之前解决依赖关系。

看起来 Node.js 模块ocLazyLoad定义了一种执行这种延迟加载的方法,尽管我不确定与其他答案中的方法或硬编码依赖项相比,它在性能方面的表现如何。有关这方面的任何信息将不胜感激。有趣的是,其他答案需要RequireJS才能操作,而ocLazyLoad则不需要。

看起来ocLazyLoad定义了另一个提供程序,该提供程序在包含模块已实例化后注入依赖项。它似乎通过本质上复制一些低级 Angular 行为来做到这一点,比如模块加载和提供,这就是为什么它看起来如此复杂。看起来它几乎添加了每个核心 Angular 模块作为依赖项:$compileProvider$q$injectorng等等。

最新更新