performance:
1、使用 production 模式幌墓;
2但壮、插件:
uglify-js-brunch?:minify js 文件
envify:確認(rèn)配置了正確環(huán)境
uglifyify:minify code
UglifyJS:?a JavaScript parser, minifier, compressor and beautifier toolkit.
3、開發(fā)環(huán)境性能調(diào)試:
(1)Chrome Performance
(2)DevTools Profiler
4常侣、渲染超長(zhǎng)列表使用:react-window
5蜡饵、avoid reconcilation:使用 PureComponent、shouldComponentUpdate(which is triggered before the re-rendering process starts)胳施,但是這兩種方案只是進(jìn)行了淺比較溯祸,而對(duì)于復(fù)雜的數(shù)據(jù)結(jié)構(gòu)的變化則會(huì)出問題。
解決辦法:不要改變 state舞肆、props 的數(shù)據(jù)(就是深拷貝數(shù)據(jù))焦辅,使用 Immutable data:(1)...擴(kuò)展語(yǔ)法、(2)Object.assign椿胯、(3)Immutable.js筷登。immutable 結(jié)構(gòu)數(shù)據(jù)可以很方便跟蹤對(duì)象的變化。
Reconciliation:
what made in React’s “diffing” algorithm
動(dòng)機(jī):render() 可看做是在創(chuàng)建一個(gè) react 組件樹哩盲,組件更新的算法復(fù)雜度為 O(n3)前方,n 為組件數(shù)×停基于這兩種前提下:(1)不同類型的兩個(gè)元素會(huì)生成不同的 tree惠险;(2)開發(fā)者可通過(guò)為元素增加 key 屬性來(lái)避免不必要的更新。(這兩種假設(shè)適用于大多數(shù)場(chǎng)景)算法復(fù)雜可降為 O(n)娱两。
diff 算法:
(1)元素類型不一致莺匠,整個(gè)元素都會(huì)改變
(2)元素類型一致金吗,則只改變屬性
(3)然后迭代比較子元素
加唯一 key 值來(lái)防止不需要更新元素進(jìn)行不必要的更新十兢。
tradeoffs:
?reconciliation algorithm is an implementation detail。
Portals:
渲染一個(gè) child 到一個(gè)特定的 DOM 節(jié)點(diǎn)中摇庙,如下代碼旱物,child 會(huì)屬于 container 的子元素,而不屬于引用下面代碼的組件(引用組件)卫袒。
使用:
render(){
? ? return ReactDOM.createPortal(child, container);
}
場(chǎng)景:懸浮卡片宵呛、dialogs 等。
事件冒泡:引用組件可監(jiān)聽 child 中時(shí)間夕凝。