Top Banner
Practical Multi-Module Gulp-Setup with Angular.JS & TypeScript at DAB Bank
52

Multi modularized project setup with gulp, typescript and angular.js

Jul 10, 2015

Download

Documents

David Amend
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Multi modularized project setup with gulp, typescript and angular.js

Practical Multi-Module

Gulp-Setup

with Angular.JS & TypeScript at DAB Bank

Page 2: Multi modularized project setup with gulp, typescript and angular.js

1. Build Setup2. Dependency Management

To Be Solved ...

Page 3: Multi modularized project setup with gulp, typescript and angular.js

Pursuit of stable

quality & efficience

- 3 teams- 25 developers- single portal project

Page 4: Multi modularized project setup with gulp, typescript and angular.js

Node.js NPM: Build tools for the web

- Efficient development- Minification- Optimization- Modularization- Analysis

Page 5: Multi modularized project setup with gulp, typescript and angular.js

First Build Setup Approach

- grunt.js- organized by feature- functionality by file- missing cross project/

module management

Page 7: Multi modularized project setup with gulp, typescript and angular.js

First approach: Build Setup

Copy-Paste@Dev: long manual list

@Prod: Differs from @Dev

Page 8: Multi modularized project setup with gulp, typescript and angular.js

Scaffolding / Templating

Problems with existing template projects

- opinionated→ create your own

- copy&paste template→ breaks on updates → require merging

- missing cross module

Page 9: Multi modularized project setup with gulp, typescript and angular.js

DAB Enterprise Build Setup

customization by composition

- predefine

- override

- extend

- integrate

Page 10: Multi modularized project setup with gulp, typescript and angular.js

npm: common-setup-module

gulpfile.js + BuildConfig.js

+ tslint.json, tsd.rc, protractor.conf.js, karma.conf.js

Page 11: Multi modularized project setup with gulp, typescript and angular.js

common-setup-module gulpfile

module.exports = function ( gulp, CONFIG) {

gulp.task("default", ["dev"]);

gulp.task("prod:once", ["prod"]);

gulp.task("prod", ["prod:tscompile", "templates"]);

gulp.task("dev", ["dev:once", "webserver", "watch"]);

gulp.task("js-app", function () {

gulp.src(CONFIG.SRC.TS.FILES())

.pipe(partials.errorPipe())

.pipe(plugins.concat( CONFIG.DIST.JS.FILES.APP()))

.pipe(gulp.dest( CONFIG.DIST.JS.FOLDER()));

});

Page 12: Multi modularized project setup with gulp, typescript and angular.js

Appplication module

myappfolder

node_modules

- package.json- gulpfile.js- bower.json

Page 13: Multi modularized project setup with gulp, typescript and angular.js

Composition: Gulpfile.json

var gulp = require("gulp");

var CONFIG= require('./node_modules/common-setup-module/BuildConfig');

var gulpInit = require("./node_modules/common-setup-module/gulpfile");

CONFIG.SRC.JS.FILES = “customSRC/**.js” ;

var gulpInstanceToOverride = gulpInit(gulp, CONFIG);

gulpInstanceToOverride.task("js-app", function(){

console.log("was overridden");

});

gulpInstanceToOverride.task(“someNewTask”, function(){ ...}

Page 14: Multi modularized project setup with gulp, typescript and angular.js

1. Build Setup2. Dependency Management

To be Solved ...

Page 15: Multi modularized project setup with gulp, typescript and angular.js

JavaScript IDE Support

JsHint Refactoring

→ by single file

Autocompletion

Page 16: Multi modularized project setup with gulp, typescript and angular.js

Dependency

Management

???→ cross file

???→ cross module1. 2.

Page 17: Multi modularized project setup with gulp, typescript and angular.js

Cross File Dependency Management

- AMD

- Common.Js

- ES6 Harmony

- angular.modules

- Web Components

- TypeScript

- Bower

- None

...

Page 18: Multi modularized project setup with gulp, typescript and angular.js

Angular.module Best Practices

/app

/applicationContext.js

/modules

/submodule

/submodule-service.js

/submodule-directive.js

/submodule-controller.js Miško Hevery

Inspired By

1.

2.

Module Creation & Referencing

Module Retrieval & Chargement

Page 19: Multi modularized project setup with gulp, typescript and angular.js

Single Point of Dependency Wiring

/app

applicationContext.js

angular.module(‘de.dab.pfm.app’, [‘de.dab.pfm.dashboard’]);

angular.module(‘de.dab.pfm.dashboard’, [‘de.dab.pfm.dashboard.header’]);

angular.module(‘de.dab.pfm.dashboard.header’, [‘de.dab.pfm.dashboard.intro’,‘de.dab.shared.pieChart‘]);

angular.module(‘de.dab.pfm.dashboard.intro’, [‘...’]);

angular.module(‘de.dab.shared.pieChart’, [‘...’]);

Registration

Page 20: Multi modularized project setup with gulp, typescript and angular.js

Usage of Module In File

pieChart

pie-chart-directive.js

angular.module(‘de.dab.shared.pieChart’).directive(‘de.dab.shared.pieChartService’, ...);

pie-chart-service.js

angular.module(‘de.dab.shared.pieChart’).service(‘de.dab.shared.pieChartService’, ...) pie-chart-model.js

pie-chart.tpl.html

Getter

Page 21: Multi modularized project setup with gulp, typescript and angular.js

Why separate angular.module

Registration & Usage ?

Handling cross file dependencies over to angular

→ order does not matter

Page 23: Multi modularized project setup with gulp, typescript and angular.js

Lab: Results

TypeScript: outer modules= Common.js/AMD

import angular = require(“./thirdparty/angular.d.ts”);

Page 24: Multi modularized project setup with gulp, typescript and angular.js

Lab: TS: outer modules (Common.js/AMD)

→ no difference to angular.module

→ aync needed in AMD ?

→ define file dependencies: anyway app.min.js file deployed

Evidence, same graph with: https://github.com/auchenberg/dependo

Page 25: Multi modularized project setup with gulp, typescript and angular.js

Dependency Management

???→ cross file

???→ cross module1. 2.

Page 26: Multi modularized project setup with gulp, typescript and angular.js

Cross File Dependency Solution

1. Concat→ cross file dependencies managed by angular.module

2. TypeScript innerModulesmodule de.dab.myproject{ import MyType = de.dab.IMyType;}

IMytype.d.ts declare module de.dab {

interface IMyType {

id: string;

accounts : IAccount[];

}

Page 27: Multi modularized project setup with gulp, typescript and angular.js

Final Solution to

Dependency Management

1. BuildConfig.js

→ store bower.json “dab-*”deps devDependencies/dependencies

2. gulpfile.js

→ use list of deps in tasks

Bower

???

Page 28: Multi modularized project setup with gulp, typescript and angular.js

JavaScript Multi Projects

bower.json deps:

dab-subproject-component

dab-common-widget-component

dab-bootstrap-component

current module

gulpfile.js

concat/TypeScript: common.js, app.js,

templates.js, libs.js webserver: target/main.css

bower dependency

bower devDependency

1. Register local modulebower link

2. Use on local machinebower link mymodule

*.d.ts

*.ts

Page 29: Multi modularized project setup with gulp, typescript and angular.js
Page 30: Multi modularized project setup with gulp, typescript and angular.js

Trash

Page 31: Multi modularized project setup with gulp, typescript and angular.js

Advanced TypeScript & Angular

1. Gulp Multi-Project Build-Setup

2. Code Conventions & Best Practices

Page 32: Multi modularized project setup with gulp, typescript and angular.js

Gulp Multi-Project Build-Setup1. Why another bootstrap?

2. scaffolding vs. composition3. multi-project development4. TypeScript strategy

a. tsdb. devDependency, dependency strategy

i. no </// referencesii. separate in .d.ts => performance

c. Java → .d.ts generatord. TsLint

Page 33: Multi modularized project setup with gulp, typescript and angular.js

Why another bootstrap?

1. Fit to techstack2. Large scale project3. Multi-project strategy4. Being up to date

Page 34: Multi modularized project setup with gulp, typescript and angular.js

Scaffolding vs Composition

Problems with scaffolding (Yeoman)

- copy+paste of templates- opinionated technologies

- missing common glue- hard to find matching techstack

- breaks on updates - merge operations

→ convention > customization

Page 35: Multi modularized project setup with gulp, typescript and angular.js

Composition / Inheritance

- glue strategy for projects- technology agnostic- update project without merging- reuse != copy

→ customization is the default

Page 36: Multi modularized project setup with gulp, typescript and angular.js

By Example

1. leading gulpfile2. customization:

override, extend or integrate3.

Page 37: Multi modularized project setup with gulp, typescript and angular.js

Complexity

RequireJS

- file dependencies- Issues with testing- 350 Requests are slow- at runtime & async- Angular.modules vs. modularization

→ will be one file at prod, anyway

→ which files to deliver in which package?

→ versioning

Page 38: Multi modularized project setup with gulp, typescript and angular.js

Simplicity

1. Modularize by module

2. Adapt complexity later: http://www.2ality.com/2014/09/es6-

modules-final.html

3. Bower: not supporting multi versioning

4. be similar to production, only dev & prod mode

angular overmind

Page 39: Multi modularized project setup with gulp, typescript and angular.js

Multi Project Development

Problems:

1. Multi project strategy

2.3. realtime sync

Page 40: Multi modularized project setup with gulp, typescript and angular.js

Multi Project Development

1. bower link

2. npm link

3. git versioning vs. searchable/-repository

4. devDependency, dependency strategy

Page 41: Multi modularized project setup with gulp, typescript and angular.js

Code Conventions & Best Practices

1. constant namespaces

2. direct export3. controller

a. mycontroller = this.scope;4. directives

a. lambda5. services

Page 42: Multi modularized project setup with gulp, typescript and angular.js
Page 43: Multi modularized project setup with gulp, typescript and angular.js

Compiling & TypeScript

Why TypeScript?

- Compilation Imposed by Google- Sweet Home Java/.Net-Developer- Refactoring Made Easy- Models Management- Future-Proof Syntax, Angular

2.0, …- Choice of TypeScriptifying

Page 44: Multi modularized project setup with gulp, typescript and angular.js
Page 45: Multi modularized project setup with gulp, typescript and angular.js
Page 46: Multi modularized project setup with gulp, typescript and angular.js
Page 47: Multi modularized project setup with gulp, typescript and angular.js
Page 48: Multi modularized project setup with gulp, typescript and angular.js
Page 49: Multi modularized project setup with gulp, typescript and angular.js
Page 50: Multi modularized project setup with gulp, typescript and angular.js
Page 51: Multi modularized project setup with gulp, typescript and angular.js
Page 52: Multi modularized project setup with gulp, typescript and angular.js