我对将 requireJS(和 r.js 优化器)实现到非常大的 AngularJS SPA 的正确方法感到困惑。我想要一些关于如何组织项目的建议,以便我从 AMD 模块化中受益,但不要过于复杂(将 angular 模块包装在需要 js define
d 模块中,这些模块都被转储到优化的 .js 文件中......)。
我正在处理几种不同类别的文件:
- 我有一堆供应商库(jquery、angular、angular-resource、require、lodash 等)
- 我有一些容器级 AMD 模块(身份验证、分析等)
- 我有很多角度模块、服务、过滤器等
使用 r.js 将所有供应商的东西合并和缩小在一起似乎很容易,但是当我开始添加所有其他代码时,我觉得我的项目变得混乱了。例如,我有一个 Auth 服务、几个控制器和我的供应商依赖项(jquery ...)。所以我main.js
的需要看起来是这样的:
require.config({
paths: {
// load vendor libraries
'domReady': '../vendor/requirejs-domready/domReady',
'angular': '../vendor/angular/angular',
'jquery': '../vendor/jquery/jquery.min',
requireLib: '../vendor/requirejs/require'
... lots of these
//load app code
'app': '../app/app',
'AuthCtrl': '../app/modules/auth/AuthCtrl',
'UserCtrl': '../app/modules/auth/UserCtrl',
'SettingsCtrl': '../app/modules/auth/SettingsCtrl',
// potentially dozens and dozens of these...
//load auth library
'auth': '../app/modules/common/auth',
'analytics' '../analytics'
},
include: ['domReady', 'requireLib'],
shim: {
'angular': {
exports: 'angular'
}
}
...
});
目前,我已经将上面所有 3 个“类别”中的所有代码转储到 1 个大的 uglified js 文件中。
我不满意的是我觉得我的控制器开始需要一个模块依赖项的清单:
require('app',[
'angular',
'jquery',
'AuthCtrl',
'UserCtrl',
'SettingsCtrl',
' ... potentially dozens? '
...
], function (angular, $, Auth, user, settings, ...potentially dozens?) {
'use strict';
return angular.module('ngAD', ['AuthCtrl', 'UserCtrl', 'SettingsCtrl' ...]);
});
所以我的问题是我猜的两个问题:
- 将我所有的 Angular 模块、控制器、过滤器等保留在它们自己的 AMD 模块中并通过 requirejs 手动包含有什么好处?它们都在内存中(已经通过 r.js 加载到大堆文件中)。当会有大量的这些离散的角度模块时,是否有更聪明的方法来处理它们?我应该将它们全部连接到它们自己的模块中,该模块可以是一个可注入的依赖项吗?
- 我在“AMD 模块”和“角度模块”之间搞混了。我所有的角度组件(控制器、指令等)都需要在它们自己的 AMD 模块中吗?我觉得我在一个模块(需要的 AMD 格式)中包装了一个模块(角度)。