generator-gb-angular
Yeoman Generator for Enterprise Angular Projects
This generator was forked from generator-cg-angular v3.1.2
, with branch v3.2
merged into master
on Oct 28, 2014.
This generator follows the Angular Best Practice Guidelines for Project Structure.
Release History
- 27/01/2015 - v1.4.0 - Added JSON mocks to services, fixed bug
- 05/01/2015 - v1.1.0 - Switched to using
load-grunt-config
and dedicatedgrunt/
folder for grunt task definition - 29/11/2014 - v1.0.0 - Going to start following semver. Requires update to .yo-rc.json. Added config generator, fixed routing bug.
- 16/11/2014 - v0.1.1 - Changed partial generator to be smarter about generating nested states.
- 28/10/2014 - v0.0.1 - Forked from cgross/generator-cg-angular
Features
- Provides a directory structure geared towards large Angular projects.
- Each controller, service, filter, and directive are placed in their own file.
- All files related to a conceptual unit are placed together. For example, the controller, HTML, LESS, and unit test for a partial are placed together in the same directory.
- Provides a ready-made Grunt build that produces an extremely optimized distribution.
- Build uses grunt-ngAnnotate so you don't have to use the Angular injection syntax for safe minification (i.e. you dont need
$inject
or(['$scope','$http',...
. grunt serve
task allows you to run a simple development server with watch/livereload enabled. Additionally, JSHint and the appropriate unit tests are run for the changed files.
- Build uses grunt-ngAnnotate so you don't have to use the Angular injection syntax for safe minification (i.e. you dont need
- Integrates Bower for package management
- Includes Yeoman subgenerators for config, directives, services, partials, filters, and modules.
- Integrates LESS or Sass, and includes Bootstrap via the source LESS/SCSS files allowing you to reuse Bootstrap vars/mixins/etc.
- Easily Testable - Each sub-generator creates a skeleton unit test. Unit tests can be run via
grunt test
and they run automatically during the grunt watch that is active duringgrunt serve
.
Directory Layout
All subgenerators prompt the user to specify where to save the new files. Thus you can create any directory structure you desire, including nesting. The generator will create a handful of files in the root of your project including index.html
, app.js
, and app.less
. You determine how the rest of the project will be structured.
In this example, the user has chosen to group the app into an admin
folder, a search
folder, and a service
folder.
app.less ....................... main app-wide styles
app.js ......................... angular module initialization
index.html ..................... main HTML file
Gruntfile.js ................... Grunt build file
/admin ......................... example admin module folder
admin.js ..................... admin module initialization and route setup
admin.less ................... admin module LESS
/admin-directive1 ............ angular directives folder
admin-directive1.js ........ example simple directive
admin-directive1-spec.js.... example simple directive unit test
/admin-directive2 ............ example complex directive (contains external partial)
admin-directive2.js ........ complex directive javascript
admin-directive2.html ...... complex directive partial
admin-directive2.less ...... complex directive LESS
admin-directive2-spec.js ... complex directive unit test
/admin-partial ............... example partial
admin-partial.html ......... example partial html
admin-partial.js ........... example partial controller
admin-partial.less ......... example partial LESS
admin-partial-spec.js ...... example partial unit test
/config ........................ separate files for different module-level config statements
/grunt ......................... folder for grunt tasks
/service ....................... angular services folder
my-service.js .............. example service
my-service-spec.js ......... example service unit test
my-service2.js ............. example service
my-service2-spec.js ........ example service unit test
/img ........................... images (not created by default but included in /dist if added)
/dist .......................... distributable version of app built using grunt and Gruntfile.js
/bower_component................ 3rd party libraries managed by bower
/node_modules .................. npm managed libraries used by grunt
Getting Started
Prerequisites: Node, Grunt, Yeoman, and Bower. Once Node is installed, do:
npm install -g grunt-cli yo bower
Next, install this generator:
npm install -g generator-gb-angular
To create a project:
mkdir MyNewAwesomeApp
cd MyNewAwesomeApp
yo gb-angular
Grunt Tasks
Now that the project is created, you have 3 simple Grunt commands available:
grunt serve #This will run a development server with watch & livereload enabled.
grunt test #Run local unit tests.
grunt build #Places a fully optimized (minified, concatenated, and more) in /dist
When grunt serve
is running, any changed javascript files will be linted using JSHint as well as have their appropriate unit tests executed. Only the unit tests that correspond to the changed file will be run. This allows for an efficient test driven workflow.
Yeoman Subgenerators
There are a set of subgenerators to initialize empty Angular components. Each of these generators will:
- Create one or more skeleton files (javascript, LESS, html, spec etc) for the component type.
- Update index.html and add the necessary
script
tags. - Update app.less and add the @import as needed.
- For partials, update the app.js, adding the necessary route call if a route was entered in the generator prompts.
There are generators for grunt-config
, config
,directive
,partial
,service
, filter
, module
, and modal
.
Running a generator:
yo gb-angular:config my-awesome-module-config
yo gb-angular:grunt-config my-sweet-grunt-task
yo gb-angular:directive my-awesome-directive
yo gb-angular:partial my-partial
yo gb-angular:service my-service
yo gb-angular:filter my-filter
yo gb-angular:module my-module
yo gb-angular:modal my-modal
The name paramater passed (i.e. 'my-awesome-directive') will be used as the file names. The generators will derive appropriate class names from this parameter (ex. 'my-awesome-directive' will convert to a class name of 'MyAwesomeDirective'). Each sub-generator will ask for the folder in which to create the new skeleton files. You may override the default folder for each sub-generator in the .yo-rc.json
file.
The modal subgenerator is a convenient shortcut to create partials that work as modals for Bootstrap v3.1 and Angular-UI-Bootstrap v0.10 (both come preconfigured with this generator). If you choose not to use either of these libraries, simply don't use the modal subgenerator.
Subgenerators are also customizable. Please read CUSTOMIZING.md for details.
Submodules
Submodules allow you to more explicitly separate parts of your application. Use the yo cg-angular:module my-module
command and specify a new subdirectory to place the module into. Once you've created a submodule, running other subgenerators will now prompt you to select the module in which to place the new component.
Preconfigured Libraries
The new app will have a handful of preconfigured libraries included. This includes Angular 1.3, Bootstrap 3, AngularUI Bootstrap, AngularUI Utils, FontAwesome 4, JQuery 2, Underscore 1.7, LESS 1.6, and Moment 2.5. You may of course add to or remove any of these libraries. But the work to integrate them into the app and into the build process has already been done for you.
Build Process
The project will include a ready-made Grunt build that will:
- Build all the LESS/SCSS files into one minified CSS file.
- Uses grunt-angular-templates to turn all your partials into Javascript.
- Uses grunt-ngAnnotate to preprocess all Angular injectable methods and make them minification safe. Thus you don't have to use the array syntax.
- Concatenates and minifies all Javascript into one file.
- Replaces all appropriate script references in
index.html
with the minified CSS and JS files. - Minifies any images in
/img
. - Minifies the
index.html
. - Copies any extra files necessary for a distributable build (ex. Font-Awesome font files, etc).
The resulting build loads only a few highly compressed files.
The build process uses grunt-dom-munger to pull script references from the index.html
. This means that your index.html is the single source of truth about what makes up your app. Adding a new library, new controller, new directive, etc does not require that you update the build file. Also the order of the scripts in your index.html
will be maintained when they're concatenated.
Importantly, grunt-dom-munger uses CSS attribute selectors to manage the parsing of the script and link tags. Its very easy to exclude certain scripts or stylesheets from the concatenated files. This is often the case if you're using a CDN. This can also be used to prevent certain development scripts from being included in the final build.
-
To prevent a script or stylesheet from being included in concatenation, put a
data-concat="false"
attribute on the link or script tag. This is currently applied for thelivereload.js
andless.js
script tags. -
To prevent a script or link tag from being removed from the finalized
index.html
, use adata-remove="false"
attribute.