我正在尝试使用AngularJS,Browserify和Gulp构建样板。我将所有Gulp任务与Browserify一起正常工作。我现在正试图找出为Angular应用程序加载所有必要文件的最佳方法。
我正在用这三行代码创建应用程序:
var angular = require('angular');
require('angular-ui-router');
angular.module('myApp', ['ui.router']);
然后我添加了我的路由器逻辑:
angular.module('myApp').config(['$stateProvider', '$locationProvider', '$urlRouterProvider', require('./routes')]);
并且一切正常。但是,对于Angular应用程序(控制器,服务,指令等)所需的其余文件,可能必须包含任意数量的文件。这很容易硬编码,例如:
angular.module('myApp').controller('IndexCtrl', require('./controllers/index'))
但是我不想为我需要添加到应用程序的每个文件硬编码那样的行。我首先考虑使用fs
来解析每个目录并以这种方式加载文件,但没有运气。我现在正在尝试使用格式为controllers/index.js
的文件:
'use strict';
var controllers = [
{
'name': 'HomeCtrl',
'path': './controllers/home'
}
];
module.exports = controllers;
然后我尝试解析并加载文件:
require('./controllers/index').forEach(function(controller) {
angular.module('myApp').controller(controller.name, require(controller.path));
});
这解析了json文件,但是当它尝试从文件中读取路径时出现cannot find module
错误。
使用Browserify将可变数量的AngularJS文件加载到应用程序中是否有更好的方法?
答案 0 :(得分:3)
我最终找到了一个我现在很满意的解决方案。它涉及为每种类型设置一个主要模块:app.controllers
,app.services
等。这些看起来像这样:
var angular = require('angular');
module.exports = angular.module('app.controllers', []);
// Define the list of controllers here
require('./example.js');
其中./example.js
是格式为的控制器:
'use strict';
var controllersModule = require('./_index');
/**
* @ngInject
*/
function ExampleCtrl() {
// ViewModel
var vm = this;
vm.title = 'Test Title';
vm.number = 1234;
}
controllersModule.controller('ExampleCtrl', ExampleCtrl);
对所有控制器,服务,指令等重复此过程,然后将其加载到main.js
内的应用程序中:
'use strict';
var angular = require('angular');
// angular modules
require('angular-ui-router');
require('./controllers/_index');
require('./services/_index');
require('./directives/_index');
// create and bootstrap application
angular.element(document).ready(function() {
var requires = [
'ui.router',
'app.controllers',
'app.services',
'app.directives'
];
angular.module('app', requires);
angular.module('app').config(require('./routes'));
angular.bootstrap(document, ['app']);
});
我的Javascript文件的Gulp任务现在看起来像这样:
gulp.task('browserify', function() {
var b = browserify({
basedir: '.',
entries: './app/js/main.js',
debug: true,
insertGlobals: true
});
b.transform({
global: true
}, ngAnnotate);
b.transform({
global: true
}, uglifyify);
b.bundle()
.pipe(source('main.js'))
.pipe(streamify(rename({suffix: '.min'})))
.pipe(gulp.dest('build/js'))
.pipe(refresh(lrserver));
});
这对我来说效果很好,并且相对模块化!