Front Ends for Back End Developers - Spring I/O 2017

105
@spring_io #springio17 Front End Development for Back End Developers Matt Raible @mraible

Transcript of Front Ends for Back End Developers - Spring I/O 2017

Page 1: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Front End Development for Back End Developers

Matt Raible @mraible

Page 2: Front Ends for Back End Developers - Spring I/O 2017

Blogger on raibledesigns.com

Web Developer and Java Champion

Father, Skier, Mountain Biker, Whitewater Rafter

Open Source Connoisseur

Who is Matt Raible?

Bus LoverOkta Developer Advocate

Page 3: Front Ends for Back End Developers - Spring I/O 2017
Page 4: Front Ends for Back End Developers - Spring I/O 2017
Page 6: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

What about You?How many consider themselves backend developers?

Java, .NET, Python, or Node.js?

Do you write code for UIs?

Do you like JavaScript?

What JavaScript Frameworks do you use?

Page 7: Front Ends for Back End Developers - Spring I/O 2017

My Web Dev Journey

Page 8: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

What is modern front end development?

Page 9: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Web Frameworks Over the Years

https://github.com/mraible/history-of-web-frameworks-timeline

Page 11: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

JavaScript Framework Explosion

Page 12: Front Ends for Back End Developers - Spring I/O 2017
Page 13: Front Ends for Back End Developers - Spring I/O 2017
Page 14: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Let’s do some learning!

Page 15: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

ES6, ES7 and TypeScript

ES5: es5.github.io

ES6: git.io/es6features

ES7: bit.ly/es7features

TS: www.typescriptlang.org TSES7 ES6 ES5

Page 16: Front Ends for Back End Developers - Spring I/O 2017
Page 17: Front Ends for Back End Developers - Spring I/O 2017
Page 18: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

TypeScript$ npm install -g typescript

function greeter(person: string) { return "Hello, " + person;} var user = "Jane User"; document.body.innerHTML = greeter(user);

$ tsc greeter.ts

https://www.typescriptlang.org/docs/tutorial.html

Page 20: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

TypeScript 2.3

Page 21: Front Ends for Back End Developers - Spring I/O 2017

“Node.js is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient. Node.js' package ecosystem, npm, is the largest ecosystem of open source libraries in the world.”

https://nodejs.org

https://github.com/creationix/nvm

Page 22: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Front End Build ToolsOld School: Gulp

New School: SystemJS

Hip: Webpack

Web Dependencies:

Old School: Bower

New School: npm

Hip: yarn

Page 23: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Yeoman

The web's scaffolding tool for modern webapps

Helps you kickstart new projects

Promotes the Yeoman workflow

yeoman.io

Page 25: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Gulp

gulp.task('serve', function() {

browserSync.init({ server: './app' });

gulp.watch(['app/**/*.js', 'app/**/*.css', 'app/**/*.html']) .on('change', browserSync.reload); });

Page 27: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

webpack.config.js

module.exports = { entry: './src/app.js', output: { path: __dirname + '/src/main/webapp/public', filename: 'bundle.js' }, module: { loaders: [ { test: /.js$/, loader: 'babel', exclude: /node_modules/, query: { presets: ['es2015', 'react'] } } ] } };

Page 29: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

webpack for real tasks

Building front-end and adding compilation

Decreasing front-end size and improving assets caching

Speeding up build and improving the development workflow

iamakulov.com/pages/webpack

Page 30: Front Ends for Back End Developers - Spring I/O 2017

https://xkcd.com/303/

Page 31: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17@spring_io

#springio17

Leading JavaScript Frameworks in 2017

angular.io

facebook.github.io/react

vuejs.org

Page 32: Front Ends for Back End Developers - Spring I/O 2017
Page 33: Front Ends for Back End Developers - Spring I/O 2017
Page 34: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17@spring_io

#springio17

Jobs on IndeedMay 2017

0

2,000

4,000

6,000

8,000

Angular Aurelia Backbone Ember Knockout React Vue

Page 35: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17@spring_io

#springio17

Stack Overflow Tags

May 2017

0

12,500

25,000

37,500

50,000

Angular Aurelia Backbone Knockout Ember React Vue

Page 36: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Stack Overflow Trends

https://stackoverflow.blog/2017/05/09/introducing-stack-overflow-trends

Page 37: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17@spring_io

#springio17

GitHub StarsMay 2017

0

17,500

35,000

52,500

70,000

Angular Aurelia Backbone Knockout Ember React Vue

Page 38: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Hello World with Angular

import { Component } from '@angular/core';

@Component({ selector: 'my-app', template: `<h1>Hello {{name}}</h1>` }) export class AppComponent { name = 'World'; }

<my-app></my-app>

https://angular.io/docs/ts/latest/quickstart.html

Page 39: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Hello World with Angularimport { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { FormsModule } from '@angular/forms'; import { HttpModule } from '@angular/http';

import { AppComponent } from './app.component';

@NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, FormsModule, HttpModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }

Page 40: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Hello World with Angular

import { enableProdMode } from '@angular/core'; import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';

import { AppModule } from './app/app.module'; import { environment } from './environments/environment';

if (environment.production) { enableProdMode(); }

platformBrowserDynamic().bootstrapModule(AppModule);

Page 41: Front Ends for Back End Developers - Spring I/O 2017
Page 44: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Get Started with Angular

Angular QuickStart

https://angular.io/docs/ts/latest/quickstart.html

Angular Seed

https://github.com/mgechev/angular-seed

Angular Seed Advanced

https://github.com/NathanWalker/angular-seed-advanced

Page 45: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Angular and Angular CLI Demos

https://github.com/mraible/ng-demo

https://youtu.be/Jq3szz2KOOs (Building)

https://youtu.be/TksyjxipM4M (Testing)

Page 46: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Authentication with OpenID Connect

http://developer.okta.com

http://bit.ly/ng-okta

youtube.com/watch?v=Kb56GzQ2pSk

Page 47: Front Ends for Back End Developers - Spring I/O 2017
Page 48: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

ng-book 2A comprehensive guide to developing with Angular 4

Worth all your hard earned $$$

https://www.ng-book.com/2

“Thank you for the awesome book, it's the bible for Angular.” — Vijay Ganta

Page 49: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Hello World with React

http://codepen.io/gaearon/pen/ZpvBNJ?editors=0100

<div id="root"></div>

<script> ReactDOM.render( <h1>Hello, world!</h1>, document.getElementById('root') ); </script>

Page 50: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Learning React

https://vimeo.com/213710634

Page 51: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Imperative Codeif (count > 99) { if (!hasFile()) { addFire(); } } else { if (hasFire()) { removeFire(); } } if (count === 0) { if (hasBadge()) { removeBadge(); } return; } if (!hasBadge()) { addBadge(); } var countText = count > 99 ? "99+" : count.toString(); getBadge().setText(countText);

Page 52: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Declarative Codeif (count === 0) { return <div className="bell"/>; } else if (count <= 99) { return ( <div className="bell"> <span className="badge">{count}</span> </div> ); } else { return ( <div className="bell onFire"> <span className="badge">99+</span> </div> ); }

Page 53: Front Ends for Back End Developers - Spring I/O 2017
Page 54: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Create React App

Page 55: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Create React App

Page 57: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Hello World with Vue.js

https://jsfiddle.net/chrisvfritz/50wL7mdz/

<div id="app"> <p>{{ message }}</p> </div>

<script> new Vue({ el: '#app', data: { message: 'Hello Vue.js!' } }); </script>

Page 59: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Vue.js Code

<script src="https://unpkg.com/vue/dist/vue.js"></script>

<div id="app"> <button v-on:click="clickedButton()">Click here!</button> </div>

<script> new Vue({ el: '#app', methods: { clickedButton: function(event) { console.log(event); alert("You clicked the button!"); } } }); </script>

Page 60: Front Ends for Back End Developers - Spring I/O 2017
Page 63: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17@spring_io

#springio17

Server-Side Support

Angular Universal merged into Angular 4

mobile.twitter.com

Nuxt.js

Page 64: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17@spring_io

#springio17

Server-Side Java Support

Page 67: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Cascading Style Sheets

#app { background: #eee; }

.blog-post { padding: 20px; }

.blog-post > p:first { font-weight: 400; }

img + span.caption { font-style: italic; }

Page 68: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Sass: Syntactically Awesome Style Sheets

#app { background: #eee;

.blog-post { padding: 20px; > p:first { font-weight: 400; }

img + span.caption { font-style: italic; } } } http://sass-lang.com

Page 69: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17@spring_io

#springio17

CSS Frameworks

Page 72: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17@spring_io

#springio17

CSS Framework Stars on GitHub

May 2017

0

30,000

60,000

90,000

120,000

Bootstrap Foundation Pure Skeleton

Page 73: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Front End Performance Optimization

Reduce HTTP Requests

Gzip HTML, JavaScript, and CSS

Far Future Expires Headers

Code Minification

Optimize Images

Page 74: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

HTTP/2Binary, instead of textual

Fully multiplexed, instead of ordered and blocking

Can use one connection for parallelism

Uses header compression to reduce overhead

Allows servers to “push” responses proactively into client caches

Page 75: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

HTTP/2 in JHipster

/* * Enable HTTP/2 for Undertow - https://twitter.com/ankinson/status/829256167700492288 * HTTP/2 requires HTTPS, so HTTP requests will fallback to HTTP/1.1. * See the JHipsterProperties class and your application-*.yml configuration files * for more information. */ if (jHipsterProperties.getHttp().getVersion().equals(JHipsterProperties.Http.Version.V_2_0)) { if (container instanceof UndertowEmbeddedServletContainerFactory) { ((UndertowEmbeddedServletContainerFactory) container) .addBuilderCustomizers((builder) -> { builder.setServerOption(UndertowOptions.ENABLE_HTTP2, true); }); } }

Page 76: Front Ends for Back End Developers - Spring I/O 2017
Page 77: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

HTTP/2 Server Push in Java

http://bit.ly/dz-server-push-java

@WebServlet(value = {"/http2"}) public class Http2Servlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) { PushBuilder pushBuilder = req.newPushBuilder(); pushBuilder.path("images/kodedu-logo.png") .addHeader("content-type", "image/png") .push(); try (PrintWriter respWriter = resp.getWriter();) { respWriter.write("<html>" + "<img src='images/kodedu-logo.png'>" + "</html>"); } } }

Page 78: Front Ends for Back End Developers - Spring I/O 2017

https://twitter.com/kosamari/status/859958929484337152

Page 79: Front Ends for Back End Developers - Spring I/O 2017
Page 80: Front Ends for Back End Developers - Spring I/O 2017
Page 81: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Chrome Developer Tools

Follow Umar Hansa - @umaar

Follow Addy Osmani - @addyosmani

Page 82: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Framework Tools

Angular Augury

React Developer Tools

vue-devtools

Page 83: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17@spring_io

#springio17

Progressive Web Apps

Page 84: Front Ends for Back End Developers - Spring I/O 2017
Page 85: Front Ends for Back End Developers - Spring I/O 2017

“We’ve failed on mobile”

— Alex Russellhttps://youtu.be/K1SFnrf4jZo

Page 86: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Mobile Hates You!How to fight back:

Implement PRPL

Get a ~$150-200 unlocked Android (e.g. Moto G4)

Use chrome://inspect && chrome://inspect?tracing

Lighthouse

DevTools Network & CPU Throttling

Page 87: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

The PRPL Pattern

Push

Render

Pre-cache

Lazy-load

Page 88: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

The PRPL Pattern

Push critical resources for the initial URL route

Render initial route

Pre-cache remaining routes

Lazy-load and create remaining routes on demand

Page 89: Front Ends for Back End Developers - Spring I/O 2017

developer.okta.com/blog

Page 90: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17@spring_io

#springio17

Security: OWASP Top 10

1. Injection

2. Broken Auth & Session Mgmt

3. Cross-Site Scripting (XSS)

4. Broken Access Control

5. Security Misconfiguration

6. Sensitive Data Exposure

7. Insufficient Attack Protection

8. Cross-Site Request Forgery

9. Components w/ Vulnerabilities

10. Underprotected APIs

Page 92: Front Ends for Back End Developers - Spring I/O 2017
Page 93: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

The JHipster Mini-Book2.0 Release on Dec 5, 2016

jhipster-book.com

21-points.com

@jhipster_book

Write your own InfoQ mini-book! github.com/mraible/infoq-mini-book

Page 94: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

What You Learned

ES6 and TypeScript

Node.js and nvm

Angular, React, and Vue.js

CSS and Sass

Front End Performance Optimization

Progressive Web Apps

Page 97: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Quality“A person who knows how to fix motorcycles—with Quality—is less likely to run short of friends than one who doesn't. And they aren't going to see him as some kind of object either. Quality destroys objectivity every time.”

— Zen and the Art of Motorcycle Maintenance

Page 98: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Software Testing

With motorcycles, you drive to test them.

With software, you can test it without driving it.

Or rather, you can automate the driving.

If you don’t automate tests, you’re still testing!

Page 102: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Action!Don’t be afraid to try new things

Learn JavaScript

Try one of these frameworks

Form your own opinions

Or just wait a few months…

Page 103: Front Ends for Back End Developers - Spring I/O 2017
Page 104: Front Ends for Back End Developers - Spring I/O 2017

developer.okta.com/blog

Page 105: Front Ends for Back End Developers - Spring I/O 2017

@spring_io #springio17

Questions?Keep in touch!

raibledesigns.com

@mraible

Presentations

speakerdeck.com/mraible

Code

github.com/mraible