ReactJS maakt het web eenvoudig

37
ReactJS maakt het web eenvoudig Rick Beerendonk twitter.com/rickbeerendonk

description

Voor het maken van single page web applications lijkt MVC met databinding de standaard. Daarmee zijn fouten lastig te achterhalen. Facebook ondervond dat ook en koos voor een functionele aanpak: ReactJS. Deze sessie geeft een introductie, gaat dieper in op ogenschijnlijke snelheid nadelen en laat zien hoe je herbruikbare React componenten bouwt. Tevens zal ASP.NET MVC gebruikt worden voor server side rendering van de initiële state, ideaal voor search engines die meestal een probleem hebben met single page apps. Na deze sessie zul je nooit meer hetzelfde denken over web UI’s.

Transcript of ReactJS maakt het web eenvoudig

Page 1: ReactJS maakt het web eenvoudig

ReactJS maakt het web eenvoudig

Rick Beerendonktwitter.com/rickbeerendonk

Page 2: ReactJS maakt het web eenvoudig

Wat is React?

Page 3: ReactJS maakt het web eenvoudig

Made by Facebook Used by Facebook

IE8 en hoger Alle recente mobile browsers Fork op Github voor IE6 + IE7

Open source op GitHub:http://facebook.github.io/react/

ReactJS.NET, open source op Github:http://reactjs.net/

Wat is React?

Page 4: ReactJS maakt het web eenvoudig

Tart “best practices”

Wat is React?

Page 5: ReactJS maakt het web eenvoudig

Wat wordt nu gebruikt? Welke problemen ervaar je?

Why React?

Page 6: ReactJS maakt het web eenvoudig

Synchroniseren van state is moeilijk=> Daarom Databinding=> Kettingreactie van callbacks

Kleine wijziging kan leiden tot ongekend grote reactieWat doet dat met performance?

Update DOM is moeilijk Debuggen

• Waar plaats ik breakpoint?• Vooruit, niet achteruit• Regel voor regel

Problemen

Page 7: ReactJS maakt het web eenvoudig

“Our intellectual powers are rather geared to master static relations and our powers to visualize processes evolving in time are relatively poorly developed.

For that reason we should do (as wise programmers aware of our limitations) our utmost to shorten the conceptual gap between the static program and the dynamic process, to make the correspondence between the program (spread out in tekst space) and the process (spread out in time) as trivial as possible”

Edsger Dijkstra

Page 8: ReactJS maakt het web eenvoudig

Herbouwen i.p.v. update Immutable i.p.v. Mutable

• Flow in één richting i.p.v. twee richtingen

Debuggen• Minimum aantal wijzigingslocaties (waar plaats ik breakpoint?)• Van wijziging naar wijziging i.p.v. van regel naar regel

Oplossingen

Page 9: ReactJS maakt het web eenvoudig

20e eeuw: Oude server situatie eenvoudig: Gooi oude pagina weg en genereer steeds een nieuw pagina.

2004: HTML = Composed string 2007: HTML = Composed string with XSS protection 2010: Reduce server callbacks by having more Javascript

(databinding/MVC/etc.) 2013: React

Ontstaan React

Page 10: ReactJS maakt het web eenvoudig

Traditioneel:

DOM

App DOM

builds/modifies

events

Page 11: ReactJS maakt het web eenvoudig

Weggooien en herbouwen DOM: Verlies input focus + cursor positie Verlies tekst selectie Verlies scroll positie Verlies IFrame state

DOM

Page 12: ReactJS maakt het web eenvoudig

React:

Virtual DOM

App Virtual DOM

builds/modifies

events

DOM

builds/modifies

events

Page 13: ReactJS maakt het web eenvoudig

Doom3

Page 14: ReactJS maakt het web eenvoudig

Doom3

Page 15: ReactJS maakt het web eenvoudig

Doom3 React

Page 16: ReactJS maakt het web eenvoudig

React:

Virtual DOM

AppNew

Virtual DOM

builds

events

DOM

modifies

events

OldVirtual DOM

Queue Differences

Page 17: ReactJS maakt het web eenvoudig

Minimale verschillen Snelst mogelijke wijzigingen Minimale garbage collection Alleen schrijven naar de browser DOM Events alleen gekoppeld aan browser DOM root.

Smart Virtual DOM

Page 19: ReactJS maakt het web eenvoudig

Lijkt op XAML in WPF Prettig voor designers Compileert in JavaScript

• Online:http://facebook.github.io/react/jsx-compiler.html

• Offline:https://github.com/rickbeerendonk/react-om-examples/tree/master/Extra%2003.%20JSX%20Compiler

Te genereren vanuit HTML• Online:

http://facebook.github.io/react/html-jsx.html• Offline:

https://github.com/reactjs/react-magic/blob/master/README-htmltojsx.md

JSX

Page 20: ReactJS maakt het web eenvoudig

HTML in Javascript? Ben je gek!?!?!?!

Separation of concerns

Page 23: ReactJS maakt het web eenvoudig

23

Synthetisch, cross-browser wrapper om het browser event Identiek over alle browsers Zelfde als browser event, incl. capturing/bubbling fases. Extra event property: nativeEvent

Events

Page 24: ReactJS maakt het web eenvoudig

24

Clipboard events• onCopy onCut onPaste

Keyboard events• onKeyDown onKeyPress onKeyUp

Focus events• onFocus onBlur

Form events• onChange onInput onSubmit

Mouse events• onClick onDoubleClick onDrag onDragEnd onDragEnter onDragExit

onDragLeave onDragOver onDragStart onDrop onMouseDown onMouseEnter onMouseLeave onMouseMove onMouseOut onMouseOver onMouseUp

Ondersteunde events (1)

Page 25: ReactJS maakt het web eenvoudig

25

Touch events• onTouchCancel onTouchEnd onTouchMove onTouchStart

UI events• onScroll

Wheel events• onWheel

Ondersteunde events (2))

Page 28: ReactJS maakt het web eenvoudig

Mutable Maar alleen te wijzigen door setState() en replaceState().

Demo:https://github.com/rickbeerendonk/react-om-examples/tree/master/05.%20State

State

Page 32: ReactJS maakt het web eenvoudig

React:

Virtual DOM Server

App Virtual DOMbuilds/modifies

<HTML>builds/modifies

Page 33: ReactJS maakt het web eenvoudig

Wie gebruiken React?

Page 34: ReactJS maakt het web eenvoudig

React component search engine (npm): http://react-components.com/

React-router: https://github.com/rackt/react-router

React-bootstrap: http://react-bootstrap.github.io/

Handige links

Page 35: ReactJS maakt het web eenvoudig

“Flux is the application architecture that Facebook uses for building client-side web applications. It complements React's composable view components by utilizing a unidirectional data flow.”

https://facebook.github.io/flux/

Flux

Page 36: ReactJS maakt het web eenvoudig

Om:https://github.com/swannodette/om

Undo/Redo:http://swannodette.github.io/2013/12/31/time-travel/

Goya (app):http://jackschaedler.github.io/goya/

Om: Undo/Redo