Yeoman + Angular2

Yeoman and Angular2

In Angular1, Yeoman provides powerful tool set.
In Angular2, several people try to create yoeman generator, or others create angular2 project genearator by themselves.
(angular-cli, angular-seed etc…)
So far, there aren’t great tool same as angular1, yoeman. Some tools are not easy-customization, etc…
I will try some using some tool.

Yoeman and generator-angular2

Install dependencies

npm install -g yo
npm install -g bower
npm install -g generator-angular2

If you don’t have nodejs, please install nodejs

Create project

Create project directory and start yeoman

mkdir myproject
cd myproject
yo

Select Angular2 to create angular2 project

By default, all source codes are under src

myproject
|- build
|- node_modules
|-src
|   |- xxxx.js
|-gulpfile.js
|-package.json

If you run following command, first project will work

gulp
gulp serve

Change directory structure and code

I want to clean directory structure as I can understand easily.

myproject
| - src
     |- index.html
     |- app
     |   |- app.js
     |   |- main.js
     |- styles
     |   |- index.css

Separate js and css files

Add some task to gulp

Clean build file is useful to clean build file.
Also, add js dependencies etc…

Finally, gulpfile.js becomes

var gulp = require('gulp'),
    rename = require('gulp-rename'),
    traceur = require('gulp-traceur'),
    webserver = require('gulp-webserver'),
    del = require('del');


var config = {
   sourceDir: 'src',
   buildDir: 'build',
   npmDir: 'node_modules'
};

// clean
gulp.task('clean', function() {
   return del(config.buildDir + '/**/*', { force: true });
});

// run init tasks
gulp.task('default', ['dependencies', 'js', 'html', 'css']);

// run development task
gulp.task('dev', ['watch', 'serve']);

// serve the build dir
gulp.task('serve', function () {
  gulp.src(config.buildDir)
    .pipe(webserver({
      open: true
    }));
});

// watch for changes and run the relevant task
gulp.task('watch', function () {
  gulp.watch('src/**/*.js', ['js']);
  gulp.watch('src/**/*.html', ['html']);
  gulp.watch('src/**/*.css', ['css']);
});

// move dependencies into build dir
gulp.task('dependencies', function () {
  return gulp.src([
    'node_modules/traceur/bin/traceur-runtime.js',
    'node_modules/systemjs/dist/system-csp-production.src.js',
    'node_modules/systemjs/dist/system.js',
    'node_modules/reflect-metadata/Reflect.js',
    'node_modules/angular2/bundles/angular2.js',
    'node_modules/angular2/bundles/router.js',
    'node_modules/angular2/bundles/angular2-polyfills.js',
    'node_modules/rxjs/bundles/Rx.js',
    'node_modules/es6-shim/es6-shim.min.js',
    'node_modules/es6-shim/es6-shim.map'
  ])
    .pipe(gulp.dest(config.buildDir + '/lib'));
});

// transpile & move js
gulp.task('js', function () {
  return gulp.src(config.sourceDir + '/**/*.js')
    .pipe(rename({
      extname: ''
    }))
    .pipe(traceur({
      modules: 'instantiate',
      moduleName: true,
      annotations: true,
      types: true,
      memberVariables: true
    }))
    .pipe(rename({
      extname: '.js'
    }))
    .pipe(gulp.dest(config.buildDir));
});

// move html
gulp.task('html', function () {
  return gulp.src(config.sourceDir + '/**/*.html')
    .pipe(gulp.dest('build'))
});

// move css
gulp.task('css', function () {
  return gulp.src(config.sourceDir + '/**/*.css')
    .pipe(gulp.dest('build'))
});

Run

Build and Run

gulp
gulp serve