±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁËFiberºËÐÄÊÇʵÏÖÁËÒ»¸ö»ùÓÚÓÅÏȼ¶ºÍrequestIdleCallbackµÄÑ»·ÈÎÎñµ÷¶ÈËã·¨£¬¶Ôreconciliation½×¶Î½øÐвð·Ö£¬ÈçºÎ²ð·Ö£¬Fiber¶ÔÉúÃüÖÜÆÚµÄÓ°ÏìµÈÄÚÈÝ¡£
±¾ÎÄÀ´×ÔÓÚ²©¿ÍÔ°´óתתFE ,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼ÍƼö¡£ |
|
ǰÑÔ
ReactʵÏÖ¿ÉÒÔ´Ö»®ÎªÁ½²¿·Ö£ºreconciliation£¨diff½×¶Î£©ºÍ commit(²Ù×÷DOM½×¶Î)¡£ÔÚ
v16 ֮ǰ£¬reconciliation ¼òµ¥Ëµ¾ÍÊÇÒ»¸ö×Ô¶¥ÏòϵݹéËã·¨£¬²ú³öÐèÒª¶Ôµ±Ç°DOM½øÐиüлòÌæ»»µÄ²Ù×÷ÁÐ±í£¬Ò»µ©¿ªÊ¼£¬»á³ÖÐøÕ¼ÓÃÖ÷Ị̈߳¬ÖжϲÙ×÷È´²»ÈÝÒ×ʵÏÖ¡£µ±JS³¤Ê±¼äÖ´ÐУ¨Èç´óÁ¿¼ÆËãµÈ£©£¬»á×èÈûÑùʽ¼ÆËã¡¢»æÖƵȹ¤×÷£¬³öÏÖÒ³ÃæÍÑÖ¡ÏÖÏó¡£ËùÒÔ£¬v16
½øÐÐÁËÒ»´ÎÖØÐ´£¬ÓÀ´ÁË´úºÅΪFiberµÄÒì²½äÖȾ¼Ü¹¹¡£
Fiber
FiberºËÐÄÊÇʵÏÖÁËÒ»¸ö»ùÓÚÓÅÏȼ¶ºÍrequestIdleCallbackµÄÑ»·ÈÎÎñµ÷¶ÈËã·¨¡£Ëü°üº¬ÒÔÏÂÌØÐÔ£º
¡¤reconciliation½×¶Î¿ÉÒÔ°ÑÈÎÎñ²ð·Ö³É¶à¸öСÈÎÎñ
¡¤reconciliation½×¶Î¿ÉËæÊ±ÖÐÖ¹»ò»Ö¸´ÈÎÎñ
¡¤¿ÉÒÔ¸ù¾ÝÓÅÏȼ¶²»Í¬À´Ñ¡ÔñÓÅÏÈÖ´ÐÐÈÎÎñ
´ÓÆäÌØÐÔ¿É¿´³ö£¬FiberºËÐÄÊǸü»»ÁËreconciliation½×¶ÎµÄÔË×÷¡£ÄÇô£¬ÎÊÌâÀ´ÁË£º
¡¤ÎªÊ²Ã´¶Ôreconciliation½×¶Î½øÐвð·Ö£¬commit½×¶ÎÄØ£¿
reconciliation½×¶Î°üº¬µÄÖ÷Òª¹¤×÷ÊǶÔcurrent tree ºÍ new tree ×ödiff¼ÆË㣬ÕÒ³ö±ä»¯²¿·Ö¡£½øÐбéÀú¡¢¶Ô±ÈµÈÊÇ¿ÉÒÔÖжϣ¬ÐªÒ»»á¶ù½Ó×ÅÔÙÀ´¡£
commit½×¶ÎÊǶÔÉÏÒ»½×¶Î»ñÈ¡µ½µÄ±ä»¯²¿·ÖÓ¦Óõ½ÕæÊµµÄDOMÊ÷ÖУ¬ÊÇһϵÁеÄDOM²Ù×÷¡£²»½öҪά»¤¸ü¸´ÔÓµÄDOM״̬£¬¶øÇÒÖжϺóÔÙ¼ÌÐø£¬»á¶ÔÓû§ÌåÑéÔì³ÉÓ°Ïì¡£ÔÚÆÕ±éµÄÓ¦Óó¡¾°Ï£¬´Ë½×¶ÎµÄºÄʱ±Èdiff¼ÆËãµÈºÄʱÏà¶Ô¶Ì¡£
ËùÒÔ£¬FiberÑ¡ÔñÔÚreconciliation½×¶Î²ð·Ö
¡¤ÈçºÎ²ð·ÖÄØ?
Ê×ÏÈ£¬ÎÒÃÇ¿ÉÒÔͨ¹ý A Cartoon Intro to FiberÖеÄÒ»ÕÅͼÀ´¿´£º

1.Óû§µ÷ÓÃReactDOM.render´«Èë×é¼þ£¬React´´½¨ElementÊ÷;
2.ÔÚµÚÒ»´ÎäÖȾʱ£¬´´½¨vdomÊ÷£¬ÓÃÀ´Î¬»¤×é¼þ״̬ºÍdom½ÚµãµÄÐÅÏ¢£¨ÈçList/Button/ItemµÈ£©¡£
µ±ºóÐø²Ù×÷Èçrender»òsetStateʱÐèÒª¸üУ¬Í¨¹ýdiffËã³ö±ä»¯µÄ²¿·Ö£»
3.¸ù¾Ý±ä»¯µÄ²¿·Ö¸üÐÂvdomÊ÷¡¢µ÷ÓÃ×é¼þÉúÃüÖÜÆÚº¯ÊýµÈ£¬Í¬²½Ó¦Óõ½ÕæÊµµÄDOM½ÚµãÖС£
ÔÚµÚ¶þ½×¶Î£¬FiberÊǰÑrender/update·ÖƬ£¬²ð½â³É¶à¸öСÈÎÎñÀ´Ö´ÐУ¬Ã¿´ÎÖ»¼ì²éÊ÷Éϲ¿·Ö½Úµã£¬×öÍê´Ë²¿·Öºó£¬Èôµ±Ç°Ò»Ö¡£¨16ms£©ÄÚ»¹ÓÐ×ã¹»µÄʱ¼ä¾Í¼ÌÐø×öÏÂÒ»¸öСÈÎÎñ£¬Ê±¼ä²»¹»¾ÍÍ£Ö¹²Ù×÷£¬µÈÖ÷Ï߳̿ÕÏÐʱÔÙ»Ö¸´¡£
ÕâÖÖÍ£Ö¹/»Ö¸´²Ù×÷£¬ÐèÒª¼Ç¼ÉÏÏÂÎÄÐÅÏ¢¡£¶øµ±Ç°Ö»¼Ç¼µ¥Ò»dom½ÚµãµÄvDom tree ÊÇÎÞ·¨Íê³ÉµÄ£¬
FiberÒýÈëÁËfiber tree£¬ÊÇÓÃÀ´¼Ç¼ÉÏÏÂÎĵÄvDom tree£¬¿ÉÒÔÀí½âΪÉý¼¶°æµÄ¸ÖÌúÏÀ¡£
fiber treeÉÏÒ»¸ö½ÚµãµÄ½á¹¹´óÖÂÓУº
export type Fiber = {
tag: TypeOfWork, // ÀàÐÍ
type: 'div',
return: Fiber|null, // ¸¸½Úµã
child: Fiber|null, // ×Ó½Úµã
sibling: Fiber|null, // Ðֵܽڵã
alternate: Fiber|null, //diff³öµÄ±ä»¯¼Ç¼ÔÚÕâ¸öfiberÉÏ
.....
}; |
ÍêÕûÊ÷½á¹¹¿É²Î¼û ReactFiber
ËùÒÔ£¬FiberÊǸù¾ÝÒ»¸öfiber½Úµã£¨VDOM½Úµã£©À´²ð·Ö£¬ÒÔfiber nodeΪһ¸öÈÎÎñµ¥Ôª£¬Ò»
¸ö×é¼þʵÀý¶¼ÊÇÒ»¸öÈÎÎñµ¥Ôª¡£ÈÎÎñÑ»·ÖУ¬Ã¿´¦ÀíÍêÒ»¸öfiber node£¬¿ÉÒÔÖжÏ/¹ÒÆð/»Ö¸´¡£
¡¤»ùÓÚrequestIdleCallbackºÍÓÅÏȼ¶ÈÎÎñµ÷¶È
1.requestIdleCallback
window.requestIdleCallback(callback[, options])
|
ä¯ÀÀÆ÷ÌṩµÄrequestIdleCallback APIÖеÄCooperative Scheduling¿ÉÒÔÈÃä¯ÀÀÆ÷ÔÚ¿ÕÏÐʱ¼äÖ´Ðлص÷£¨¿ª·¢Õß´«ÈëµÄ·½·¨£©£¬Ôڻص÷²ÎÊýÖпÉÒÔ»ñÈ¡µ½µ±Ç°Ö¡£¨16ms£©Ê£ÓàµÄʱ¼ä¡£ÀûÓÃÕâ¸öÐÅÏ¢¿ÉÒÔºÏÀíµÄ°²Åŵ±Ç°Ö¡ÐèÒª×öµÄÊÂÇ飬Èç¹ûʱ¼ä×ã¹»£¬ÄǼÌÐø×öÏÂÒ»¸öÈÎÎñ£¬Èç¹ûʱ¼ä²»¹»¾ÍЪһЪ£¬µ÷ÓÃrequestIdleCallbackÀ´»ñÖªÖ÷Ï̲߳»Ã¦µÄʱºò£¬ÔÙ¼ÌÐø×öÈÎÎñ¡£
2.²»Í¬µÄÈÎÎñ·ÖÅ䲻ͬµÄÓÅÏȼ¶£¬Fiber¸ù¾ÝÈÎÎñµÄÓÅÏȼ¶À´¶¯Ì¬µ÷ÕûÈÎÎñµ÷¶È£¬ÏÈ×ö¸ßÓÅÏȼ¶µÄÈÎÎñ
{
NoWork: 0, // No work is pending.
SynchronousPriority: 1, // Îı¾ÊäÈë¿ò
TaskPriority: 2, // µ±Ç°µ÷¶ÈÕýÖ´ÐеÄÈÎÎñ
AnimationPriority: 3, // ¶¯»¹ý¶É
HighPriority: 4, // Óû§½»»¥·´À¡
LowPriority: 5, // Êý¾ÝµÄ¸üÐÂ
OffscreenPriority: 6, // Ô¤¹ÀδÀ´ÐèÒªÏÔʾµÄÈÎÎñ
} |
3.ÈÎÎñµ÷¶ÈµÄ¹ý³ÌÊÇ£º
ÔÚÈÎÎñ¶ÓÁÐÖÐÑ¡³ö¸ßÓÅÏȼ¶µÄfiber nodeÖ´ÐУ¬µ÷ÓÃrequestIdleCallback»ñÈ¡Ëùʣʱ¼ä£¬ÈôÖ´ÐÐʱ¼ä³¬¹ýÁËdeathLine£¬»òÕßͻȻ²åÈë¸ü¸ßÓÅÏȼ¶µÄÈÎÎñ£¬ÔòÖ´ÐÐÖжϣ¬±£´æµ±Ç°½á¹û£¬ÐÞ¸Ätag±ê¼Çһϣ¬ÉèÖÃΪpending״̬£¬Ñ¸ËÙÊÕβ²¢ÔÙµ÷ÓÃÒ»¸örequestIdleCallback£¬µÈÖ÷Ïß³ÌÊͷųöÀ´ÔÙ¼ÌÐø
»Ö¸´ÈÎÎñÖ´ÐÐʱ£¬¼ì²étagÊDZ»ÖжϵÄÈÎÎñ£¬»á½Ó׿ÌÐø×öÈÎÎñ»òÕßÖØ×ö
Ò»¸öÈÎÎñµ¥ÔªÖ´ÐнáÊø»ò¹ÒÆð£¬»áµ÷ÓûùÓÚrequestIdleCallbackµÄµ÷¶ÈÆ÷£¬·µ»ØÒ»¸öеÄÈÎÎñ¶ÓÁмÌÐø½øÐÐÉÏÊö¹ý³Ì¡£
¡¤ÈçºÎÈÎÎñÑ»·
ÉÏÃæÎÒÃÇÓнéÉÜfiber nodeµÄÊôÐÔ´æ·ÅÉÏÏÂÎÄÐÅÏ¢µÄÖ¸Ïò¡£

¡¤child£ºÖ¸Ïòµ±Ç°½ÚµãµÄ×ӽڵ㡣µ±´Ë½ÚµãÈÎÎñ½áÊøºó£¬Èç¹ûchild´æÔÚ£¬¾Í¿ªÊ¼×Ó½ÚµãµÄÈÎÎñ
¡¤sibling: µ±×ÓÊ÷ÒѱéÀúµ½µ×²¿£¬»Øµ½¸¸½Úµãʱ£¬»áÄõ½¸¸½ÚµãµÄÐÖµÜ½Úµã½øÐÐÈÎÎñ
¡¤return: µ±µ±Ç°½ÚµãûÓÐ×Ó½Úµãʱ£¬»áÏòÉϻص½¸¸½Úµã
¡¤alternate
ÔÚµ÷ÓÃrender»òsetStateºó£¬»á¿Ë¡³öÒ»¸ö¾µÏñfiber£¬diff²úÉú³öµÄ±ä»¯»á±ê¼ÇÔÚ¾µÏñfiberÉÏ¡£¶øalternate¾ÍÊÇÁ´½Óµ±Ç°fiber
treeºÍ¾µÏñfiber tree, ÓÃÓڶϵã»Ö¸´¡£
workInProgress tree
ReactÖÐ¶ÔÆäÃèÊöÈçÏ£º
work-in-progress
A fiber that has not yet completed; conceptually,
a stack frame which has not yet returned.The alternate
of the current fiber is the work-in-progress, and
the alternate of the work-in-progress is the current
fiber.
µ±Ç°fiber½ÚµãµÄalternateÊôÐÔÖ¸ÏòworkInProgress½Úµã£¬¶ÔÓ¦workInProgress½ÚµãµÄalternateÊôÐÔÖ¸Ïòµ±Ç°fiber½Úµã¡£
ÉÏÃæalternateÖÐ˵µ½¾µÏñfiber tree¾ÍÊÇworkInProgress tree¡£
workInProgress treeÉÏÿ¸ö½Úµã¶¼ÓÐÒ»¸öeffect list£¬ÓÃÀ´´æ·ÅÐèÒª¸üеÄÄÚÈÝ¡£´Ë½Úµã¸üÐÂÍê±Ï»áÏò×Ó½Úµã»òÁÚ½ü½ÚµãºÏ²¢
effect list¡£
ÈÎÎñÑ»·µÄ¹ý³ÌÈçÏ£º
¡¤ÕÒµ½¸ßÓÅÏȼ¶µÄ´ý´¦ÀíµÄ½Úµã
¡¤¼ì²éµ±Ç°½ÚµãÊÇ·ñÐèÒª¸üУ¬²»ÐèÒªµÄ»°£¬Ö±½Óclone×ӽڵ㣬ֱ½Óµ½5
¡¤´ò¸ötag±ê¼Ç£¬¸üÐÂ×Ô¼º£¨×é¼þ¸üÐÂprops£¬contextµÈ£¬DOM½Úµã¼ÇÏÂDOM change£©
¡¤Í¨¹ýrender»ñÈ¡×ӽڵ㣬Éú³É×Ó½ÚµãµÄworkInProgress½Úµã
¡¤ÈôûÓвúÉú×ӽڵ㣬¹é²¢diff³öµÄ²»Í¬²¿·Öeffect list£¨°üº¬DOM change£©µ½¸¸½Úµã
¡¤°Ñ×Ó½Úµã»òÐֵܽڵã×÷Ϊ´ý´¦ÀíÈÎÎñ£¬×¼±¸½øÈëÏÂÒ»¸öÈÎÎñÑ»·¡£ÈôÒѾ»Øµ½ÁËworkInProgress
treeµÄ¸ù½Úµã£¬ÔòÈÎÎñÑ»·½áÊø
ͨ¹ýÿ¸ö½Úµã¸üнáÊøÊ±ÏòÉϹ鲢effect listÀ´ÊÕ¼¯ÈÎÎñ½á¹û£¬reconciliation½áÊøºó£¬¸ù½ÚµãµÄeffect
listÀï¼Ç¼Á˰üÀ¨DOM changeÔÚÄÚµÄËùÓÐside effect
ͨ¹ýÒ»¶Î´úÂ룬ÎÒÃÇÀ´¿´¿´ÈçºÎ½øÐÐÈÎÎñÑ»·£º
export class Home extend React.component<HomeProps,
any> {
componentWillReceiveProps(nextProps: HomeProps)
{}
componentDidMount() {}
componentDidUpdate() {}
componentWillUnmount() {}
.....
render() {
return ( <div className="top">
<span>ZZ</span> <button>click</button>
</div>
)
}
}
ReactDom.render(<Home />, document.querySelector(selectors:
'#hostRoot')) |
ÒÔËüΪÀý´´½¨fiber tree£º

1.´Ó¸ù½Úµã #hostRoot³ö·¢£¬×ßµ½ËüµÄchild½Úµã div.top
2.div.topÓÐÁ½¸ö×Ó½ÚµãspanºÍbutton £¬ÏÈ´Ó×ó×ÓÊ÷span¿ªÊ¼
3.spanÖ»ÓÐÒ»¸ö×Ó½Úµã ZZ£¬µ½´ïÊ÷µÄµ×²¿ºóÔ··µ»Ø
4.·µ»Øµ½spanʱ·¢ÏÖÆäÓÐÒ»¸öÐֵܽڵã button, ×ßÈ¥button
5.buttonÓÐÒ»¸ö×Ó½Úµã click, ͬÑùµ½´ïÊ÷µÄµ×²¿ºóÔ··µ»Øµ½button
6.buttonµÄÓÒ±ßûÓÐÐÖµÜÁË£¨ÈôÓУ¬Ôò¼ÌÐøÖØ¸´4-5£©£¬·µ»Øµ½¸¸½Úµã div.top
7.×îºó»Øµ½¸ù½Úµã #hostRoot
ÔÙ´ÎsetState»òrenderʱ£¬¹¹½¨workInProgress tree:

1.ÏȰѸù½Úµã #hostRoot¿Ë¡³öÀ´£¬²¢ÓÃchildÊôÐÔÖ¸ÏòËüÔÚfiber treeÖеÄ×Ó½Úµãdiv.top
2.°Ñdiv.top´Ófiber treeÖпË¡³öÀ´£¬ÐèÒª¸üÐµĻ°£¬¼ÓÒ»¸ötag±êÖ¾
3.¸üÐÂdiv.top½ÚµãµÄ״̬£¬ÊôÐÔµÄÖ¸ÏòµÈ£¬²¢Í¨¹ýrender»ñÈ¡µ½ËüµÄÐÂ×Ó½Úµã
4.¾¡Á¿¸´ÓþÉ×Ó½Úµãspan»òbuttonÀ´´´½¨ÐÂ×Ó½ÚµãµÄworkInProgress½á¹¹
5.°Ñнڵãbutton×öΪÏÂÒ»¸öÈÎÎñ£¬µ÷ÓÃrequestIdleCallback»ñÈ¡µ±Ç°Ö¡ËùÊ£ÓàµÄʱ¼ä£¬Èç¹û»¹×ã¹»£¬¾Í¼ÌÐøbuttonµÄÈÎÎñ£¬Öظ´2-4£¬·ñÔò£¬¾ÍµÈÖ÷Ï߳̿ÕÏкóÔÙ¿ªÊ¼Ñ»·
6.µ±×Ó½ÚµãsubmitÖÐûÓÐchildÊôÐÔµÄÖ¸Ïò£¬±íʾÒѵ½´ïµ×²¿¡£»á°Ñdiffʱ²úÉúµÄeffect list»ámerge»ØreturnÊôÐÔÖ¸ÏòµÄ¸¸½ÚµãbuttonÉÏ
7.µ±¸¸½ÚµãbuttonûÓÐÐֵܽڵãʱ£¬»áÒ»Ö±ÏòÉÏreturn»Ø¸ù½Úµã£¬²¢°Ñÿ¸ö½ÚµãÉϲúÉúµÄeffect-listºÏ²¢µ½¸ù½ÚµãÉÏ¡£ÈÎÎñÑ»·½áÊø
ÎÒÃÇÔÙÀ´¿´ÏÂÔ´ÂëÖеÄreconcilation½×¶Î£º
¡¤workLoop½×¶Î
Ê×ÏÈ»ñÈ¡µ½ÏÂÒ»¸öÈÎÎñµÄÖ´ÐÐÓÅÏȼ¶£¬µ÷ÓÃÒ»¸öperformUnitOfWorkº¯Êý½øÈëreconcilation½×¶ÎµÄ¹¤×÷,
·ÖΪbeginWorkºÍcompleteWork
1¡¢beginWork

beginWorkÖÐÖ»ÊÇ´¦Àí½ÚµãµÄ²»Í¬tagÊôÐÔ¶ÔÓ¦²»Í¬µÄ¸üз½·¨¡£Èç updateClassComponent·½·¨¶ÔÓ¦µÄÊÇtagÀàÐÍÊÇReact×é¼þʵÀý¡£

reconcileChildren ʵÏÖ¶ÔÐÂÀϽڵãµÄdiff¡£ÆäÄÚ²¿Ö÷ÒªÊǵ÷Óà reconcileChildFibers
·½·¨¡£

ReactÖÐdiffÊÇ»ùÓÚͬ²ã¼¶½ÚµãµÄ£¬½ÚµãµÄÒÆ¶¯/²åÈë/ɾ³ýµÈ²Ù×÷¶¼ÊÇÔÚfiber treeµÄͬһ²ã¼¶ÖнøÐС£

2¡¢ completeWork
completeWorkµÄ¹¤×÷Ö÷ÒªÊÇͨ¹ýÐÂÀϽڵãµÄprop»òtagµÈ£¬ÊÕ¼¯½ÚµãµÄeffect-list¡£È»ºóÏòÉÏÒ»²ãÒ»²ãÑ»·£¬mergeÿ¸ö½ÚµãµÄeffect-list£¬µ±µ½´ï¸ù½Úµã#hostRootʱ£¬½ÚµãÉϰüº¬ËùÓеÄeffect-list¡£²¢°Ñeffect-list´«¸øpendingcommit£¬½øÈëcommit½×¶Î¡£

¡¤Fiber¶ÔÉúÃüÖÜÆÚµÄÓ°Ïì
// reconciliation½×¶Î
componentWillMount
componentWillReceiveProps
shouldComponentUpdate
componentWillUpdate
--------------------------------
// commit½×¶Î
componentDidMount
componentDidUpdate
componentWillUnmount |
ÔÚÎÒÃÇ֮ǰµÄÎÄÕÂÖÐÒ²½éÉܹý£¬ÔÚreconciliation½×¶Î£¬ÉúÃüÖÜÆÚº¯Êý»á±»¶à´Îµ÷Ó㬿ª·¢ÕßÉ÷ÖØµ÷ÓÃÕâ¸ö½×¶ÎµÄÉúÃüÖÜÆÚ¡£
Reactv16.3ÒѾ¿ªÊ¼ÁË·ÏÆú¼Æ»®£º
16.3°æ±¾£ºÒýÈë´øUNSAFE_ǰ׺µÄ3¸öÉúÃüÖÜÆÚº¯ÊýUNSAFE_componentWillMount£¬UNSAFE_componentWillReceivePropsºÍUNSAFE_componentWillUpdate£¬Õâ¸ö½×¶ÎоÉ6¸öº¯Êý¶¼ÄÜÓá£ÐÂÒýÈëÉúÃüÖÜÆÚº¯ÊýgetDerivedStateFromPropsºÍgetSnapshotBeforeUpdate£¬ÓÃÀ´´úÌæcomponentWillReceivePropsºÍcomponentWillUpdate
16.3+°æ±¾£º¾¯¸æcomponentWillMount£¬componentWillReceivePropsºÍcomponentWillUpdate¼´½«¹ýʱ£¬Õâ¸ö½×¶ÎоÉ6¸öº¯ÊýÒ²¶¼ÄÜÓã¬Ö»ÊǾɵÄÔÚDEV»·¾³»á±¨Warning
17.0°æ±¾£ºÕýʽ·ÏÆúcomponentWillMount£¬componentWillReceivePropsºÍcomponentWillUpdate£¬Õâ¸ö½×¶ÎÖ»ÓÐеĴøUNSAFE_ǰ׺µÄ3¸öº¯ÊýÄÜÓ㬾ɵIJ»»áÔÙ´¥·¢ |