Practical Multi-Module Gulp-Setup with Angular.JS & TypeScript at DAB Bank
1. Build Setup 2. Dependency Management To Be Solved ...
Pursuit of stable quality & efficience - 3 teams - 25 developers - single portal project
Node.js NPM: Build tools for the web - Efficient development - Minification - Optimization - Modularization - Analysis
First Build Setup Approach - grunt.js - organized by feature - functionality by file - missing cross project/ module management
https://www.dab-bank.de/Konto-Kredit/DAB-Finanzmanager- Demo/ https://www.dab-bank.de/Special/Videos/Video-Finanzmanager.
First approach: Build Setup Copy-Paste @Dev: long manual list @Prod: Differs from @Dev
Scaffolding / Templating Problems with existing template projects - opinionated → create your own - copy&paste template → breaks on updates → require merging - missing cross module
DAB Enterprise Build Setup customization by composition - predefine - override - extend - integrate
npm: common-setup-module gulpfile.js + BuildConfig.js + tslint.json, tsd.rc, protractor.conf.js, karma.conf.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())); });
Appplication module myappfolder node_modules - package.json - gulpfile.js - bower.json
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(){ ...}
1. Build Setup 2. Dependency Management To be Solved ...
JavaScript IDE Support JsHint Refactoring → by single file Autocompletion
Dependency Management ??? → cross file ??? → cross module1. 2.
Cross File Dependency Management - AMD - Common.Js - ES6 Harmony - angular.modules - Web Components - TypeScript - Bower - None ...
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
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
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
Why separate angular. module Registration & Usage ? Handling cross file dependencies over to angular → order does not matter
Angular.module Graph https://github.com/lucalanca/grunt-angular-architecture- http://kyu-project.co/kyu.html
Lab: Results TypeScript: outer modules = Common.js/AMD import angular = require(“./thirdparty/angular.d.ts”);
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
Dependency Management ??? → cross file ??? → cross module1. 2.
Cross File Dependency Solution 1. Concat → cross file dependencies managed by angular.module 2. TypeScript innerModules module de.dab.myproject{ import MyType = de.dab.IMyType; } IMytype.d.ts declare module de.dab { interface IMyType { id: string; accounts : IAccount[]; }
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 ???
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 module bower link 2. Use on local machine bower link mymodule *.d.ts *.ts
Trash
Advanced TypeScript & Angular 1. Gulp Multi-Project Build-Setup 2. Code Conventions & Best Practices
Gulp Multi-Project Build-Setup 1. Why another bootstrap? 2. scaffolding vs. composition 3. multi-project development 4. TypeScript strategy a. tsd b. devDependency, dependency strategy i. no </// references ii. separate in .d.ts => performance c. Java → .d.ts generator d. TsLint
Why another bootstrap? 1. Fit to techstack 2. Large scale project 3. Multi-project strategy 4. Being up to date
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
Composition / Inheritance - glue strategy for projects - technology agnostic - update project without merging - reuse != copy → customization is the default
By Example 1. leading gulpfile 2. customization: override, extend or integrate 3.
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
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
Multi Project Development Problems: 1. Multi project strategy 2. 3. realtime sync
Multi Project Development 1. bower link 2. npm link 3. git versioning vs. searchable/-repository 4. devDependency, dependency strategy
Code Conventions & Best Practices 1. constant namespaces 2. direct export 3. controller a. mycontroller = this.scope; 4. directives a. lambda 5. services
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
Multi modularized project setup with gulp, typescript and angular.js
Multi modularized project setup with gulp, typescript and angular.js
Multi modularized project setup with gulp, typescript and angular.js
Multi modularized project setup with gulp, typescript and angular.js
Multi modularized project setup with gulp, typescript and angular.js
Multi modularized project setup with gulp, typescript and angular.js
Multi modularized project setup with gulp, typescript and angular.js
Multi modularized project setup with gulp, typescript and angular.js
Multi modularized project setup with gulp, typescript and angular.js

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