Slide 1

Slide 1 text

Dive into React Perf CT Wu, 2016 @ JSDC Twitter: wu_ct Github: wuct Email: [email protected]

Slide 2

Slide 2 text

Better performance leads to better user experience

Slide 3

Slide 3 text

Use the production version of React

Slide 4

Slide 4 text

Use a bundler process.env.NODE_ENV = "production" Use pre-built files

Slide 5

Slide 5 text

How does React work?

Slide 6

Slide 6 text

createElement(View, {}, [ createElement(View), createElement(View) ]) { type: View, props: { children: [ { type: View }, { type: View }, ] } }

Slide 7

Slide 7 text

ReactDOM.render( )

Slide 8

Slide 8 text

setState()

Slide 9

Slide 9 text

• Reduce call to React.createElement() • Avoid reconciliation • Avoid re-mounting

Slide 10

Slide 10 text

render() { return ( { // ... } Header 1 Header 2 Footer 1 Footer 2 ) } const headerAndFooter = Header 1 Header 2 Footer 1 Footer 2 render() { return ( {headerAndFooter} { // ... } ) }

Slide 11

Slide 11 text

setState() bailout

Slide 12

Slide 12 text

shoudComponentUpdate(nextProps, nextState) { if (/* You want to update */) { return true } return false }

Slide 13

Slide 13 text

Pure Render Optimization shoudComponentUpdate(nextProps, nextState) { return ( !shallowEqual(nextProps, this.props) || !shallowEqual(nextState, this.state) ) } class extends React.PureComponent { // ... } or

Slide 14

Slide 14 text

Anti Pure Render render() { return ( {}} funcBind={func.bind(this)} arrayLiteral={[]} newArray={map(…)} objectLiteral={{}} newObject={assign({}, …)} > ) }

Slide 15

Slide 15 text

Static View Optimization import StaticContainer from 'react-static-container' shoudComponentUpdate() { return false } or

Slide 16

Slide 16 text

React Internal Bailout • Bailout when prevElement === nextElement • Don’t bailout when prevContext !== nextContext • React always create a new context • Don’t use setState() and getChildContext() in one component

Slide 17

Slide 17 text

class extends React.Component { getChildContext() { return this.state } componentDidMount() { setInterval(() => this.setState({ time: this.state.time + 1 }) , 1000) } // ... }

Slide 18

Slide 18 text

• Updating is faster than re-mounting • Don’t change the key or the type if you want to update

Slide 19

Slide 19 text

render() { return isDarkTheme ? : } render() { }

Slide 20

Slide 20 text

render () { return ( { data.map(item => ) } ) } render () { return ( { data.map(item => ) } ) }

Slide 21

Slide 21 text

React Perf Tool • Currently, only supports the development version of React • Perf.start() • Perf.stop() • Perf.printWasted() • Perf.printOperations()

Slide 22

Slide 22 text

class Child extends React.Component { render() { return
} } class App extends React.Component { state = { title: 'Foo' } render() { return (
{this.state.title}
) } }

Slide 23

Slide 23 text

Perf.start() app.setState({ title: ‘bar’ }) Perf.stop() Perf.printWasted()

Slide 24

Slide 24 text

class Child extends React.PureComponent { render() { return
} }

Slide 25

Slide 25 text

Perf.start() app.setState({ title: ‘bar’ }) Perf.stop() Perf.printWasted()

Slide 26

Slide 26 text

class App extends React.Component { state = { theme: 'light' } render() { return (
{ this.state.theme === 'light' ? : }
) } }

Slide 27

Slide 27 text

Perf.start() app.setState({ theme: 'dark' }) Perf.stop() Perf.printOperations()

Slide 28

Slide 28 text

class App extends React.Component { state = { theme: 'light' } render() { return (
) } }

Slide 29

Slide 29 text

Perf.start() app.setState({ theme: 'dark' }) Perf.stop() Perf.printOperations()

Slide 30

Slide 30 text

React Fiber • Is still experimental • Prioritization • Return multiple elements from render • Try it now: npm i [email protected] import ReactDOMFiber from 'react-dom/fiber'

Slide 31

Slide 31 text

Thanks! • Github: wuct • Twitter: wu_ct • [email protected]