react - amazon s3rethinking)best)prac0ces •...

24
React A JavaScript Library For Building User Interfaces

Upload: others

Post on 03-Jun-2020

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

ReactA"JavaScript"Library"For"Building"User"Interfaces

Page 2: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

React&is&not&FRP

[Func&onal]+Reac&ve+programming+is+programming+with+asynchronous+data+streams.

!!"André"Staltz1

1"The"introduc.on"to"Reac.ve"Programming"you've"been"missing

Page 3: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

Component(Based

It's%components%all%the%way%down!

Page 4: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

Func%onal)*)Declara%ve)UI

Impera've)<+>)Declara've

Page 5: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

Func%onal)*)Declara%ve)UI

Page 6: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

Virtual(DOM

The$UI$is$first$rendered$to$a$virtual$DOM,$then$a$minimal$and$efficient$diff$is$applied$to$the$actual$DOM$to$update$the$visible$UI.

Page 7: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

(aside)(JSX(Syntax

// JSX as authored<div className="app"> <h2>Hello World</h2> <p>Welcome to {this.props.appName}</p> <UserList users={activeUsers} /></div>

// output JSReact.createElement("div", {className: "app"}, React.createElement("h2", null, "Hello World"), React.createElement("p", null, "Welcome to ", this.props.appName), React.createElement(UserList, {users: activeUsers}))

Page 8: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

Sample'App

Page 9: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

Sample'App

• App$component$(blue)

Page 10: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

Sample'App

• App$component$(blue)

• User$list$component$(green)

Page 11: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

Sample'App

• App$component$++$blue

• User$list$component$++$green

• Profile$component(s)$++$red

Page 12: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

User%profile%component

var Profile = React.createClass({ githubUrl: function() { return "https://github.com/" + this.props.user.github; },

render: function() { return ( <li className="user"> <a href={this.githubUrl()}> {this.props.user.name} on github </a> </li> ) }});

Page 13: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

User%List%Component

var UserList = React.createClass({ renderUser: function(user) { return <Profile user={user} /> },

render: function() { return ( <ul> {this.props.users.map(this.renderUser)} </ul> ) }})

Page 14: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

App#Component

var App = React.createClass({ render: function() { return ( <div className="app"> <h1>Active Users</h1> <p>{this.props.users.length} active users</p> <UserList users={this.state.users} /> </div> ) }})

Page 15: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

Boot$The$App

var users = [ { name: "Chris", github: "christoomey" }, { name: "Joe", github: "jferris" }, { name: "Ben", github: "r00k" }, { name: "Chad", github: "cpytel" }];

React.renderComponent( <App users={users} />, document.getElementById('content'));

Page 16: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

Rethinking)Best)Prac0ces

• Render&the&world"#"Re#render"everything"on"any"change"Re#render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently"update"the"UI"to"match.

• Sepera/on&of&Concerns"#"Rather"than"pulling"out"templates,"separate"in"terms"of"components

• Hide&the&DOM"#"The"Virutal"DOM"abstracts"away"the"harsh"reality"of"the"DOM"API"and"allows"you"to"focus"on"your"app.

From%Pete%Hunt's%presenta0on

Page 17: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

The$right$abstrac-on

Abstrac(ng+away+the+DOM+has+lead+to+some+very+impressive+work+in+short+(me

• canvas'render'target

• Ne.lix's'gibbon'widget'system

• Server'side'/'isometric'rendering':

• react'na;ve

Page 18: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

Flipboard's,Canvas

In#search#of#60fps#on#mobile.

React&Canvas&adds&the&ability&for&React&components&to&render&to&<canvas>&rather&than&DOM.

Page 19: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

Ne#lix'Gibbon

Ne#lix's)Gibbon)widget)system)is)an)alterna6ve)rendering)engine)that)takes)the)place)of)the)DOM,)while)s6ll)using)React.

Page 20: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

Server%Side

Since&the&DOM&is&abstracted&away,&react&can&run&in&Node&and&render&to&a&string!

Page 21: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

React&Na(ve

Page 22: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

The$Right$Abstrac/on

It's%worth%no+ng%that%we're%not%chasing%“write%once,%run%anywhere.”%Different%pla;orms%have%different%looks,%feels,%and%capabili+es,%and%

as%such,%we%should%s+ll%be%developing%discrete%apps%for%each%pla;orm,%but%the%same%set%of%engineers%should%be%able%to%build%

applica+ons%for%whatever%pla;orm%they%choose,%without%needing%to%learn%a%fundamentally%different%set%of%technologies%for%each.%We%call%

this%approach%“learn%once,%write%anywhere.”

!!"Tom"Occhino"(React"team"at"Facebook)2

2"h$ps://facebook.github.io/react/blog/2015/03/26/introducing>react>na?ve.html

Page 23: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the

Learning(More

• Official(React(tutorial(from(Facebook

• Ryan(Florence's(React(training(repo

• Presenta;on(by(Ember(core(team(member(on(React

• React=rails(gem

Page 24: React - Amazon S3Rethinking)Best)Prac0ces • Render&the&world"#"Re#render"everything"on"any"change"Re# render"the"en2re"app"(in"memory)"on"all"changes,"then"efficiently" update"the