´Ó React µ½ React Fiber
ǰÑÔ
ä¯ÀÀÆ÷ÖеÄäÖȾÒýÇæÊǵ¥Ï̵߳쬼¸ºõËùÓеIJÙ×÷¶¼ÊÇÔÚÕâ¸öµ¥Ïß³ÌÖÐÖ´ÐСª¡ª½âÎöäÖȾ DOM Tree ºÍ CSS Tree£¬½âÎöÖ´ÐÐ JavaScript ¡ª¡ª³ýÁËÍøÂç²Ù×÷¡£Õâ¸öÏ߳̾ÍÊÇä¯ÀÀÆ÷µÄÖ÷Ï̡߳£µ¥Ïß³ÌÒâζ×Å£¬Ò»¶Îʱ¼äÖ»×öÒ»¼þÊ£¬ËùÒÔä¯ÀÀÆ÷ÔÚͬһʱ¼äÄÚ£¬ÆäÖ÷Ïß³ÌÖ»ÄܹØ×¢ÓÚÒ»¸öÈÎÎñ¡£
ÔÚWeb¿ª·¢ÖУ¬ºÜ¶àÈ˾õµÃ£¬²»¾ÍÊÇд HTML ºÍ CSS ½«Êý¾ÝÏÔʾ³öÀ´Ã´£¬So Easy !
±§×ÅÕâÑùÏë·¨¿ª·¢³öÀ´µÄÍøÕ¾£¬Èç¹û±È½Ï¼òµ¥µÄ»°£¬»¹²»ÄÜ¿´³ö²î±ð£¬µ«ÊÇÒ»µ©Ò³Ã渴ÔÓ£¬Óû§½»»¥±ä¶àÖ®ºó£¬±×¶Ë¾Í»á±¬·¢£º¿¨¶Ù£¬Ã»·´Ó¦£¬ÈÝÒ×±ÀÀ£¡¡
ÉÔÓоÑéµÄǰ¶Ë¹¤³Ìʦ»áÖªµÀ£¬Ò³ÃæµÄDOM¸Ä±ä£¬¾Í»áµ¼ÖÂÒ³ÃæÖØÐ¼ÆËãDOM£¬½øÐÐÖØ»æ»òÕßÖØÅÅ£¬DOM½á¹¹¸´ÔÓ»òÕ߯µ·±²Ù×÷DOMͨ³£ÊÇÐÔÄÜÆ¿¾±²úÉúµÄÔÒò¡£¶øÍøÕ¾´Ó×ʼ±È½Ï¼òµ¥£¬¿ªÊ¼±äµÄÔ½À´Ô½¸´ÔÓ£¬Óû§½»»¥Ò²»áÔ½À´Ô½¶à£¬Ôõôȥ¼õÇáDOM²Ù×÷´øÀ´µÄÐÔÄÜËðºÄ¾Í±äµÃÖØÒªÆðÀ´¡£
ReactÀ´ÁË
ReactÊǽü¼¸Äê·Ç³£»ðµÄÒ»¸öǰ¶Ë¿ò¼Ü£¬ËüµÚÒ»´ÎÌá³öÁË Virtual DOMµÄ¸ÅÄî¡£
Virtual DOM ÊÇÒ»¸ö JavaScript ¶ÔÏó¡£Ã¿´Î£¬ÎÒÃÇÖ»ÐèÒª¸æËß React ÏÂÒ»¸ö״̬ÊÇʲô£¬React»á×Ô¼º¹¹½¨Ò»¸öÐ嵀 Virtual DOM£¬È»ºó¸ù¾ÝÐÂ¾É Virtual DOM ¿ìËÙ¼ÆËãÆä²îÒ죬ÕÒ³öÐèÒªÖØ»æ»òÖØÅŵÄÔªËØ£¬¸æËßä¯ÀÀÆ÷¡£ä¯ÀÀÆ÷¸ù¾ÝÏà¹ØµÄ¸üУ¬ÖØÐ¼ÆËã DOM Tree£¬ÖØ»æÒ³Ãæ¡£
ÎÒÃÇÏÂÃæ¿´Ò»¸öÀý×Ó¡£
const NUMBER_OF_BLOCK = 2;
class ReactExample extends Component {
constructor() {
super();
this.state = { timesOfButtonClicked: 0 };
}
_addTimesOfButtonClicked() {
const {timesOfButtonClicked} = this.state;
this.setState({timesOfButtonClicked: timesOfButtonClicked + 1});
}
render() {
const {timesOfButtonClicked} = this.state;
return (
<div >
<input type="text" />
<button onClick={this._addTimesOfButtonClicked.bind(this)}>
Click Me
</button>
<BlockList
displayNumber ={timesOfButtonClicked}
numberOfBlock={NUMBER_OF_BLOCK} />
</div>
)
}
};
// ´´½¨¿éÔªËØÁбí×é¼þ£¬ÊäÈë¿éÔªËØµÄÊýÁ¿ NUMBER_OF_BLOCK_LIST£¬äÖȾ³ö¶ÔÓ¦ÊýÁ¿µÄ¿éÔªËØ
reactDOM.render(<ReactExample />, document.getElementById('app-container')); |
Õâ¸öÀý×Ó»áÔÚÒ³ÃæÖд´½¨Ò»¸öÊäÈë¿ò£¬Ò»¸ö°´Å¥£¬Ò»¸ö BlockList ×é¼þ¡£BlockList ×é¼þ»á¸ù¾Ý NUMBER_OF_BLOCK µÄÊýÖµäÖȾ³ö¶ÔÓ¦ÊýÁ¿µÄÊý×ÖÏÔʾ¿ò£¬Êý×ÖÏÔʾ¿òÏÔʾµã»÷°´Å¥µÄ´ÎÊý¡£ÎÒÃÇ×ʼÉèÖà ¾Ý NUMBER_OF_BLOCK Ϊ 2 £¬Ö»äÖȾ 2 ¸öÊý×ÖÏÔʾ¿ò¡£
Ê×´ÎäÖȾ³öÒ³ÃæÖ®ºó£¬ÎÒÃǵã»÷°´Å¥£¬Ò³ÃæÖеÄÊý×ÖÏÔʾ¿òµÄÖµÓÉ 0 ±äΪ 1¡£ÈçÏÂͼËùʾ£º

µ±µã»÷°´Å¥µÄʱºò£¬°´Å¥µã»÷´ÎÊý´Ó 0 ±äΪ 1£¬ÎÒÃÇÐèÒª¸æËß React ÏÂÃæÄãÒªÏÔʾ 1 ÁË£¬ÓÚÊÇ£¬Í¨¹ý setState ²Ù×÷£¬ÎÒÃǸæËß React: ÏÂÒ»¸öÄãÐèÒªÏÔʾµÄÊý¾ÝÊÇ 1¡£È»ºó£¬React ¿ªÊ¼¸üÐÂ×é¼þ¡£¶ÔÓ¦µÄ Virtual DOM Tree ±ä»¯ÈçÏÂͼËùʾ¡£»ÆÉ«±íʾ״̬±»¸üС£

ÎÒÃǵã»÷°´Å¥£¬´¥·¢ setState Ö®ºó£¬React ¾Í»á´´½¨Ò»¸öÐ嵀 Virtual DOM£¬È»ºó½«ÐÂ¾É Virtual DOM ½øÐÐ diff ²Ù×÷£¬ÅжÏÄÄÐ©ÔªËØÐèÒª¸üУ¬½«ÐèÒª¸üеÄÔªËØ·Åµ½¸üÐÂÁбíÖУ¬×îºó±éÀú¸üÐÂÁбí¸üÐÂËùÓеÄÔªËØ£¬ÕâËùÓеĹý³Ì¶¼ÊÇ React °ïÎÒÃÇÍê³ÉµÄ¡£¶Ôä¯ÀÀÆ÷¶øÑÔ£¬Õâ¸ö¹ý³Ì½ö½öÊDZàÒëÖ´ÐÐÁËÒ»¶Î JavaScript ´úÂë¶øÒÑ£¬ÎÒÃÇ°Ñ´Ó setState ¿ªÊ¼£¬µ½Ò³ÃæäÖȾ½áÊøµÄä¯ÀÀÆ÷Ö÷Ï̹߳¤×÷Á÷³Ì»³öÀ´£¬ÈçÏÂͼËùʾ¡£À¶É«´ÖÏß±íʾä¯ÀÀÆ÷Ö÷Ï̡߳£

´Ó»ñµÃ×îеÄÊý¾Ý£¬µ½½«Êý¾ÝÔÚÒ³ÃæÖгÊÏÖ³öÀ´£¬¿ÉÒÔ·ÖΪÁ½¸ö½×¶Î¡£
µÚÒ»¸ö µ÷¶È½×¶Î¡£Õâ¸ö½×¶Î React ÓÃÐÂÊý¾ÝÉú³ÉÐ嵀 Virtual DOM £¬±éÀú Virtual DOM £¬È»ºóͨ¹ý Diff Ëã·¨£¬¿ìËÙÕÒ³öÐèÒª¸üеÄÔªËØ£¬·Åµ½¸üжÓÁÐÖÐÈ¥¡£
µÚ¶þ¸ö äÖȾ½×¶Î¡£Õâ¸ö½×¶Î React ¸ù¾ÝËùÔÚµÄäÖȾ»·¾³£¬±éÀú¸üжÓÁУ¬½«¶ÔÓ¦ÔªËØ¸üС£ÔÚä¯ÀÀÆ÷ÖУ¬¾ÍÊǸúжÔÓ¦µÄDOMÔªËØ¡£³ýä¯ÀÀÆ÷Í⣬äÖȾ»·¾³»¹¿ÉÒÔÊÇ Native£¬Ó²¼þ£¬VR µÈ¡£
ÐÂÎÊÌâ
֮ǰ£¬React ÔÚ¹ÙÍøÖÐдµÀ£º
We built React to solve one problem: building large applications with data that changes over time.
ÏÖÔÚ¸üÐÂΪ£º
React is a declarative, efficient, and flexible JavaScript library for building user interfaces.
ËùÒÔÎÒÃÇ¿´³ö£¬React ÐµĶ¨Î»ÔÚÓÚÁé»î¸ßЧµÄÊý¾Ý¡£µ«ÊÇÔÚʵ¼ÊµÄʹÓÃÖУ¬ÓÈÆäÊÇÓöµ½Ò³Ãæ½á¹¹¸´ÔÓ£¬Êý¾Ý¸üÐÂÆµ·±µÄÓ¦ÓõÄʱºò£¬React µÄ±íÏÖ²»¾¡ÈçÈËÒâ¡£ÔÚÉÏÒ»¸öÀý×ÓÖУ¬ÎÒÃÇ¿ÉÒÔÉèÖà NUMBER_OF_BLOCK µÄֵΪ 100000£¨Êµ¼ÊÇé¿öÏ£¬¿ÉÄÜûÓÐÄÇô¶à£©£¬½«Æä±äΪһ¸ö¡°¸´ÔÓ¡±µÄÍøÒ³¡£
µã»÷°´Å¥£¬´¥·¢ setState£¬Ò³Ã濪ʼ¸üС£
µã»÷ÊäÈë¿ò£¬ÊäÈëһЩ×Ö·û´®£¬±ÈÈç ¡°hireact¡±¡£ÎÒÃÇ¿ÉÒÔ¿´µ½£¬Ò³Ãæ´ËʱûÓÐÈκεÄÏìÓ¦¡£
µÈ´ý 7 s£¬ÊäÈë¿òÖÐͻȻ³öÏÖÁË£¬Ö®Ç°ÊäÈëµÄ ¡°hireact¡±£¬Í¬Ê±£¬ BlockList ×é¼þÒ²¸üÐÂÁË¡£
ÔÚÕâµÈ´ý 7 s ÖУ¬Ò³Ãæ²»»á¸øÎÒÈκεÄÏìÓ¦£¬ÎÒ»áÒÔÎªÍøÕ¾±ÀÀ£ÁË£¬»òÕßµçÄÔËÀ»úÁË¡£Èç¹ûûÓÐÈÃÎҵȴý¼¸Ã룬ֻÊǵȴýÁË0.5Ã룬¶àµÈ´ý¼¸¸ö0.5ÃëÖ®ºóÎÒ»áÔÚÐÄÀïĬÏ룺ÕâÊÇÊ²Ã´ÆÆÍøÕ¾£¡
ÏÔ¶øÒ×¼û£¬ÕâÑùµÄÓû§ÌåÑé²¢²»ºÃ¡£
½«ä¯ÀÀÆ÷Ö÷Ïß³ÌÔÚÕâ 7 s µÄ performance ÈçÏÂͼËùʾ£º

»ÆÉ«²¿·ÖÊÇ JavaScript Ö´ÐÐʱ¼ä£¬Ò²ÊÇ React Õ¼ÓÃÖ÷Ïß³Ìʱ¼ä£¬×ÏÉ«²¿·ÖÊÇä¯ÀÀÆ÷ÖØÐ¼ÆËã DOM Tree µÄʱ¼ä£¬ÂÌÉ«²¿·ÖÊÇä¯ÀÀÆ÷»æÖÆÒ³ÃæµÄʱ¼ä¡£
ÈýÖÖÈÎÎñ£¬Õ¼ÓÃä¯ÀÀÆ÷Ö÷Ïß³Ì 7 s£¬´Ëʱ¼äÄÚä¯ÀÀÆ÷ÎÞ·¨ÓëÓû§½»»¥¡£µ«ÊÇDOM ¸Ä±äÖ®ºó£¬ä¯ÀÀÆ÷ÖØÐ¼ÆËã DOM Tree£¬ÖØ»æÒ³ÃæÊÇÒ»¸ö±Ø²»¿ÉÉٵĽ׶Σ¨×ÏÉ«ÂÌÉ«½×¶Î£©£¬ä¯ÀÀÆ÷Ò»Ö±¶¼ÊÇÕâÑùÖ´Ðеġ£Ö÷ÒªÊÇ»ÆÉ«²¿·ÖÖ´ÐÐʱ¼ä½Ï³¤,Õ¼ÓÃÁË 6 s£¬¼´ React ½Ï³¤Ê±¼äÕ¼ÓÃÖ÷Ị̈߳¬µ¼ÖÂÖ÷Ïß³ÌÎÞ·¨ÏìÓ¦Óû§ÊäÈë¡£
м¼ÄÜGet
¿ÉÒÔÈ·¶¨µÄÊǸ´ÔÓ¶ÈΪ³£ÊýµÄ diff Ëã·¨»¹ÊǺÜÓÅÐãµÄ£¬Ö÷ÒªÎÊÌâ³öÏÖÔÚ£¬React µÄµ÷¶È²ßÂÔ -- Stack reconcile¡£Õâ¸ö²ßÂÔÏñº¯Êýµ÷ÓÃÕ»Ò»Ñù£¬»áÉî¶ÈÓÅÏȱéÀúËùÓÐµÄ Virtual DOM ½Úµã£¬½øÐÐDiff¡£ËüÒ»¶¨ÒªµÈÕû¿Ã Virtual DOM ¼ÆËãÍê³ÉÖ®ºó£¬²Å½«ÈÎÎñ³öÕ»ÊÍ·ÅÖ÷Ï̡߳£ËùÒÔ£¬ÔÚä¯ÀÀÆ÷Ö÷Ï̱߳» React¸üÐÂ״̬ÈÎÎñÕ¼¾ÝµÄʱºò£¬Óû§Óëä¯ÀÀÆ÷½øÐÐÈκεĽ»»¥¶¼²»Äܵõ½·´À¡£¬Ö»Óеȵ½ÈÎÎñ½áÊø£¬²ÅÄÜͻȻµÃµ½ä¯ÀÀÆ÷µÄÏìÓ¦¡£
React ÕâÑùµÄµ÷¶È²ßÂÔ¶Ô¶¯»µÄÖ§³ÖÒ²²»ºÃ¡£Èç¹û React ¸üÐÂÒ»´Î״̬£¬Õ¼ÓÃä¯ÀÀÆ÷Ö÷Ï̵߳Äʱ¼ä³¬¹ý 16.6 ms[1]£¬¾Í»á±»ÈËÑÛ·¢ÏÖǰºóÁ½Ö¡²»Á¬Ðø£¬¸øÓû§³ÊÏÖ³ö¶¯»¿¨¶ÙµÄЧ¹û¡£
React ºËÐÄÍŶӺÜÔç֮ǰ¾ÍÔ¤ÖªÕâÑùµÄ·çÏյĴæÔÚ£¬²¢ÇÒ³ÖÐøÌ½Ë÷¿É½â¾öµÄ·½Ê½¡£»ùÓÚä¯ÀÀÆ÷¶Ô requestIdleCallbackºÍ requestAnimationFrame ÕâÁ½¸öAPI µÄÖ§³Ö£¬ÒÔ¼°ÆäËûÍŶӶÔÕßÁ½¸öAPIµÄʵÏÖ£¬Èç React Native ÍŶӡ£React ÍŶÓʵÏÖеĵ÷¶È²ßÂÔ -- Fiber reconcile¡£
Fiber ÊÇÒ»ÖÖÇáÁ¿µÄÖ´ÐÐỊ̈߳¬Í¬Ïß³ÌÒ»Ñù¹²Ïí¶¨Ö·¿Õ¼ä£¬Ï߳̿¿ÏµÍ³µ÷¶È£¬²¢ÇÒÊÇÇÀռʽ¶àÈÎÎñ´¦Àí£¬Fiber ÔòÊÇ×Ôµ÷Óã¬Ð×÷ʽ¶àÈÎÎñ´¦Àí¡£
Fiber Reconcile Óë Stack Reconcile Ö÷ÒªÓÐÁ½·½ÃæµÄ²»Í¬¡£
Ê×ÏÈ£¬Ê¹ÓÃÐ×÷ʽ¶àÈÎÎñ´¦ÀíÈÎÎñ¡£½«ÔÀ´µÄÕû¸ö Virtual DOM µÄ¸üÐÂÈÎÎñ²ð·Ö³ÉÒ»¸ö¸öСµÄÈÎÎñ¡£Ã¿´Î×öÍêÒ»¸öСÈÎÎñÖ®ºó£¬·ÅÆúÒ»ÏÂ×Ô¼ºµÄÖ´Ðн«Ö÷Ï߳̿ÕÏгöÀ´£¬¿´¿´ÓÐûÓÐÆäËûµÄÈÎÎñ¡£Èç¹ûÓеϰ£¬¾ÍÔÝÍ£±¾´ÎÈÎÎñ£¬Ö´ÐÐÆäËûµÄÈÎÎñ£¬Èç¹ûûÓеϰ£¬¾Í¼ÌÐøÏÂÒ»¸öÈÎÎñ¡£
Õû¸öÒ³Ãæ¸üв¢ÖØäÖȾ¹ý³Ì·ÖΪÁ½¸ö½×¶Î¡£
Reconcile ½×¶Î¡£´Ë½×¶ÎÖУ¬ÒÀÐò±éÀú×é¼þ£¬Í¨¹ýdiff Ëã·¨£¬ÅжÏ×é¼þÊÇ·ñÐèÒª¸üУ¬¸øÐèÒª¸üеÄ×é¼þ¼ÓÉÏtag¡£±éÀúÍêÖ®ºó£¬½«ËùÓдøÓÐtagµÄ×é¼þ¼Óµ½Ò»¸öÊý×éÖС£Õâ¸ö½×¶ÎµÄÈÎÎñ¿ÉÒÔ±»´ò¶Ï¡£
Commit ½×¶Î¡£¸ù¾ÝÔÚ Reconcile ½×¶ÎÉú³ÉµÄÊý×飬±éÀú¸üÐÂDOM£¬Õâ¸ö½×¶ÎÐèÒªÒ»´ÎÐÔÖ´ÐÐÍê¡£Èç¹ûÊÇÔÚÆäËûµÄäÖȾ»·¾³ -- Native£¬Ó²¼þ£¬¾Í»á¸üжÔÓ¦µÄÔªËØ¡£
ËùÒÔ֮ǰä¯ÀÀÆ÷Ö÷Ïß³ÌÖ´ÐиüÐÂÈÎÎñµÄÖ´ÐÐÁ÷³Ì¾Í±ä³ÉÁËÕâÑù¡£

Æä´Î£¬¶ÔÈÎÎñ½øÐÐÓÅÏȼ¶»®·Ö¡£²»ÊÇÿÀ´Ò»¸öÐÂÈÎÎñ£¬¾ÍÒª·ÅÆúÏÖÖ´ÐÐÈÎÎñ£¬×ª¶øÖ´ÐÐÐÂÈÎÎñ¡£ÓëÎÒÃÇ×öÊÂÇéÒ»Ñù£¬½«ÈÎÎñ»®·ÖÓÅÏȼ¶£¬Ö»Óе±±ÈÏÖÈÎÎñÓÅÏȼ¶¸ßµÄÈÎÎñÀ´ÁË£¬²ÅÐèÒª·ÅÆúÏÖÈÎÎñµÄÖ´ÐС£±ÈÈç˵£¬ÆÁÄ»ÍâÔªËØµÄäÖȾºÍ¸üÐÂÈÎÎñµÄÓÅÏȼ¶Ó¦¸ÃСÓÚÏìÓ¦Óû§ÊäÈëÈÎÎñ¡£ÈôÏÖÔÚ½øÐÐÆÁÄ»Íâ×é¼þ״̬¸üУ¬Óû§ÓÖÔÚÊäÈ룬ä¯ÀÀÆ÷¾ÍÓ¦¸ÃÏÈÖ´ÐÐÏìÓ¦Óû§ÊäÈëÈÎÎñ¡£ä¯ÀÀÆ÷Ö÷Ïß³ÌÈÎÎñÖ´ÐÐÁ÷³ÌÈçÏÂͼËùʾ¡£

ÎÒÃÇÖØÐ´Ò»¸ö×é¼þ£¬¸ú֮ǰµÄÒ»Ñù¡£Ò»¸öÊäÈë¿ò£¬Ò»¸ö°´Å¥£¬Ò»¸ö BlockList ×é¼þ¡£BlockList ×é¼þ»á¸ù¾ÝNUMBER_OF_BLOCK µÄÊýÖµäÖȾ³ö¶ÔÓ¦ÊýÁ¿µÄÊý×ÖÏÔʾ¿ò£¬Êý×ÖÏÔʾ¿òÏÔʾµã»÷°´Å¥µÄ´ÎÊý¡£½« NUMBER_OF_BLOCK ÉèÖÃΪ 100000£¬Ä£ÄâÒ»¸ö¸´ÔÓµÄÒ³Ãæ¡£²»Í¬µÄÊÇ£¬Ê¹Óà Fiber reconcile µ÷¶È²ßÂÔ£¬ÉèÖÃÈÎÎñÓÅÏȼ¶£¬ÈÃä¯ÀÀÆ÷ÏÈÏìÓ¦Óû§ÊäÈëÔÙÖ´ÐÐ×é¼þ¸üС£
const NUMBER_OF_BLOCK = 100000;
class FiberExample extends Component {
constructor() {
super();
this.state = { timesOfButtonClicked: 0 };
}
_addTimesOfButtonClicked() {
const {timesOfButtonClicked} = this.state;
ReactDOMFiber.unstable_deferredUpdates(() =>
this.setState(state =>
{timesOfButtonClicked: timesOfButtonClicked + 1})
);
}
render() {
const {timesOfButtonClicked} = this.state;
return [
<input type="text" style={inputStyle}/>,
<button style={buttonStyle}
onClick={this._addTimesOfButtonClicked.bind(this)}>
Click Me
</button>,
<BlockList displayNumber={timesOfButtonClicked}
numberOfDotList={NUMBER_OF_BLOCK}/>
]
}
}; |
ReactDOMFiber.render(<FiberExample />, document.getElementById('app-container'));
ÔڶԱȴúÂë²îÒì֮ǰ£¬ÎÒÃÇÏÈÖ´ÐÐͬÑùµÄ²Ù×÷£¬¶Ô±ÈÒ»ÏÂä¯ÀÀÆ÷µÄÐÐΪ¡£
µã»÷ button£¬´¥·¢ setState£¬Ò³Ã濪ʼ¸üС£
µã»÷ÊäÈë¿ò£¬ÊäÈëһЩ×Ö·û´®£¬±ÈÈç ¡°hireact¡±¡£ÎÒÃÇ¿ÉÒÔ¿´µ½£¬Ò³ÃæÄܹ»ÏìÓ¦ÎÒÃǵÄÊäÈëÁË¡£
ä¯ÀÀÆ÷Ö÷Ïß³ÌµÄ performance ÈçÏÂͼËùʾ£º

¿ÉÒÔ¿´µ½£¬ÔÚ»ÆÉ« JavaScript Ö´Ðйý³ÌÖУ¬Ò²¾ÍÊÇ React Õ¼ÓÃä¯ÀÀÆ÷Ö÷Ïß³ÌÆÚ¼ä£¬ä¯ÀÀÆ÷ÔÚÒ²ÔÚÖØÐ¼ÆËã DOM Tree£¬²¢ÇÒ½øÐÐÖØ»æ£¬½ØÍ¼ÏÔʾ£¬ä¯ÀÀÆ÷äÖȾµÄ¾ÍÊÇÓû§ÐÂÊäÈëµÄÄÚÈÝ¡£¼òµ¥Ëµ£¬ÔÚ React Õ¼ÓÃä¯ÀÀÆ÷Ö÷Ïß³ÌÆÚ¼ä£¬ä¯ÀÀÆ÷Ò²ÔÚÓëÓû§½»»¥¡£Õâ¸ö²ÅÊÇÎÒÃÇÔÚÍøÕ¾ÉÏÃæÆÚÍû»ñµÃµÄÌåÑ飬ä¯ÀÀÆ÷×ÜÊǶÔÎÒµÄÊäÈëÓз´À¡¡£
ÄÇÎÒÃǵĴúÂë¸Ä±äÁËÄÄÐ©ÄØ£¿´ÓÏÂÍùÉÏ¿´£º
Ê×ÏÈ£¬´Ó reactDOM.render() ±ä³ÉÁË ReactDOMFiber.render()¡£ÎÒÃÇʹÓÃÁË ReactFiber È¥äÖȾÕû¸öÒ³Ãæ£¬ReactFiber »á½«Õû¸ö¸üÐÂÈÎÎñ·Ö³ÉÈô¸É¸öСµÄ¸üÐÂÈÎÎñ£¬È»ºóÉèÖÃһЩÈÎÎñĬÈϵÄÓÅÏȼ¶¡£Ã¿Ö´ÐÐÍêÒ»¸öСÈÎÎñÖ®ºó£¬»áÊÍ·ÅÖ÷Ï̡߳£
Æä´Î£¬render ·½·¨Öзµ»ØµÄ²»ÔÙÊÇÒ»¸ö±» div ÔªËØ°üÒ»²ãµÄ×é¼þÁÐ±í£¬¶øÊÇÖ±½Ó·µ»ØÒ»¸ö×é¼þÁÐ±í£¬ÕâÊÇ React ÔÚаæÖÐÌṩµÄеÄд·¨¡£³ý´ËÖ®Í⣬¿ÉÒÔÖ±½Ó·µ»Ø×Ö·û´®ºÍÊý×Ö¡£ÏñÏÂÃæ£º
render() {
return 'Hi, ReactFiber!'
}
render() {
return 123
} |
ÔٴΣ¬ÎÒÃÇ´«¸ø setState µÄ²»ÊÇ×îÐÂ״̬£¬¶øÊÇÒ»¸ö callback£¬Õâ¸ö callback ·µ»Ø×îÐÂ״̬¡£Í¬ÉÏ£¬Õâ¸öÒ²ÊÇ React аæÖÐÌṩµÄеÄд·¨£¬Í¬Ê±Ò²ÊÇÍÆ¼öµÄд·¨¡£
×îºó£¬ÎÒÃÇûÓÐÖ±½Óµ÷Óà setState£¬¶øÊǽ«Æä×÷Ϊ callback ´«¸øÁË unstable_deferredUpdates Õâ¸ö API¡£´ÓÃû×־ͿÉÒÔ¿´³ö£¬deferredUpdates Êǽ«¸üÐÂÍÆ³Ù£¬unstable ±íÃ÷ÏÖÔÚ»¹²»Îȶ¨£¬ÔÚ¿ª·¢½×¶Î¡£´ÓÔ´´úÂëÉÏ¿´£¬unstable_deferredUpdates ×öÁËÒ»¼þÊÂÇ飬¾ÍÊǽ«´«¸øËüµÄ¸üÐÂÈÎÎñµÄÓÅÏȼ¶ÉèÖÃΪ lowpriority¡£ËùÒÔÎÒÃǽ«seState ×÷Ϊ callback ´«¸øÁË unstable_deferredUpdates£¬¾ÍÊǸæËß React£¬Õâ¸ö setState ÈÎÎñ£¬ÊÇÒ»¸ö lowpriority µÄÈÎÎñ¡££¨ÐèҪעÒâµÄÊÇ£¬²¢²»È·¶¨ React ÍŶÓÊÇ·ñ½« unstable_deferredUpdates »òÕßdeferredUpdates ×÷Ϊһ¸ö¿ª·ÅµÄ½Ó¿Ú£¬ÏÖÔÚÕâ¸ö°æ±¾[2]¿ÉÒÔͨ¹ýÕâ¸öAPIÈ¥ÉèÖÃÓÅÏȼ¶¡£Í¬Ê±£¬´ÓÔ´´úÂë¿ÉÒÔ¿´µ½£¬React ÍŶÓÏëҪʵÏÖ¸øÈÎÎñÉèÖÃÓÅÏȼ¶µÄ¹¦ÄÜ£¬Ä¿Ç°Ö»¿´µ½Ò»¸ö performWithPriority µÄ½Ó¿Ú£¬Ò²»¹Ã»ÓÐʵÏÖ¡££©
ÎÒÃǵã»÷°´Å¥Ö®ºó£¬unstable_deferredUpdates ½«Õâ¸ö¸üÐÂÈÎÎñÉèÖÃΪ low priority¡£´ËʱÊÇûÓÐÆäËûÈÎÎñ´æÔڵģ¬React ¾Í¿ªÊ¼½øÐÐ״̬¸üÐÂÁË¡£¸üÐÂÈÎÎñ½øÈëÁË Reconcile ½×¶Î£¬ÎÒÃǵã»÷ÊäÈë¿ò£¬´Ëʱ£¬Óû§½»»¥ÈÎÎñÀ´ÁË£¬´ËÈÎÎñÓÅÏȼ¶¸ßÓÚ¸üÐÂÈÎÎñ£¬ËùÒÔä¯ÀÀÆ÷Ö÷Ï߳̽«½¹µã·ÅÔÚÁËÊäÈë¿ò¡¡¡£Ö®ºó¸üÐÂÈÎÎñ½øÈëÁË Commit ½×¶Î£¬²»Äܽ«ä¯ÀÀÆ÷Ö÷Ïß³Ì·ÅÆú£¬µ½ÁË×îºóä¯ÀÀÆ÷äÖȾÍê³ÉÖ®ºó£¬½«Óû§ÔÚ¸üÐÂÈÎÎñ Commit ½×¶ÎµÄÊäÈëÒÔ¼°×îеÄ״̬ÏÔʾ³öÀ´¡£
¶Ô±È Stack Reconcile ºÍ Fiber Reconfile µÄʵÏÖ£¬ÎÒÃÇ¿ÉÒÔ¿´µ½ React еĵ÷¶È²ßÂÔÈÿª·¢Õß¶Ô React Ó¦ÓÃÓÐÁ˸üϸ½ÚµÄ¿ØÖÆ¡£¿ª·¢Õߣ¬¿ÉÒÔͨ¹ýÓÅÏȼ¶£¬¿ØÖƲ»Í¬ÀàÐÍÈÎÎñµÄÓÅÏȼ¶£¬Ìá¸ßÓû§ÌåÑ飬ÒÔ¼°Õû¸öÓ¦ÓóÌÐòµÄÁé»îÐÔ¡£
²ÉÓÃеĵ÷¶ÈËã·¨Ö®ºó£¬»á½«¶¯»µÄäÖȾÈÎÎñÓÅÏȼ¶Ìá¸ß£¬¶Ô¶¯»µÄÖ§³Ö»á±È½ÏÓѺ㬾ßÌåÀý×Ó¿ÉÒÔ¿´ Lin Clark ÔÚReact Conf 2017 µÄÑݽ²¡£
ºó¼Ç
¿´ÆðÀ´ React Fiber ºÜÀ÷º¦µÄÑù×Ó£¬Èç¹ûÒªÓõϰ£¬»¹ÊÇÓÐһЩÎÊÌâÊÇÐèÒª¿¼Âǵġ£
±ÈÈç˵£¬task °´ÕÕÓÅÏȼ¶Ö®ºó£¬¿ÉÄܵÍÓÅÏȼ¶µÄÈÎÎñÓÀÔ¶²»»áÖ´ÐУ¬³ÆÖ®Îª starvation£»
±ÈÈç˵£¬task ÓпÉÄܱ»´ò¶Ï£¬ÐèÒªÖØÐÂÖ´ÐУ¬ÄÇôijЩÒÀÀµÉúÃüÖÜÆÚʵÏÖµÄÒµÎñÂß¼¿ÉÄÜ»áÊܵ½Ó°Ïì¡£
¡¡
React Fiber Ò²ÊÇ´øÀ´Á˺ܶàµÄºÃ´¦µÄ¡£
±ÈÈç˵£¬ÔöÇ¿ÁËijЩÁìÓòµÄÖ§³Ö£¬±ÈÈ綯»¡¢²¼¾ÖºÍÊÖÊÆ£»
±ÈÈç˵£¬ÔÚ¸´ÔÓÒ³Ãæ£¬¶ÔÓû§µÄ·´À¡»á¸ü¼°Ê±£¬Ó¦ÓõÄÓû§ÌåÑé»á±äºÃ£¬¼òµ¥Ò³Ãæ¿´²»µ½Ã÷ÏԵIJîÒ죻
±ÈÈç˵£¬api»ù±¾ÉÏûÓб仯£¬¶ÔÏÖÓÐÏîÄ¿ºÜÓѺá£
¡¡
ÏÖÔÚ£¬React Fiber ÒѾͨ¹ýÁËËùÓеIJâÊÔ£¬ÔÚÍøÕ¾ Is Fiber Ready Yet?,ÉÏÏÔʾ£¬»¹ÓÐ4¸öwarningÐèÒªfix¡£Ëü»áËæ×Å React 16 ·¢²¼£¬µ½µ×Ч¹ûÔõôÑù£¬Ö»ÓÐÓùý²ÅÖªµÀÁË¡£ |