patterns for react application design

83
PATTERNS FOR REACT APPLICATION DESIGN Leeds JS March 29 th 2017

Upload: ian-thomas

Post on 05-Apr-2017

185 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Patterns For React Application Design

PATTERNS FOR REACT APPLICATION DESIGN

Leeds JS March 29th 2017

Page 2: Patterns For React Application Design

LEVELS OF EXPERIENCE?How familiar are you with…

• React

• Redux/Flux

• Observables

• Testing

• Functional Programming

Page 3: Patterns For React Application Design

WHY REACT?

Page 4: Patterns For React Application Design

WHY REACT?

• UI as a representation of state (declarative)

• Simple to implement highly-interactive applications

• Just a library, offers flexibility of implementation

• Helps people become better JavaScript developers

• Easy to test

• Component approach encourages composition…

Page 5: Patterns For React Application Design

COMPONENT TYPES

Page 6: Patterns For React Application Design

ES6 CLASSESOTHERWISE KNOWN AS STATEFUL COMPONENTS

Page 7: Patterns For React Application Design

FUNCTIONAL STATELESS COMPONENTSALSO KNOWN AS FUNCTIONS!

Page 8: Patterns For React Application Design

JSX

Page 9: Patterns For React Application Design

UNDERNEATH THE SYNTAX, IT’S JUST FUNCTIONS

Page 10: Patterns For React Application Design
Page 11: Patterns For React Application Design

INTRODUCING REACT INTO A CODEBASE

Page 12: Patterns For React Application Design

“Full scale React in production starts with small scale React in production”

Paraphrasing Richard Feldman @rtfeldman

https://www.infoq.com/presentations/elm-producton

Page 13: Patterns For React Application Design

“Don’t Rewrite, React”

Ryan Florence, React Europe 2015

Page 14: Patterns For React Application Design
Page 15: Patterns For React Application Design
Page 16: Patterns For React Application Design
Page 17: Patterns For React Application Design
Page 18: Patterns For React Application Design
Page 19: Patterns For React Application Design

MAKE YOUR APP’S INTERFACEA REACT COMPONENTINJECT DEPENDENCIES AS PROPS AND USE LIFECYCLE METHODS

Page 20: Patterns For React Application Design
Page 21: Patterns For React Application Design

WORKING WITH COMPONENTS

Page 22: Patterns For React Application Design
Page 23: Patterns For React Application Design
Page 24: Patterns For React Application Design

Try to always separate concerns correctlyComponents that know about state shouldn’t output any dom and components

that know about dom should only rely on props provided

Page 25: Patterns For React Application Design
Page 26: Patterns For React Application Design

COMPOSITION

Page 27: Patterns For React Application Design

“Favor object composition over class inheritance…

...You should be able to get all the functionality you need just by assembling existing components through

object composition.”

Gamma et al, 1994

Page 28: Patterns For React Application Design
Page 29: Patterns For React Application Design
Page 30: Patterns For React Application Design
Page 31: Patterns For React Application Design

LOTS OF CONDITIONAL BRANCHING IS AN INDICATION THAT A COMPONENT NEEDS REFACTORINGCYCLOMATIC COMPLEXITY OF RENDER FUNCTIONS SHOULD BE VERY LOW

Page 32: Patterns For React Application Design

Avoid imperative render functions by liberally using components

Page 33: Patterns For React Application Design

FUNCTIONAL COMPOSITION

Page 34: Patterns For React Application Design
Page 35: Patterns For React Application Design
Page 36: Patterns For React Application Design

https://jsbin.com/cobamew/edit?js,output

Page 37: Patterns For React Application Design

“It is better to have 100 functions operate on one data structure than 10 functions on 10 data structures..”

Alan Perlis

Page 38: Patterns For React Application Design
Page 39: Patterns For React Application Design

HIGHER ORDER COMPONENTS

Page 40: Patterns For React Application Design

AN EXAMPLE OF ELIMINATING HIDDEN STATE

Page 41: Patterns For React Application Design
Page 42: Patterns For React Application Design
Page 43: Patterns For React Application Design
Page 44: Patterns For React Application Design

https://jsbin.com/rekeqi/edit?js,console,output

Page 45: Patterns For React Application Design
Page 46: Patterns For React Application Design

EXTRACT LOW LEVEL DESIGN LANGUAGE

Page 47: Patterns For React Application Design
Page 48: Patterns For React Application Design

ENCAPSULATE CSS

Page 49: Patterns For React Application Design
Page 50: Patterns For React Application Design

CSS IN JS OPTIONS

• Aphrodite

• Glamour

• Styled-Components

• Styled-JSX

Page 51: Patterns For React Application Design

STATE MANAGEMENT

Page 52: Patterns For React Application Design

START SIMPLE

Page 53: Patterns For React Application Design

STATE MANAGEMENT

• Stateful components

• Observables

• Redux

Page 54: Patterns For React Application Design

USING “SETSTATE”STANDARD USAGE IS TO PROVIDE AN OBJECT WHICH IS SHALLOW MERGED INTO EXISTING STATE, TRIGGERING RENDER LIFECYCLE

Page 55: Patterns For React Application Design

BEWARE, ASYNC

Page 56: Patterns For React Application Design
Page 57: Patterns For React Application Design
Page 58: Patterns For React Application Design

Functions to handle state updates may well be the idiomatic way to update in the future

https://medium.freecodecamp.com/functional-setstate-is-the-future-of-react-374f30401b6b

Page 59: Patterns For React Application Design

OBSERVABLES

Page 60: Patterns For React Application Design
Page 61: Patterns For React Application Design

http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-scan

Page 62: Patterns For React Application Design
Page 63: Patterns For React Application Design
Page 64: Patterns For React Application Design
Page 65: Patterns For React Application Design
Page 66: Patterns For React Application Design

REDUX

Page 67: Patterns For React Application Design
Page 68: Patterns For React Application Design

GROUP ACTIONS, REDUCER, CONSTANTS,ETC. BY FEATURE

Page 69: Patterns For React Application Design

KEEP INITIAL STATE AND “SELECTORS” WITH REDUCER CODEIDIOMATIC USAGE OF THE REDUX PATTERN WILL RESULT IN A BETTER STRUCTURE FOR YOUR APPLICATION

Page 70: Patterns For React Application Design

FAVOUR DESTRUCTURING

Page 71: Patterns For React Application Design
Page 72: Patterns For React Application Design

SIDE EFFECTS

Page 73: Patterns For React Application Design
Page 74: Patterns For React Application Design
Page 75: Patterns For React Application Design

Redux-Saga allows you to think about your app as a black box where side effects are pushed outside the

core application logic

Page 76: Patterns For React Application Design

TESTING

Page 77: Patterns For React Application Design

Removing side effects and working extensively with pure functions will make testing simpler

and more effective

Page 78: Patterns For React Application Design

SNAPSHOTS

Page 79: Patterns For React Application Design
Page 80: Patterns For React Application Design

Keeping logic outside components makes testing easier: use fixtures and snapshots to make

render testing quick and simple

Page 81: Patterns For React Application Design

WHAT NEXT?

Page 82: Patterns For React Application Design

THINGS TO BE EXCITED ABOUT**MAYBE THINGS JUST TO HAVE A LOOK AT

• ADTs (http://www.tomharding.me/2017/03/03/fantas-eel-and-specification/)

• Preact, Inferno, (Elm?)

• Tree Shaking

• React Router

• Next.js

• React Fiber (https://github.com/acdlite/react-fiber-architecture)

Page 83: Patterns For React Application Design

THANK YOUIan Thomas – Principal Engineer, Sky Betting & Gaming

@anatomic