Slide 1

Slide 1 text

3FBEZGPS"TZOD3FOEFSJOH 4DSBNCMF !LPCB

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

"HFOEB w 8IBUJT"TZOD3FOEFSJOH w -JGFDZDMF.FUIPET4USJDU.PEF w 5JNF4MJDJOH w 3FBDU4VTQFOTF w "QQFOEJY v16.3 Changes

Slide 4

Slide 4 text

8IBUJT"TZOD3FOEFSJOH

Slide 5

Slide 5 text

w 3FBDU'JCFSJTBOVOJUPGXPSL 㲈3FBDU&MFNFOU w *UJTQPTTJCMFUPTUPQBOESFTVNFVQEBUFT 3FDBQ3FBDU'JCFS FiberA FiberB FiberD FiberE Commit all SideEffects Idle Time Idle Time Idle Time SideEffect SideEffect Host (DOM) FiberC Render Phase Commit Phase

Slide 6

Slide 6 text

w 3FOEFS1IBTFʜ"TZOD w $PNNJU1IBTFʜ4ZOD 3FDBQ3FBDU'JCFS FiberA FiberB FiberD FiberE Commit all SideEffects Idle Time Idle Time Idle Time SideEffect SideEffect Host (DOM) FiberC Async Sync

Slide 7

Slide 7 text

4VTQFOEBOE3FTVNF FiberA FiberB FiberA FiberC Commit Low Priority Sync Priority Commit FiberA FiberB FiberC Low Priority Reuse Interrupt Suspend

Slide 8

Slide 8 text

-JGFDZDMF.FUIPET

Slide 9

Slide 9 text

$IBOHFTGPSMJGFDZDMFNFUIPET http://blog.koba04.com/post/2018/04/04/react-v163-changes/

Slide 10

Slide 10 text

w $BMMFEBU3FOEFS1IBTF w 3FUVSOBQBSUJBMTUBUFCBTFEPOOFYU1SPQT w TUBUJDHFU%FSJWFE4UBUF'SPN1SPQT static getDerivedStateFromProps(nextProps, prevState) { if (nextProps.category !== prevState.category) { return { data: null, category: null }; } return null; } componentDidUpdate() { if (this.state.category == null) { fetchData(this.props.category).then((data) => { this.setState({category: this.props.category, data}); }); }

Slide 11

Slide 11 text

w $BMMFEBU$PNNJU1IBTF w 3FUVSOBTOBQTIPU BOZ CFGPSFVQEBUFUIF)PTU w UIFTOBQTIPUJTQBTTFEUPDPNQPOFOU%JE6QEBUF HFU4OBQTIPU#FGPSF6QEBUF getSnapshotBeforeUpdate() { return { scrollHeight: document.body.scrollHeight, scrollTop: document.body.scrollTop, }; } componentDidUpdate(prevProps, prevState, snapshot) { const {body} = document; const {scrollTop, scrollHeight} = snapshot; body.scrollTop = scrollTop + (body.scrollHeight - scrollHeight); }

Slide 12

Slide 12 text

https://reactjs.org/blog/2018/03/27/update-on-async-rendering.html#examples

Slide 13

Slide 13 text

https://github.com/facebook/react/tree/master/packages/create-subscription

Slide 14

Slide 14 text

4USJDU.PEF

Slide 15

Slide 15 text

w *EFOUJGZJOHDPNQPOFOUTVOTBGFMJGFDZDMFT w 8BSOJOHBCPVUMFHBDZTUSJOHSFG"1*VTBHF w %FUFDUJOHVOFYQFDUFETJEFF⒎FDUT 4USJDU.PEF const {StrictMode} = React; const App = () => ( );

Slide 16

Slide 16 text

/FX$BQBCJMJUJFT

Slide 17

Slide 17 text

https://reactjs.org/blog/2018/03/01/sneak-peek-beyond-react-16.html

Slide 18

Slide 18 text

5JNF4MJDJOH

Slide 19

Slide 19 text

w #MPDLJOH6*UISFBEJTBOBXGVMFYQFSJFODF w 5IFSFBSFNBOZQFPQMFXIPVTFMPXQPXFSEFWJDFT w 8IZOPUEFCPVODFPSUISPUUMF 5IFBOTXFSJTʜ w SFRVFTU*EMF$BMMCBDL 5JNF4MJDJOH { ReactDOM.flushSync(() => this.setState({value})); this.setState({data: this.filterData(value)}); }} />

Slide 20

Slide 20 text

https://koba04.github.io/react-fiber-resources/examples/ Async Update Sync Update

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

https://zeit.co/blog/domains-search-web

Slide 23

Slide 23 text

3FBDU4VTQFOTF

Slide 24

Slide 24 text

https://github.com/facebook/react/pull/12279

Slide 25

Slide 25 text

w 3FBDU4VTQFOTFJTBGFBUVSFUPIBOEMFBTZODVQEBUFT w )5513FRVFTU w %ZOBNJD-PBEJOH w )BOEMJOHBTZODISPOPVTVQEBUFTBSFTPIBSEʜ w 4UBSU-PBEJOH "1*4VDDFTT &SSPSʜ w .BOZMPBEJOHTQJOOFST KBOLCZBGBTUSFTQPOTF 3FBDU4VTQFOTF

Slide 26

Slide 26 text

3FBDU4VTQFOTF "1*XJMMCFDIBOHFE import SimpleCacheProvider from ‘simple-cache-provider’; const cache = SimpleCacheProvider.createCache(); const userFetcher = id => SimpleCacheProvider.createResource(id => fetch(`/api/users/${id}`).then(res => res.json()); )(cache, id); const User = props => { const user = userFetcher.read(props.id); return
{user.name}
; }; const Fallback = props => ( {didExpire => didExpire ? props.placeholder : props.children} );

Slide 27

Slide 27 text

3FBDU4VTQFOTF "1*XJMMCFDIBOHFE import SimpleCacheProvider from ‘simple-cache-provider’; const cache = SimpleCacheProvider.createCache(); const routeFetcher = Component => SimpleCacheProvider.createResource(Component => import(Component).then(module => module.default); )(cache, Component); const UserPage = () => { const Component = routeFetcher.read(‘./pages/User’); return ; }; const Fallback = props => ( {didExpire => didExpire ? props.placeholder : props.children} );

Slide 28

Slide 28 text

Empty Pending Resolved Rejected read or preload throw promise return value from cache Cache load

Slide 29

Slide 29 text

w 3FBDU4VTQFOTFJTCBTFEPO&SSPS#PVOEBSJFT UIPVHI XIJDIUISPXT1SPNJTFJOTUFBEPG&SSPS )PXEPFT3FBDU4VTQFOTFXPSL User Fallback Timeout throw Promise! (suspend) timeout render with fetched Data (resume)

Slide 30

Slide 30 text

https://github.com/facebook/react/pull/12201

Slide 31

Slide 31 text

w 5IF"1*JTOPUpOBM"1* NJHIUCFDIBOHFE w *IFBSESFOEFSGVODUJPONVTUOPUIBWFBOZTJEFF⒎FDUT w 3FBDU4VTQFOTFPO443SFOEFSFS w 1SFSFOEFSBOEQSFMPBEJOHXJUIIJEEFOQSPQT w "XFTPNF8IFODBO*VTF3FBDU4VTQFOTF w .BZCFJOʜ 3FBDU4VTQFOTF

Slide 32

Slide 32 text

"QQFOEJY

Slide 33

Slide 33 text

/FX$POUFYU"1* const LangContext = React.createContext(‘en’); const ThemeContext = React.createContext(‘dark’); const App = () => ( 
 {lang => ( {theme => ( {getMessage(‘click’, lang)} )} )} );

Slide 34

Slide 34 text

w )BSEUPUZQFDIFDLJOH w TIPVME$PNQPOFOU6QEBUFNJHIUCSFBLUIFVQEBUF 1SPCMFNTPGMFHBDZ$POUFYU"1* GrandChild Child Parent ThemeContext Brown -> Orange shouldComponentUpdate return false;

Slide 35

Slide 35 text

w 0QUJNJ[FUIFVQEBUFTGPS$POUFYUWBMVF w 3FBDUVTFTCJUXJTFPQFSBUPSJUTJOUFSOBMT 0CTFSWFE#JUT VOTUBCMF⚠ const StoreContext = React.createContext(null, (prev, next) => { let changedBits = 0; if (prev.foo !== next.foo) changedBits |= 0b01; if (prev.bar !== next.bar) changedBits |= 0b10; return changedBits; }); // changedBits & unstable_observedBits !== 0 {({foo}) =>
{foo}
{({bar}) =>
{bar}

Slide 36

Slide 36 text

https://medium.com/@koba04/a-secret-parts-of-react-new-context-api-e9506a4578aa

Slide 37

Slide 37 text

w 3FEVYBOE/FX$POUFYUBSFEJ⒎FSFOUMBZFST w SFBDUSFEVYNJHIUCFDIBOHFEXJUI/FX$POUFYU"1* w IUUQTHJUIVCDPNSFBDUKTSFBDUSFEVYQVMM w 8IZBSFZPVVTJOH3FEVY /FX$POUFYUBOE3FEVY

Slide 38

Slide 38 text

5IBOLT TQFBLFSEFDLDPNLPCB