SlideShare une entreprise Scribd logo
1  sur  109
Télécharger pour lire hors ligne
Große Applikationen
mit
WHO AM I?
• Sebastian Springer
• aus München
• arbeite bei Mayflower
• https://github.com/sspringer82
• @basti_springer
• Consultant,Trainer,Autor
Konventionen
Wenn ihr heute nur einen Punkt mitnehmt, dann:
Haltet euren Code und eure Struktur einheitlich.
Was ist eine
große Applikation?
K. Bangwa / pixelio.de
Großer
Funktionsumfang
Grundsätzliches
Bernd Kasper / pixelio.de
Sprechender Code
Sprechender Code
angular.module('myApp', [])

.controller('MyCtrl', MyCtrl);





function MyCtrl() {

var vm = this;



vm.onSaveButtonClicked = onSaveButtonClicked;



function onSaveButtonClicked() {}

}
Sprechender Code
Was ist, wenn ein Funktionsname zu lange wird?
Dann macht die Funktion wahrscheinlich zu viel und sollte
aufgeteilt werden.
Komplexität
Tim Reckmann / pixelio.de
Komplexität
Applikation in kleinere, weniger komplexe Einheiten unter-
teilen und diese zu einem Komplettsystem integrieren.
Komplexität
vm.start = function() {

vm.status = "started";



stopInterval = $interval(function () {



var data = readerDataFactory.getPart();

if (data) {

vm.part = data;

} else {

vm.part = "";

vm.status = "stopped";

$interval.cancel(stopInterval);

stopInterval = null;

vm.text = readerDataFactory.getText();

}

}, 1000 * 60 / readerDataFactory.getWPM());

};
vm.stop = function() {

vm.status = "stopped";

$interval.cancel(stopInterval);

stopInterval = null;

};
Styleguide
Styleguide
Der Quellcode soll überall gleich aussehen.
Dem Quellcode soll man nicht ansehen, wann er von wem mit
welcher Laune geschrieben wurde.
Ein guter Start ist: https://github.com/johnpapa/angular-
styleguide
Werkzeuge
Gila Hanssen / pixelio.de
Entwicklungsumgebung
Entwicklungsumgebung
Autocompletion: Variablen und Konstrukte vervollständigen.
Hilfestellung bieten.
Highlighting: Visuelle Abgrenzung zwischen verschiedenen
Konstrukten für erhöhte Lesbarkeit.
Linting: Anti-Pattern-Erkennung, um Fehler zu vermeiden.
Angular Plugins für WebStorm, Eclipse,…
Entwicklungsumgebung
Paketverwaltung
Rainer Sturm / pixelio.de
Paketverwaltung
Installation externer Bibliotheken. Versionsverwaltung und
Überblick über installierte Bibliotheken. Auflösung von
Abhängigkeiten.
Paketmanager: bower, npm, spmjs,…
Paketverwaltung
$ bower install angular
bower angular#* cached git://github.com/angular/bower-a
bower angular#* validate 1.4.0 against git://github.com/a
bower angular#~1.4.0 install angular#1.4.0
angular#1.4.0 bower_components/angular
Yeoman
Scaffolding für Webprojekte. Bietet Generatoren, um schnell
häufig benötigte Strukturen im Projekt zu schaffen.
Yeoman
npm install -g yo
npm install -g generator-angular
yo angular myApp
yo angular:controller account
Yeoman
Problem:
Aber unsere Applikation ist etwas ganz besonderes und die
bestehenden Generatoren passen für uns nicht. Wir müssen
jede Struktur nochmal anfassen und umbauen.
Lösung:
Eigene Generatoren erstellen.
Guide: http://yeoman.io/authoring/
Struktur
Initiative Echte Soziale Marktwirtschaft IESM / pixelio.de
Struktur
Wie baut man eine Applikation auf, damit sie wartbar und
erweiterbar bleibt?
Wo findet man bestimmte Komponenten?
Wie werden die Verzeichnisse strukturiert?
Wie heißen die Dateien?
Ein Verzeichnis pro
Feature
Ein Verzeichnis pro Feature
Features unabhängig halten. Wiederverwendbarkeit in
anderen Applikationen erreichen. Klares Namespacing
einführen.
Ein Verzeichnis für
shared content
Ein Verzeichnis für shared
content
Gemeinsam genutzte Komponenten liegen in einer eigenen
Hierarchie. Abhängigkeiten zwischen Modulen werden
vermieden.
Eine Komponente pro
Datei
Eine Komponente pro Datei
Controller, Services, Direktiven, … erhalten jeweils ihre eigene
Datei.
Single Responsibility - eine Datei ist nur für einen Zweck da.
Zuordnung von Zuständigkeiten ist einfach. Das Auffinden
von Quellcode ist schneller.
Eine Komponente pro Datei
angular.module('user.controller.login', [])

.controller('user.loginController', LoginController);



function LoginController() {



}
Einheitliche sprechende
Benennung
Einheitliche sprechende
Benennung
Die Namen von Dateien und deren Speicherort folgt einem
konsistenten Schema.
Das Lokalisieren von Komponenten wird einfacher.
/user/login.controller.js
Konfiguration
auslagern
Konfiguration auslagern
Die Konfiguration eines Moduls liegt in einer eigenen Datei
innerhalb des Moduls.
Die Konfiguration erfolgt an einer zentralen Stelle und nicht
über die Komponenten verteilt.
Konfiguration auslagern
angular.module('addressBook.translation', ['pascalprecht.translate'])

.config(['$translateProvider', function ($translateProvider) {

$translateProvider.translations('de', de);

$translateProvider.translations('en', en);

$translateProvider.preferredLanguage('en');

}]);
Struktur flach halten
Struktur flach halten
Die Verzeichnisstruktur sollte initial möglichst flach sein. Bei
Bedarf (viele Dateien pro Verzeichnis) tiefer werden.
Routing
Erich Westendarp / pixelio.de
Routing
Navigation zwischen verschiedenen States in der
Applikation.
States arbeiten mit Views, die benannt sein können. Optional
können Controller hinzugefügt werden.
Implementierungen:
- ngRoute
- angular-ui-router
Routing - Konfiguration
angular.module('adress', ['ui.router'])

.config(ConfigFn);



ConfigFn.$inject = ['$stateProvider', '$urlRouterProvider'];



function ConfigFn ($stateProvider, $urlRouterProvider) {

$urlRouterProvider.otherwise('/list');



$stateProvider.state('list', {

url: '/list',

template: tplList,

controller: 'listCtrl'

});

}
Routing - advanced
Mehrere benannte Views
<body>

<div ui-view="content"></div>

<div ui-view="info"></div>

</body>
$stateProvider.state('list', {

url: '/list',

views: {

content: {

template: tplListContent,

controller: 'listContentCtrl'

},

info: {

template: tplListInfo,

controller: 'listInfoCtrl'

}

}

Routing - advanced
<div ui-view></div>

<a ui-sref="state1">State 1</a>
<a ui-sref="state1.list">Show List</a>

<div ui-view></div>
index.html
state1.html
state1.list.html
<ul>

<li ng-repeat="item in items">{{ item }}</li>

</ul>
Nested Views
Routing - advanced
Nested Views
$stateProvider

.state('state1', {

url: "/state1",

templateUrl: "partials/state1.html"

})

.state('state1.list', {

url: "/list",

templateUrl: "partials/state1.list.html",

controller: function($scope) {

$scope.items = ["A", "List", "Of", "Items"];

}

});
Routing - new Router
Redesignter Router. Folgeversion von ngRoute. Aktuell noch
nicht stabil. Ist aber für 1.4 und 2 vorgesehen.
DRY
Don’t Repeat Yourself
DRY
Sobald eine Routine zum zweiten Mal implementiert wird,
sollte sie in einen eigenständigen Service ausgelagert
werden.
Diese Services können abstrahiert und durch
unterschiedliche Konfiguration an mehreren Stellen
wiederverwendet werden.
DRY
Nützliche Helper können in einer eigenen Library gesammelt
werden.
z.B. Logger
NIH
Not Invented Here
NIH
Bevor man etwas selbst implementiert, sollte man zuerst
prüfen, ob es für diese Problemstellung nicht schon eine
Lösung gibt.
Beispiele:
- REST-Kommunikation: ngResource, restangular
- Websocket: angular-websocket, ng-websocket
- localstorage: angular-local-storage
- Routing: ngRoute, ui-router
- Translation: ngTranslate
Dokumentation
René Golembewski / pixelio.de
Dokumentation
Es muss nicht jede Funktion dokumentiert werden (z.B.
Callbacks)
Lieber sprechenden Code schreiben.
Dokumentation
Schnittstellen zwischen Teams/Projekten müssen
dokumentiert und AKTUELL gehalten werden.
Dokumentation
Angular selbst verwendet jsdoc bzw. ngdoc und Dgeni zum
Parsen.
Weitere Infos:
https://github.com/angular/angular.js/wiki/Writing-AngularJS-
Documentation
Dokumentation
/**

* @name trim

* @private

*

* @description

* trim polyfill

*

* @returns {string} The string stripped of whitespace from both ends

*/

var trim = function() {

return this.toString().replace(/^s+|s+$/g, '');

};
Typescript
Zur Dokumentation von Schnittstellen kann zusätzlich
Typescript eingesetzt werden.
Möglichkeit zur Beschreibung von Signaturen, Klassen und
Interfaces.
Code
Corinna Dumat / pixelio.de
Struktur vs.
Implementierung
Struktur vs. Implementierung
Trennung der konkreten Implementierung und der Struktur.
Rückgabe/Bindables getrennt von den
Funktionsdefinitionen.
Struktur vs. Implementierung
function ListCtrl() {

var vm = this;



vm.onEdit = onEdit;

vm.onDelete = onDelete;



function onEdit(id) {…}



function onDelete(id) {…} 

}
function ItemService() {

return {

fetch: fetch,

save: save

};



function fetch() {...}

function save() {...}

}
Controller:
Factory:
init-Funktion
init-Funktion
Sämtliche Logik, die in einem Controller zur Initialisierung
direkt ausgeführt wird, wird in einer Funktion gekapselt.
So sieht man auf einen Blick, was passiert, wenn dieser
Controller erstellt wird.
init-Funktion
function ListCtrl(itemStore) {

var vm = this;



vm.items = [];



function init() {

itemStore.fetch().then(function(items) {

vm.items = items;

});

}



init();

}
Logik in Services
Logik in Services
Controller sollten nicht zu viel Logik beinhalten, da sie
dadurch unleserlich werden. Umfangreichere Logik in
Services auslagern.
Ein Controller pro View
Ein Controller pro View
Mehrere Views sollten sich nicht einen Controller teilen. Dies
macht es meistens erforderlich, Logikweichen einzubauen,
die die Lesbarkeit beeinträchtigen.
Promises
JMG / pixelio.de
Promises
Promises sind ein Mittel, um asynchronen Programmfluss zu
steuern. Sie erhöhen die Lesbarkeit des Quellcodes und
helfen bei der Fehlerbehandlung.
Promises
ListCtrl.$inject = ['$q', '$timeout'];



function ListCtrl($q, $timeout) {



function async() {

return $q(function (resolve, reject) {

$timeout(function () {

resolve('Hello');

}, 1000);

});

}



async().then(function (data) {

vm.data = data;

});

}
Testing?
Rike / pixelio.de
Tests
Mindestens zwei Ebenen von Tests: Unittests und End2End-
Tests.
Manuelle Tests können allerdings nicht entfallen, da immer
noch irgendwo Logikfehler versteckt sein können.
Unittests
Unittests
Karma: bietet die Infrastruktur. Steuerung der
angeschlossenen Browser. Verteilung der Tests und
Einsammeln der Daten.
Jasmine: Formulieren der Tests.
Die Tests liegen bei den Dateien, die sie testen sollen. Tests
werden schneller gefunden und besser gepflegt, sind
gegenwärtiger.
describe('simple controller', function() {

var $rootScope, $scope, createController;



beforeEach(module('simpleCtrl'));



beforeEach(inject(function($injector) {

$rootScope = $injector.get('$rootScope');

$scope = $rootScope.$new();

var $controller = $injector.get('$controller');

createController = function() {

return $controller('PasswordCtrl', {

'$scope': $scope

});

};

}));



it('should have a name property with a value', function() {

var controller = createController();

expect($scope.name).toBe('Hans-Peter');

});



it('should execute a function', function() {

var controller = createController();

expect($scope.myFunc()).toBe('hello');

})

});
End2End
End2End
Werden mit Protractor erstellt. Bauen auf Selenium
WebDriver auf. Testen die komplette Applikation inklusive
Server.
Längere Laufzeit als Unittests. Testen Integration einzelner
Komponenten in die Applikation.
Werden in einer parallelen Verzeichnishierarchie gepflegt.
End2End
describe('project list', function() {

it('should check the first item in the list', function(done) {

browser.get('/');



var name = element(by.repeater('project in projects')

.row(0)

.column('name'));



expect(name.getText()).toEqual('Projekt A');



done();

});

});
Test Doubles
Regina Kaute / pixelio.de
Test Doubles
Test Doubles für Services verwenden, z.B. $httpBackend.
Für alles Übrige kommt Sinon.js zum Einsatz.
Module Loader
Bernd Kasper / pixelio.de
Module Loader
Keine Script-Tags mehr schreiben. Abhängigkeiten zwischen
Dateien werden aufgelöst. Können im Build zu einer Datei
zusammengefasst werden.
Beispiele:
- require.js
- Browserify
- SystemJS
- …
Module Loader
define(['angular'], function(angular) {

var controller = angular.module('controller', [])

.controller('ListCtrl', ListCtrl);



function ListCtrl() {…}



return controller;

});
Statische
Codeanalyse
Tim Reckmann / pixelio.de
Statische Codeanalyse
Statische Prüfung des Quellcodes. Auffinden von
Antipatterns oder Betrachtung bestimmter Metriken wie z.B.
Komplexität.
Tools:
- linter (jslint, jshint, eslint)
- Plato
Statische Codeanalyse
Buildsysteme
schau media / pixelio.de
Buildsysteme
Automatisieren von wiederkehrenden Aufgaben wie Tests,
Build, Linting
Beispiele:
- grunt
- gulp
- npm
Buildsysteme
module.exports = function(grunt) {

grunt.initConfig({

copy: {...},

clean: {

bower: ['bower_components']

},

shell: {

bower: {

command: 'bower install'

}

},

watch: {

scripts: {

files: ['src/**/*.js', 'src/**/*.html'],

tasks: ['copy:app']

}

},

requirejs: {...}

});

require('load-grunt-tasks')(grunt);

grunt.registerTask('bower', ['shell:bower', 'copy:bower',
'clean:bower']);

};
Kommunikation
Aka / pixelio.de
Kommunikation
Wie werden Daten zwischen einzelnen Komponenten einer
Applikation ausgetauscht?
Kommunikation
innerhalb der Applikation
Services
Services sind Singletons und können an verschiedenen
Stellen verwendet werden.
Mit Services lassen sich Nachrichtenbusse umsetzen, die zur
Kommunikation zwischen den Komponenten verwendet
werden können.
angular.module('myApp', [])

.factory('MsgBus', MsgBus);



function MsgBus() {

var callbacks = {};



return {

on: on,

trigger: trigger

};



function on(event, callback) {

if (callbacks[event]) {

callbacks[event] = [callback];

return this;

}

callbacks[event].push(callback);

}

function trigger(event, data) {

if (callbacks[event]) {

callbacks[event].forEach(function (callback) {

callback(data);

});

}

}

}
Direktiven
Direktiven sind Marker im HTML, die den Funktionsumfang
von HTML erweitern.
Mithilfe der Scope-Eigenschaft der Direktive kann zwischen
dem außenliegenden Controller und der Direktive
kommuniziert werden.
Direktiven
<my-directive name="{{ name }}" color="color" reverse="reverseName()">
angular.module('app', [])

.directive('myDirective', myDirective);



function myDirective() {

return {

scope: {

name: '@', // one way (read only)

color: '=', // two way

reverse: '&' // function binding

}

}

}
Kommunikation zum
Server
Kommunikation zum Server
Services, die die Kommunikation kapseln.
$http, restangular, ngResource, angular-websocket
Abstrahieren die Schnittstelle zum Server. Können zum
Testen durch Stubs ersetzt werden.
Kommunikation zum Server
$http.get('/weather').success(function (data) {

data.forEach(function (item) {

if (item.id === id) {

vm.data = item;

}

});

});
Performance
Thomas Siepmann / pixelio.de
Performance
Angular ist ein Framework, das bedeutet Overhead.
Two Way Data-Binding mit Dirty Checking ist eines der
größten Performance-Probleme.
Mögliche Lösung: angular-vs-repeat, ngGrid
Performance
Performance
Bei tiefergehenden Performance-Problemen: Developer Tools
nutzen und die Applikation auseinander nehmen.
Fragen?
Rainer Sturm / pixelio.de
KONTAKT
Sebastian Springer
sebastian.springer@mayflower.de
Mayflower GmbH
Mannhardtstr. 6
80538 München
Deutschland
@basti_springer
https://github.com/sspringer82

Contenu connexe

Tendances

Einführung in Clean Code mit .NET - Teil 1
Einführung in Clean Code mit .NET - Teil 1Einführung in Clean Code mit .NET - Teil 1
Einführung in Clean Code mit .NET - Teil 1Gregor Biswanger
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesGregor Biswanger
 
Cloud Provisioning mit Juju
Cloud Provisioning mit JujuCloud Provisioning mit Juju
Cloud Provisioning mit JujuFrank Müller
 
Celery - eine asynchrone Task Queue (nicht nur) für Django
Celery - eine asynchrone Task Queue (nicht nur) für DjangoCelery - eine asynchrone Task Queue (nicht nur) für Django
Celery - eine asynchrone Task Queue (nicht nur) für DjangoMarkus Zapke-Gründemann
 
dotnet Cologne 2013 - Windows Azure Mobile Services
dotnet Cologne 2013 - Windows Azure Mobile Servicesdotnet Cologne 2013 - Windows Azure Mobile Services
dotnet Cologne 2013 - Windows Azure Mobile ServicesSascha Dittmann
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreGregor Biswanger
 
Von 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im WebVon 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im WebSebastian Springer
 
Celery eine asynchrone task queue (nicht nur) für django
Celery   eine asynchrone task queue (nicht nur) für djangoCelery   eine asynchrone task queue (nicht nur) für django
Celery eine asynchrone task queue (nicht nur) für djangoMarkus Zapke-Gründemann
 
Angular von 0 auf 100
Angular von 0 auf 100Angular von 0 auf 100
Angular von 0 auf 100Yvette Teiken
 
MongoDB: Security-Tipps gegen Hacker
MongoDB: Security-Tipps gegen HackerMongoDB: Security-Tipps gegen Hacker
MongoDB: Security-Tipps gegen HackerGregor Biswanger
 
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...Gregor Biswanger
 
Einfacher bauen
Einfacher bauenEinfacher bauen
Einfacher bauenjohofer
 
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScriptManfred Steyer
 
Electron.NET: Cross-Platform Desktop Software mit ASP.NET Core
Electron.NET: Cross-Platform Desktop Software mit ASP.NET CoreElectron.NET: Cross-Platform Desktop Software mit ASP.NET Core
Electron.NET: Cross-Platform Desktop Software mit ASP.NET CoreGregor Biswanger
 
JSF 2 Kompositkomponenten (JAX 2012)
JSF 2 Kompositkomponenten (JAX 2012)JSF 2 Kompositkomponenten (JAX 2012)
JSF 2 Kompositkomponenten (JAX 2012)Michael Kurz
 
MicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative StandardMicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative StandardOPEN KNOWLEDGE GmbH
 
Welches Webframework passt zu mir? (WJAX)
Welches Webframework passt zu mir? (WJAX)Welches Webframework passt zu mir? (WJAX)
Welches Webframework passt zu mir? (WJAX)Alexander Casall
 

Tendances (20)

Einführung in Clean Code mit .NET - Teil 1
Einführung in Clean Code mit .NET - Teil 1Einführung in Clean Code mit .NET - Teil 1
Einführung in Clean Code mit .NET - Teil 1
 
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und KubernetesVerteilte Anwendungen bei Azure mit Docker und Kubernetes
Verteilte Anwendungen bei Azure mit Docker und Kubernetes
 
Cloud Provisioning mit Juju
Cloud Provisioning mit JujuCloud Provisioning mit Juju
Cloud Provisioning mit Juju
 
Pimcore
PimcorePimcore
Pimcore
 
Celery - eine asynchrone Task Queue (nicht nur) für Django
Celery - eine asynchrone Task Queue (nicht nur) für DjangoCelery - eine asynchrone Task Queue (nicht nur) für Django
Celery - eine asynchrone Task Queue (nicht nur) für Django
 
dotnet Cologne 2013 - Windows Azure Mobile Services
dotnet Cologne 2013 - Windows Azure Mobile Servicesdotnet Cologne 2013 - Windows Azure Mobile Services
dotnet Cologne 2013 - Windows Azure Mobile Services
 
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET CoreHands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
Hands-on Workshop: API-Dokumentation mit OpenAPI / Swagger in ASP.NET Core
 
Von 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im WebVon 0 auf 100 - Performance im Web
Von 0 auf 100 - Performance im Web
 
Celery eine asynchrone task queue (nicht nur) für django
Celery   eine asynchrone task queue (nicht nur) für djangoCelery   eine asynchrone task queue (nicht nur) für django
Celery eine asynchrone task queue (nicht nur) für django
 
Angular von 0 auf 100
Angular von 0 auf 100Angular von 0 auf 100
Angular von 0 auf 100
 
MongoDB: Security-Tipps gegen Hacker
MongoDB: Security-Tipps gegen HackerMongoDB: Security-Tipps gegen Hacker
MongoDB: Security-Tipps gegen Hacker
 
TypeScript
TypeScriptTypeScript
TypeScript
 
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
Kuck mal, Node.js! Einstieg für .NET Entwickler mit Visual Studio Code und Ty...
 
Einfacher bauen
Einfacher bauenEinfacher bauen
Einfacher bauen
 
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
.NET Summit 2016 München: EcmaScript 2015+ with TypeScript
 
Electron.NET: Cross-Platform Desktop Software mit ASP.NET Core
Electron.NET: Cross-Platform Desktop Software mit ASP.NET CoreElectron.NET: Cross-Platform Desktop Software mit ASP.NET Core
Electron.NET: Cross-Platform Desktop Software mit ASP.NET Core
 
JSF 2 Kompositkomponenten (JAX 2012)
JSF 2 Kompositkomponenten (JAX 2012)JSF 2 Kompositkomponenten (JAX 2012)
JSF 2 Kompositkomponenten (JAX 2012)
 
Mvc public
Mvc publicMvc public
Mvc public
 
MicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative StandardMicroProfile 2.x: Der alternative Standard
MicroProfile 2.x: Der alternative Standard
 
Welches Webframework passt zu mir? (WJAX)
Welches Webframework passt zu mir? (WJAX)Welches Webframework passt zu mir? (WJAX)
Welches Webframework passt zu mir? (WJAX)
 

En vedette

Introduction to Protractor
Introduction to ProtractorIntroduction to Protractor
Introduction to ProtractorFlorian Fesseler
 
SEO: Crawl Budget Optimierung & Onsite SEO
SEO: Crawl Budget Optimierung & Onsite SEOSEO: Crawl Budget Optimierung & Onsite SEO
SEO: Crawl Budget Optimierung & Onsite SEOPhilipp Klöckner
 
Fast Growing Companies: 10 SEO Lessons Learned
Fast Growing Companies: 10 SEO Lessons LearnedFast Growing Companies: 10 SEO Lessons Learned
Fast Growing Companies: 10 SEO Lessons LearnedPhilipp Klöckner
 
AngularJS Security: defend your Single Page Application
AngularJS Security: defend your Single Page Application AngularJS Security: defend your Single Page Application
AngularJS Security: defend your Single Page Application Carlo Bonamico
 
Softwarequalität - Architektur
Softwarequalität - ArchitekturSoftwarequalität - Architektur
Softwarequalität - ArchitekturGerrit Beine
 
SEO: SERPs im Wandel - SMX Munich 2017
SEO: SERPs im Wandel - SMX Munich 2017SEO: SERPs im Wandel - SMX Munich 2017
SEO: SERPs im Wandel - SMX Munich 2017Philipp Klöckner
 
Relaunch & SEO: Best Practice, Checklists, Stolpersteine
Relaunch & SEO: Best Practice, Checklists, StolpersteineRelaunch & SEO: Best Practice, Checklists, Stolpersteine
Relaunch & SEO: Best Practice, Checklists, StolpersteinePhilipp Klöckner
 

En vedette (10)

Introduction to Protractor
Introduction to ProtractorIntroduction to Protractor
Introduction to Protractor
 
Protractor: Tips & Tricks
Protractor: Tips & TricksProtractor: Tips & Tricks
Protractor: Tips & Tricks
 
SEO: Crawl Budget Optimierung & Onsite SEO
SEO: Crawl Budget Optimierung & Onsite SEOSEO: Crawl Budget Optimierung & Onsite SEO
SEO: Crawl Budget Optimierung & Onsite SEO
 
Fast Growing Companies: 10 SEO Lessons Learned
Fast Growing Companies: 10 SEO Lessons LearnedFast Growing Companies: 10 SEO Lessons Learned
Fast Growing Companies: 10 SEO Lessons Learned
 
AngularJS Security: defend your Single Page Application
AngularJS Security: defend your Single Page Application AngularJS Security: defend your Single Page Application
AngularJS Security: defend your Single Page Application
 
Softwarequalität - Architektur
Softwarequalität - ArchitekturSoftwarequalität - Architektur
Softwarequalität - Architektur
 
SEO: SERPs im Wandel - SMX Munich 2017
SEO: SERPs im Wandel - SMX Munich 2017SEO: SERPs im Wandel - SMX Munich 2017
SEO: SERPs im Wandel - SMX Munich 2017
 
scm-Newsletter 4/2013
scm-Newsletter 4/2013scm-Newsletter 4/2013
scm-Newsletter 4/2013
 
Relaunch & SEO: Best Practice, Checklists, Stolpersteine
Relaunch & SEO: Best Practice, Checklists, StolpersteineRelaunch & SEO: Best Practice, Checklists, Stolpersteine
Relaunch & SEO: Best Practice, Checklists, Stolpersteine
 
reveal.js 3.0.0
reveal.js 3.0.0reveal.js 3.0.0
reveal.js 3.0.0
 

Similaire à Große Applikationen mit AngularJS

Slides__Splunk_UserGroup_20220407.pdf
Slides__Splunk_UserGroup_20220407.pdfSlides__Splunk_UserGroup_20220407.pdf
Slides__Splunk_UserGroup_20220407.pdfAlexanderStz1
 
Anforderungsanalyse und UML Grundlagen
Anforderungsanalyse und UML GrundlagenAnforderungsanalyse und UML Grundlagen
Anforderungsanalyse und UML GrundlagenChristian Baranowski
 
WPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF RundumschlagWPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF RundumschlagHendrik Lösch
 
B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009Andreas Schulte
 
Einführung in ASP.NET Core Middlewares
Einführung in ASP.NET Core MiddlewaresEinführung in ASP.NET Core Middlewares
Einführung in ASP.NET Core MiddlewaresMatthias Jauernig
 
Dnug35 ak-dev.071111-cookbook
Dnug35 ak-dev.071111-cookbookDnug35 ak-dev.071111-cookbook
Dnug35 ak-dev.071111-cookbookUlrich Krause
 
C/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersC/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersUlrich Krause
 
Domain Driven Design in Rails
Domain Driven Design in RailsDomain Driven Design in Rails
Domain Driven Design in RailsAngelo Maron
 
Config as Code: Der Weg zu Configuration as Code
Config as Code: Der Weg zu Configuration as CodeConfig as Code: Der Weg zu Configuration as Code
Config as Code: Der Weg zu Configuration as CodeDevOps Meetup Bern
 
Microprofile-Anwendungen mit Quarkus
Microprofile-Anwendungen mit Quarkus Microprofile-Anwendungen mit Quarkus
Microprofile-Anwendungen mit Quarkus gedoplan
 
Angular 2 Workshop November 2015 von der w-jax 2015
Angular 2 Workshop November 2015 von der w-jax 2015Angular 2 Workshop November 2015 von der w-jax 2015
Angular 2 Workshop November 2015 von der w-jax 2015Manfred Steyer
 
Angular 2 Workshop Oktober 2015
Angular 2 Workshop Oktober 2015Angular 2 Workshop Oktober 2015
Angular 2 Workshop Oktober 2015Manfred Steyer
 
EnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heuteEnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heutePhilipp Burgmer
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101gueste4be40
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 

Similaire à Große Applikationen mit AngularJS (20)

MVVM mit WPF
MVVM mit WPFMVVM mit WPF
MVVM mit WPF
 
Slides__Splunk_UserGroup_20220407.pdf
Slides__Splunk_UserGroup_20220407.pdfSlides__Splunk_UserGroup_20220407.pdf
Slides__Splunk_UserGroup_20220407.pdf
 
Feature Flags mit Togglz
Feature Flags mit TogglzFeature Flags mit Togglz
Feature Flags mit Togglz
 
Anforderungsanalyse und UML Grundlagen
Anforderungsanalyse und UML GrundlagenAnforderungsanalyse und UML Grundlagen
Anforderungsanalyse und UML Grundlagen
 
WPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF RundumschlagWPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF Rundumschlag
 
B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009B1 Acocon Lotus Day 08.09.2009
B1 Acocon Lotus Day 08.09.2009
 
Einführung in ASP.NET Core Middlewares
Einführung in ASP.NET Core MiddlewaresEinführung in ASP.NET Core Middlewares
Einführung in ASP.NET Core Middlewares
 
Dnug35 ak-dev.071111-cookbook
Dnug35 ak-dev.071111-cookbookDnug35 ak-dev.071111-cookbook
Dnug35 ak-dev.071111-cookbook
 
C/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino DevelopersC/ C++ for Notes & Domino Developers
C/ C++ for Notes & Domino Developers
 
Domain Driven Design in Rails
Domain Driven Design in RailsDomain Driven Design in Rails
Domain Driven Design in Rails
 
Config as Code: Der Weg zu Configuration as Code
Config as Code: Der Weg zu Configuration as CodeConfig as Code: Der Weg zu Configuration as Code
Config as Code: Der Weg zu Configuration as Code
 
Microprofile-Anwendungen mit Quarkus
Microprofile-Anwendungen mit Quarkus Microprofile-Anwendungen mit Quarkus
Microprofile-Anwendungen mit Quarkus
 
Automatisierung mit grunt
Automatisierung mit gruntAutomatisierung mit grunt
Automatisierung mit grunt
 
Schnelleinstieg in Angular
Schnelleinstieg in AngularSchnelleinstieg in Angular
Schnelleinstieg in Angular
 
Angular 2 Workshop November 2015 von der w-jax 2015
Angular 2 Workshop November 2015 von der w-jax 2015Angular 2 Workshop November 2015 von der w-jax 2015
Angular 2 Workshop November 2015 von der w-jax 2015
 
Angular 2 Workshop Oktober 2015
Angular 2 Workshop Oktober 2015Angular 2 Workshop Oktober 2015
Angular 2 Workshop Oktober 2015
 
EnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heuteEnterJS 2015 - JavaScript von Morgen schon heute
EnterJS 2015 - JavaScript von Morgen schon heute
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101
 
GWT – Google Web Toolkit in der Praxis
GWT – Google Web Toolkit in der PraxisGWT – Google Web Toolkit in der Praxis
GWT – Google Web Toolkit in der Praxis
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 

Plus de Sebastian Springer

Creating Enterprise Web Applications with Node.js
Creating Enterprise Web Applications with Node.jsCreating Enterprise Web Applications with Node.js
Creating Enterprise Web Applications with Node.jsSebastian Springer
 
Divide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.jsDivide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.jsSebastian Springer
 
From Zero to Hero – Web Performance
From Zero to Hero – Web PerformanceFrom Zero to Hero – Web Performance
From Zero to Hero – Web PerformanceSebastian Springer
 
ECMAScript 6 im Produktivbetrieb
ECMAScript 6 im ProduktivbetriebECMAScript 6 im Produktivbetrieb
ECMAScript 6 im ProduktivbetriebSebastian Springer
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptSebastian Springer
 
Warum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtWarum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtSebastian Springer
 
10 Dinge die ich an dir hasse - Stolpersteine in der Webentwicklung
10 Dinge die ich an dir hasse - Stolpersteine in der Webentwicklung10 Dinge die ich an dir hasse - Stolpersteine in der Webentwicklung
10 Dinge die ich an dir hasse - Stolpersteine in der WebentwicklungSebastian Springer
 

Plus de Sebastian Springer (20)

Creating Enterprise Web Applications with Node.js
Creating Enterprise Web Applications with Node.jsCreating Enterprise Web Applications with Node.js
Creating Enterprise Web Applications with Node.js
 
Divide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.jsDivide and Conquer – Microservices with Node.js
Divide and Conquer – Microservices with Node.js
 
From Zero to Hero – Web Performance
From Zero to Hero – Web PerformanceFrom Zero to Hero – Web Performance
From Zero to Hero – Web Performance
 
A/B Testing mit Node.js
A/B Testing mit Node.jsA/B Testing mit Node.js
A/B Testing mit Node.js
 
Angular2
Angular2Angular2
Angular2
 
ECMAScript 6 im Produktivbetrieb
ECMAScript 6 im ProduktivbetriebECMAScript 6 im Produktivbetrieb
ECMAScript 6 im Produktivbetrieb
 
Streams in Node.js
Streams in Node.jsStreams in Node.js
Streams in Node.js
 
Node.js Security
Node.js SecurityNode.js Security
Node.js Security
 
Typescript
TypescriptTypescript
Typescript
 
Best Practices für TDD in JavaScript
Best Practices für TDD in JavaScriptBest Practices für TDD in JavaScript
Best Practices für TDD in JavaScript
 
Warum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtWarum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser macht
 
Lean Startup mit JavaScript
Lean Startup mit JavaScriptLean Startup mit JavaScript
Lean Startup mit JavaScript
 
Webapplikationen mit Node.js
Webapplikationen mit Node.jsWebapplikationen mit Node.js
Webapplikationen mit Node.js
 
Node.js für Webapplikationen
Node.js für WebapplikationenNode.js für Webapplikationen
Node.js für Webapplikationen
 
Debugging und Profiling
Debugging und ProfilingDebugging und Profiling
Debugging und Profiling
 
Node.js
Node.jsNode.js
Node.js
 
JavaScript Architektur
JavaScript ArchitekturJavaScript Architektur
JavaScript Architektur
 
Angular translate
Angular translateAngular translate
Angular translate
 
10 Dinge die ich an dir hasse - Stolpersteine in der Webentwicklung
10 Dinge die ich an dir hasse - Stolpersteine in der Webentwicklung10 Dinge die ich an dir hasse - Stolpersteine in der Webentwicklung
10 Dinge die ich an dir hasse - Stolpersteine in der Webentwicklung
 
Error handling in JavaScript
Error handling in JavaScriptError handling in JavaScript
Error handling in JavaScript
 

Große Applikationen mit AngularJS