Webprojekte Mit Angularjs Und Jhipster Lessons Learned

Webprojekte Mit Angularjs Und Jhipster Lessons Learned

Webprojekte mit AngularJS und JHipster Lessons learned Michel Mathis mp technology AG November 2015 Über mp technology • mp technology AG, Zürich – www.mptechnology.ch • Individual-Software für Intranet und Internet und Mobile seit 2003 • Wir begleiten von Projekte von der Idee zum Erfolg • Beratung, Analyse, Konzept, Architektur, Implementierung, Wartung • Auszug Kundenliste • Kontakt: Patrick Pfister, [email protected] , +41 44 296 67 01 (c) mp technology AG | Herbst 2015 | Seite 2 Über mich • Senior Software Engineer @ mp technology AG, Zürich • Web- and Mobile- Software Entwicklung • www.mptechnology.ch • Meine Schwerpunkte: Java/AngularJS • Java SW Engineer • Datenbanken iOS Mobile SW Engineer • Angular JS [email protected] (c) mp technology AG | Herbst 2015 | Seite 3 Agenda • Vorstellung des konkreten Projekts • JHipster • Der Server • Der Client • AngularJS: Knackpunkte • Client-side Build • Tuningmöglichkeiten • Security • Lessons learned (c) mp technology AG | Herbst 2015 | Seite 4 Projekt • www.insightbee.com • Zwei Teile • e-Commerce system (Mobile und Desktop) • Backend • Start: 30. April 2014 (erster Commit) • Bis zu acht Entwickler gleichzeitig • 10238 Commits (Anfang Oktober) • 61853 Java LOC • 34758 Javascript LOC (c) mp technology AG | Herbst 2015 | Seite 5 (c) mp technology AG | Herbst 2015 | Seite 6 (c) mp technology AG | Herbst 2015 | Seite 7 (c) mp technology AG | Herbst 2015 | Seite 8 (c) mp technology AG | Herbst 2015 | Seite 9 (c) mp technology AG | Herbst 2015 | Seite 10 (c) mp technology AG | Herbst 2015 | Seite 11 (c) mp technology AG | Herbst 2015 | Seite 12 (c) mp technology AG | Herbst 2015 | Seite 13 Mobile clients • Durchgängige Verwendung von Responsive Design • Dasselbe HTML/CSS für alle Clients • Zusammenarbeit mit Design-Firma • Übername von HTML-Design: Aufwände bei der Integration von Javascript • Mehrere unterstützte Plattformen: Testing ist aufwändiger • Javascript Performance im Auge behalten (c) mp technology AG | Herbst 2015 | Seite 14 Grüne Wiese für e-Commerce-Projekt • Anforderungen • Modernes Aussehen • Einfache, benutzerfreundliche Bedienung • Effiziente Entwicklung • Überlegungen • Server-side templating oft ein “Murks”, wenn es dynamischer werden soll • Komponentenframework wie Vaadin? Schwierig wegen Design. • JavaScript: Erfahrungen vorhanden mit Backbone-basiertem Projekt • AngularJS? • JHipster: Modernes Java kombiniert mit state of the art Client- Technologie: let’s give it a try! (c) mp technology AG | Herbst 2015 | Seite 15 JHipster (c) mp technology AG | Herbst 2015 | Seite 16 JHipster • Yeoman-Generator, mit dem ein Projekt basierend auf Spring Boot und AngularJS erstellt und erweitert werden kann (ähnlich Ruby on Rails) • Durchgängige Build-Pipeline • Vereint eine Menge von bewährten Konzepten: Twitter Bootstrap, AngularJS, Sass, Bower, Grunt, Karma, Spring Boot, Maven, Spring Security, … • Generatoren zum Erstellen von Controllern, Entities, Services • Datenbank-Support (c) mp technology AG | Herbst 2015 | Seite 17 Der Server (c) mp technology AG | Herbst 2015 | Seite 18 Die Serverseite • Java 8/Maven • Spring Boot: Convention over Configuration • Konfiguration in Java-Klassen • Embedded Servlet Container • Schnittstelle zum Client via REST/JSON • Spring gehört zum Standard-Setup bei uns (c) mp technology AG | Herbst 2015 | Seite 19 Datenbank-Support • Anpassen des Datenbankschemas mit Liquibase • Standalone-Tool, kann in Java integriert werden • Datenbank-unabhängige DDL-Beschreibung in XML • Automatische Tabellen-Generierung aus annotierten Java-Modellen (abhängig von Datenbank-Produkt) (c) mp technology AG | Herbst 2015 | Seite 20 Der Client (c) mp technology AG | Herbst 2015 | Seite 21 AngularJS • Startpunkt: JHipster-App • Grundstruktur ist relativ übersichtlich: Controller, Services, Views • Two-way binding zwischen Model und View • Aber: viel unbekanntes Terrain für Java-Entwickler (c) mp technology AG | Herbst 2015 | Seite 22 AngularJS (c) mp technology AG | Herbst 2015 | Seite 23 Knackpunkt: Umgebung kennen lernen • Ordner, Dateien, Strukturen: Beeinflussen Entwicklung, Build und Testing. Include- Reihenfolge kann entscheidend sein (Angular- Module)! • Neue Tools, mit denen man vertraut werden muss: • Node/Grunt für Client-Side build • Bower für dependency management • Karma/Jasmine für Client (Unit-) Tests (c) mp technology AG | Herbst 2015 | Seite 24 Knackpunkt: Umgebung kennen lernen • Ordner, Dateien, Strukturen: Beeinflussen Entwicklung, Build und Testing. Include- Reihenfolge kann entscheidend sein (Angular- Module)! • Neue Tools, mit denen man vertraut werden muss: • Node/Grunt für Client-Side build • Bower für dependency management • Karma/Jasmine für Client (Unit-) Tests (c) mp technology AG | Herbst 2015 | Seite 25 Knackpunkt: Umgebung kennen lernen • Ordner, Dateien, Strukturen: Beeinflussen Entwicklung, Build und Testing. Include- Reihenfolge kann entscheidend sein (Angular- Module)! • Neue Tools, mit denen man vertraut werden muss: • Node/Grunt für Client-Side build • Bower für dependency management • Karma/Jasmine für Client (Unit-) Tests (c) mp technology AG | Herbst 2015 | Seite 26 Knackpunkt: Angular Views • Gewöhnungsbedürftige Syntax • Nested Scopes: • Scopes sind nicht direkt sichtbar • Vorsicht bei Zuweisungen von primitiven Werten (the dot rule) • Template-Syntax nicht HTML5-konform • Prerender.io für SEO-Support • Template-Markup kann unter Umständen sichtbar werden (bei Fehlern, ngCloak hilft beim Initialisieren) (c) mp technology AG | Herbst 2015 | Seite 27 <tr ng-repeat="orderItem in filteredOrderItems(filters.status, filters.searchString)" ng-class="{pending: orderItem.orderItemStatus === 'ORDERED', notRead: isNotReadKnackpunkt:(orderItem)}"> Angular Views <td><span class="nr"></span></td> <td class="name" > <a ng-show="orderItem.orderItemStatus === 'PUBLISHED' && orderItem.deliverReports == true•" Gewöhnungsbedürftige Syntax href="/mydownloads/{{orderItem.id}}">{{orderItem.title}}</a> •<a classNested="deliveryNotes Scopes:" ng-show="orderItem.orderItemStatus === 'PUBLISHED' && orderItem.deliverReports == false" ng-•clicknormalerweise="showDeliveryNotesnicht(orderItemdirekt)" hrefsichtbar>{{orderItem.title}}</a> <span• ngVorsicht-show="orderItem.orderItemStatusbei ng-repeat und!== Zuweisungen'PUBLISHED'">{{orderItem.titlevon primitiven}}</span> <label ng-if="orderItem.title != orderItem.name" class=Werten"glyphicon(theglyphicon dot- inforule)-sign" isb-tooltip data-isb-tooltip-title="Full Title/Name" data-isb-tooltip-description="{{orderItem.name}}"> </label> </•td>Template-Syntax nicht HTML-konform <td class="ordered_by" ng-if="filters.includeCorporateOrders"> •<divTemplateclass="circle--avatarMarkupfilled "kann> unter Umständen sichtbar <span class="initials">{{orderItem.order.account.user.initials}}</span> <span class="labelwerden-wrap"><span(bei Fehlern, ngCloak hilft) class="name"> {{orderItem.order.account.user.firstName}} {{orderItem.order.account.user.lastName}}</span></span> </div> </td> </tr> (c) mp technology AG | Herbst 2015 | Seite 28 Knackpunkt: Asynchronität • Beispiel: Anzeigen einer Liste • Router definiert Controller und View • Controller-Code wird ausgeführt und Template geladen und angezeigt • Laden der Daten im Controller, Template wird befüllt, sobald Daten verfügbar • Alternative: Template erst anzeigen wenn Daten geladen. Aber: User-Feedback nicht vergessen! • Promise-API ist ein must! (c) mp technology AG | Herbst 2015 | Seite 29 $routeProvider.when('/users', { templateUrl: 'views/user/list.html', Knackpunkt: Asynchronitätcontroller: 'userListcontroller' }); angular.controller('userListController', function(userResource) { • Beispiel: Anzeigen$scope.userseiner= userResource.queryListe ({sort: 'asc'}); • Router definiert}); Controller und View <table> • Controller-Code<thead wird> ausgeführt und Template geladen und angezeigt <tr> <th>Name</th> • Laden der Daten<thim>ActionsController,</th> Template wird befüllt, sobald Daten verfügbar</tr> </thead> <tbody> • Alternative: Template<tr ng-repeat erst="useranzeigenin users"> wenn Daten geladen. Aber: User<td>{{user.name}}-Feedback</td nicht> vergessen! <td><a href="#/users/{{user.id}}/edit">Edit</a></td> • Promise-API ist</eintr> must! </tbody> </table> (c) mp technology AG | Herbst 2015 | Seite 30 Knackpunkt: Asynchronität • Beispiel: Anzeigen einer Liste • Router definiert Controller und View • Controller-Code wird ausgeführt und Template geladen und angezeigt • Laden der Daten im Controller, Template wird befüllt, sobald Daten verfügbar • Alternative: Template erst anzeigen wenn Daten geladen. Aber: User-Feedback nicht vergessen! • Promise-API ist ein must! (c) mp technology AG | Herbst 2015 | Seite 31 Knackpunkt: viele Alternativen • Beispiele in der Dokumentation sind oft trivial • Hinweise zu best practices fehlen manchmal: z.B. controller as • Javascript ist eine sehr flexible Sprache UND AngularJS bietet manchmal Alternativen: z.B. Dependency Injection • Angular Style Guide: https://github.com/johnpapa/angular-styleguide (c) mp technology AG | Herbst 2015 | Seite 32 Knackpunkt: viele Alternativen • Beispiel aus dem Style Guide: /* avoid */ /* recommended */ function dataService() { function dataService() { var someValue = ''; var someValue = ''; function save() { var service = { /* */ save: save, }; someValue: someValue, function validate() { validate: validate /* */ }; }; return service; return { //////////// save: save, someValue: someValue, function save() { validate: validate /* */ }; }; } function validate() { /* */ }; } (c)

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    46 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us