Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Áù¸öÎÊÌâÈÃÄã¸ü¶® React Fiber
 
×÷ÕߣºÁãÒ»0101
  1609  次浏览      27
 2021-8-3
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½éÉÜ´ÓÁù¸öÎÊÌâ³ö·¢£¬¶Ô React Fiber ½øÐÐÀí½âÓëÈÏʶ£¬Í¬Ê±¶ÔʱÏÂÈÈÃŵÄǰ¶Ë¿ò¼ÜSvelte½øÐмòÒª½éÉÜÓëÆÊÎö¡£
±¾ÎÄÀ´×ÔÓÚǰ¶ËÓ¡Ïó ,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­ÍƼö¡£

React µÄÉè¼ÆÀíÄîÊÇʲô£¿

React¹ÙÍøÔÚReactÕÜѧ[4]Ò»½Ú¿ªÆªÌáµ½£º

ÎÒÃÇÈÏΪ£¬React ÊÇÓà JavaScript ¹¹½¨¿ìËÙÏìÓ¦µÄ´óÐÍ Web Ó¦ÓóÌÐòµÄÊ×Ñ¡·½Ê½¡£ËüÔÚ Facebook ºÍ Instagram ÉϱíÏÖÓÅÐã¡£React ×î°ôµÄ²¿·ÖÖ®Ò»ÊÇÒýµ¼ÎÒÃÇ˼¿¼ÈçºÎ¹¹½¨Ò»¸öÓ¦Óá£

Óɴ˿ɼû£¬React ×·ÇóµÄÊÇ ¡°¿ìËÙÏìÓ¦¡±£¬ÄÇô£¬¡°¿ìËÙÏìÓ¦¡°µÄÖÆÔ¼ÒòËØ¶¼ÓÐÊ²Ã´ÄØ£¿

¡¤CPUµÄÆ¿¾±£ºµ±ÏîÄ¿±äµÃÅÓ´ó¡¢×é¼þÊýÁ¿·±¶à¡¢Óöµ½´ó¼ÆËãÁ¿µÄ²Ù×÷»òÕßÉ豸ÐÔÄܲ»×ãʹµÃÒ³ÃæµôÖ¡£¬µ¼Ö¿¨¶Ù¡£

¡¤ IOµÄÆ¿¾±£º·¢ËÍÍøÂçÇëÇóºó£¬ÓÉÓÚÐèÒªµÈ´ýÊý¾Ý·µ»Ø²ÅÄܽøÒ»²½²Ù×÷µ¼Ö²»ÄÜ¿ìËÙÏìÓ¦¡£

±¾ÎÄÒªÁĵÄfiber ¼Ü¹¹Ö÷Òª¾ÍÊÇÓÃÀ´½â¾ö CPU ºÍÍøÂçµÄÎÊÌ⣬ÕâÁ½¸öÎÊÌâÒ»Ö±Ò²ÊÇ×îÓ°Ïìǰ¶Ë¿ª·¢ÌåÑéµÄµØ·½£¬Ò»¸ö»áÔì³É¿¨¶Ù£¬Ò»¸ö»áÔì³É°×ÆÁ¡£Îª´Ë react Ϊǰ¶ËÒýÈëÁËÁ½¸öиÅÄTime Slicing ʱ¼ä·ÖƬºÍSuspense¡£

ReactµÄ¡°ÏÈÌì²»×㡱 ¡ª¡ª Ìý˵ Vue 3.0 ²ÉÓÃÁ˶¯¾²½áºÏµÄ Dom diff£¬React ΪºÎ²»¸ú½ø£¿

Vue 3.0 ¶¯¾²½áºÏµÄ Dom diff

Vue3.0 Ìá³ö¶¯¾²½áºÏµÄ DOM diff ˼Ï룬¶¯¾²½áºÏµÄ DOM diffÆäʵÊÇÔÚÔ¤±àÒë½×¶Î½øÐÐÁËÓÅ»¯¡£Ö®ËùÒÔÄܹ»×öµ½Ô¤±àÒëÓÅ»¯£¬ÊÇÒòΪ Vue core ¿ÉÒÔ¾²Ì¬·ÖÎö template£¬ÔÚ½âÎöÄ£°æÊ±£¬Õû¸ö parse µÄ¹ý³ÌÊÇÀûÓÃÕýÔò±í´ïʽ˳Ðò½âÎöÄ£°å£¬µ±½âÎöµ½¿ªÊ¼±êÇ©¡¢±ÕºÏ±êÇ©ºÍÎı¾µÄʱºò¶¼»á·Ö±ðÖ´ÐжÔÓ¦µÄ»Øµ÷º¯Êý£¬À´´ïµ½¹¹Ôì AST Ê÷µÄÄ¿µÄ¡£

½èÖúÔ¤±àÒë¹ý³Ì£¬Vue ¿ÉÒÔ×öµ½µÄÔ¤±àÒëÓÅ»¯¾ÍºÜÇ¿´óÁË¡£±ÈÈçÔÚÔ¤±àÒëʱ±ê¼Ç³öÄ£°æÖпÉÄܱ仯µÄ×é¼þ½Úµã£¬ÔٴνøÐÐäÖȾǰ diff ʱ¾Í¿ÉÒÔÌø¹ý¡°ÓÀÔ¶²»»á±ä»¯µÄ½Úµã¡±£¬¶øÖ»ÐèÒª¶Ô±È¡°¿ÉÄÜ»á±ä»¯µÄ¶¯Ì¬½Úµã¡±¡£ÕâÒ²¾ÍÊǶ¯¾²½áºÏµÄ DOM diff ½« diff ³É±¾ÓëÄ£°æ´óСÕýÏà¹ØÓÅ»¯µ½Ó붯̬½ÚµãÕýÏà¹ØµÄÀíÂÛÒÀ¾Ý¡£

React ÄÜ·ñÏñ Vue ÄÇÑù½øÐÐÔ¤±àÒëÓÅ»¯£¿

Vue ÐèÒª×öÊý¾ÝË«Ïò°ó¶¨£¬ÐèÒª½øÐÐÊý¾ÝÀ¹½Ø»ò´úÀí£¬ÄÇËü¾ÍÐèÒªÔÚÔ¤±àÒë½×¶Î¾²Ì¬·ÖÎöÄ£°æ£¬·ÖÎö³öÊÓͼÒÀÀµÁËÄÄЩÊý¾Ý£¬½øÐÐÏìӦʽ´¦Àí¡£¶ø React ¾ÍÊǾֲ¿ÖØÐÂäÖȾ£¬React Äõ½µÄ»òÕßËµÕÆ¹ÜµÄ£¬Ëù¸ºÔðµÄ¾ÍÊÇÒ»¶ÑµÝ¹é React.createElement µÄÖ´Ðе÷Ó㨲ο¼Ï·½¾­¹ýBabelת»»µÄ´úÂ룩£¬ËüÎÞ·¨´ÓÄ£°æ²ãÃæ½øÐо²Ì¬·ÖÎö¡£JSX ºÍÊÖдµÄ render function[5] ÊÇÍêÈ«¶¯Ì¬µÄ£¬¹ý¶ÈµÄÁé»îÐÔµ¼ÖÂÔËÐÐʱ¿ÉÒÔÓÃÓÚÓÅ»¯µÄÐÅÏ¢²»×ã¡£

JSX д·¨£º

<div>
<h1>Áù¸öÎÊÌâÖúÄãÀí½â React Fiber</h1>
<ul>
<li>React</li>
<li>Vue</li>
</ul>
</div>

µÝ¹é React.createElement£º

// Babelת»»ºó
React.createElement(
"div",
null,
React.createElement(
"h1",
null,
"\u516D\u4E2A\u95EE\u9898\u52A9\u4F60\u7406\u89E3 React Fiber"
),
React.createElement(
"ul",
null,
React.createElement("li", null, "React"),
React.createElement("li", null, "Vue")
)
);

JSX vs Template

jsx and Templates

JSX ¾ßÓÐ JavaScript µÄÍêÕû±íÏÖÁ¦£¬¿ÉÒÔ¹¹½¨·Ç³£¸´ÔÓµÄ×é¼þ¡£µ«ÊÇÁé»îµÄÓï·¨£¬Ò²Òâζ×ÅÒýÇæÄÑÒÔÀí½â£¬ÎÞ·¨Ô¤Åпª·¢ÕßµÄÓû§Òâͼ£¬´Ó¶øÄÑÒÔÓÅ»¯ÐÔÄÜ¡£

Template Ä£°åÊÇÒ»Öַdz£ÓÐÔ¼ÊøµÄÓïÑÔ£¬ÄãÖ»ÄÜÒÔijÖÖ·½Ê½È¥±àдģ°å¡£

¼ÈÈ»´æÔÚÒÔÉϱàÒëʱÏÈÌì²»×㣬ÔÚÔËÐÐʱÓÅ»¯·½Ã棬ReactÒ»Ö±ÔÚŬÁ¦¡£±ÈÈ磬React15ʵÏÖÁËbatchedUpdates£¨ÅúÁ¿¸üУ©¡£¼´Í¬Ò»Ê¼þ»Øµ÷º¯ÊýÉÏÏÂÎÄÖеĶà´ÎsetStateÖ»»á´¥·¢Ò»´Î¸üС£

µ«ÊÇ£¬Èç¹ûµ¥´Î¸üоͺܺÄʱ£¬Ò³Ã滹ÊǻῨ¶Ù£¨ÕâÔÚÒ»¸öά»¤Ê±¼äºÜ³¤µÄ´óÓ¦ÓÃÖÐÊǺܳ£¼ûµÄ£©¡£ÕâÊÇÒòΪReact15µÄ¸üÐÂÁ÷³ÌÊÇͬ²½Ö´Ðеģ¬Ò»µ©¿ªÊ¼¸üÐÂÖ±µ½Ò³ÃæäÖȾǰ¶¼²»ÄÜÖжϡ£

´Ó¼Ü¹¹Ñݱ俴²»¶Ï½ø»÷µÄ React ¶¼×ö¹ýÄÄЩÓÅ»¯£¿

ReactäÖÈ¾Ò³ÃæµÄÁ½¸ö½×¶Î

µ÷¶È½×¶Î£¨reconciliation£©£ºÔÚÕâ¸ö½×¶Î React »á¸üÐÂÊý¾ÝÉú³ÉÐ嵀 Virtual DOM£¬È»ºóͨ¹ýDiffËã·¨£¬¿ìËÙÕÒ³öÐèÒª¸üеÄÔªËØ£¬·Åµ½¸üжÓÁÐÖÐÈ¥£¬µÃµ½ÐµĸüжÓÁС£

äÖȾ½×¶Î£¨commit£©£ºÕâ¸ö½×¶Î React »á±éÀú¸üжÓÁУ¬½«ÆäËùÓеıä¸üÒ»´ÎÐÔ¸üе½DOMÉÏ¡£

React 15 ¼Ü¹¹

React15¼Ü¹¹¿ÉÒÔ·ÖΪÁ½²ã£º

Reconciler£¨Ð­µ÷Æ÷£©¡ª¡ª ¸ºÔðÕÒ³ö±ä»¯µÄ×é¼þ£»

Renderer£¨äÖȾÆ÷£©¡ª¡ª ¸ºÔ𽫱仯µÄ×é¼þäÖȾµ½Ò³ÃæÉÏ£»

ÔÚReact15¼°ÒÔǰ£¬Reconciler²ÉÓõݹéµÄ·½Ê½´´½¨ÐéÄâDOM£¬µÝ¹é¹ý³ÌÊDz»ÄÜÖжϵġ£Èç¹û×é¼þÊ÷µÄ²ã¼¶ºÜÉµÝ¹é»áÕ¼ÓÃÏ̺߳ܶàʱ¼ä£¬µÝ¹é¸üÐÂʱ¼ä³¬¹ýÁË16ms£¬Óû§½»»¥¾Í»á¿¨¶Ù¡£

ΪÁ˽â¾öÕâ¸öÎÊÌ⣬React16½«µÝ¹éµÄÎÞ·¨ÖжϵĸüÐÂÖØ¹¹ÎªÒì²½µÄ¿ÉÖжϸüУ¬ÓÉÓÚÔø¾­ÓÃÓڵݹéµÄÐéÄâDOMÊý¾Ý½á¹¹ÒѾ­ÎÞ·¨Âú×ãÐèÒª¡£ÓÚÊÇ£¬È«ÐµÄFiber¼Ü¹¹Ó¦Ô˶øÉú¡£

React 16 ¼Ü¹¹

ΪÁ˽â¾öͬ²½¸üг¤Ê±¼äÕ¼ÓÃÏ̵߳¼ÖÂÒ³Ãæ¿¨¶ÙµÄÎÊÌ⣬ҲΪÁË̽Ë÷ÔËÐÐʱÓÅ»¯µÄ¸ü¶à¿ÉÄÜ£¬React¿ªÊ¼Öع¹²¢Ò»Ö±³ÖÐøÖÁ½ñ¡£Öع¹µÄÄ¿±êÊÇʵÏÖConcurrent Mode£¨²¢·¢Ä£Ê½£©¡£

´Óv15µ½v16£¬ReactÍŶӻ¨ÁËÁ½Äêʱ¼ä½«Ô´Âë¼Ü¹¹ÖеÄStack ReconcilerÖØ¹¹ÎªFiber Reconciler¡£

React16¼Ü¹¹¿ÉÒÔ·ÖΪÈý²ã£º

Scheduler£¨µ÷¶ÈÆ÷£©¡ª¡ª µ÷¶ÈÈÎÎñµÄÓÅÏȼ¶£¬¸ßÓÅÈÎÎñÓÅÏȽøÈëReconciler£»

Reconciler£¨Ð­µ÷Æ÷£©¡ª¡ª ¸ºÔðÕÒ³ö±ä»¯µÄ×é¼þ£º¸üй¤×÷´ÓµÝ¹é±ä³ÉÁË¿ÉÒÔÖжϵÄÑ­»·¹ý³Ì¡£ReconcilerÄÚ²¿²ÉÓÃÁËFiberµÄ¼Ü¹¹£»

Renderer£¨äÖȾÆ÷£©¡ª¡ª ¸ºÔ𽫱仯µÄ×é¼þäÖȾµ½Ò³ÃæÉÏ¡£

React 17 ÓÅ»¯

React16µÄexpirationTimesÄ£ÐÍÖ»ÄÜÇø·ÖÊÇ·ñ >=expirationTimes ¾ö¶¨½ÚµãÊÇ·ñ¸üС£React17µÄlanesÄ£ÐÍ¿ÉÒÔÑ¡¶¨Ò»¸ö¸üÐÂÇø¼ä£¬²¢ÇÒ¶¯Ì¬µÄÏòÇø¼äÖÐÔö¼õÓÅÏȼ¶£¬¿ÉÒÔ´¦Àí¸üϸÁ£¶ÈµÄ¸üС£

LaneÓöþ½øÖÆÎ»±íʾÈÎÎñµÄÓÅÏȼ¶£¬·½±ãÓÅÏȼ¶µÄ¼ÆË㣨λÔËË㣩£¬²»Í¬ÓÅÏȼ¶Õ¼Óò»Í¬Î»Öõġ°ÈüµÀ¡±£¬¶øÇÒ´æÔÚÅúµÄ¸ÅÄÓÅÏȼ¶Ô½µÍ£¬¡°ÈüµÀ¡±Ô½¶à¡£¸ßÓÅÏȼ¶´ò¶ÏµÍÓÅÏȼ¶£¬Ð½¨µÄÈÎÎñÐèÒª¸³ÓèʲôÓÅÏȼ¶µÈÎÊÌâ¶¼ÊÇLaneËùÒª½â¾öµÄÎÊÌâ¡£

Concurrent ModeµÄÄ¿µÄÊÇʵÏÖÒ»Ì׿ÉÖжÏ/»Ö¸´µÄ¸üлúÖÆ¡£ÆäÓÉÁ½²¿·Ö×é³É£º

Ò»Ì×Э³Ì¼Ü¹¹£ºFiber Reconciler

»ùÓÚЭ³Ì¼Ü¹¹µÄÆô·¢Ê½¸üÐÂËã·¨£º¿ØÖÆÐ­³Ì¼Ü¹¹¹¤×÷·½Ê½µÄËã·¨

ä¯ÀÀÆ÷Ò»Ö¡¶¼»á¸ÉЩʲôÒÔ¼°requestIdleCallbackµÄÆôʾ

ä¯ÀÀÆ÷Ò»Ö¡¶¼»á¸ÉЩʲô£¿

ÎÒÃǶ¼ÖªµÀ£¬Ò³ÃæµÄÄÚÈݶ¼ÊÇÒ»Ö¡Ò»Ö¡»æÖƳöÀ´µÄ£¬ä¯ÀÀÆ÷Ë¢ÐÂÂÊ´ú±íä¯ÀÀÆ÷Ò»Ãë»æÖÆ¶àÉÙÖ¡¡£Ô­ÔòÉÏ˵ 1s ÄÚ»æÖƵÄÖ¡ÊýÒ²¶à£¬»­Ãæ±íÏÖ¾ÍҲϸÄ塣Ŀǰä¯ÀÀÆ÷´ó¶àÊÇ 60Hz£¨60Ö¡/s£©£¬Ã¿Ò»Ö¡ºÄʱҲ¾ÍÊÇÔÚ 16.6ms ×óÓÒ¡£ÄÇôÔÚÕâÒ»Ö¡µÄ£¨16.6ms£© ¹ý³ÌÖÐä¯ÀÀÆ÷ÓÖ¸ÉÁËÐ©Ê²Ã´ÄØ£¿

ͼƬä¯ÀÀÆ÷Ò»Ö¡¶¼»á¸ÉЩʲô

ͨ¹ýÉÏÃæÕâÕÅͼ¿ÉÒÔÇå³þµÄÖªµÀ£¬ä¯ÀÀÆ÷Ò»Ö¡»á¾­¹ýÏÂÃæÕ⼸¸ö¹ý³Ì£º

1.½ÓÊÜÊäÈëʼþ

2.Ö´ÐÐʼþ»Øµ÷

3.¿ªÊ¼Ò»Ö¡

4.Ö´ÐÐ RAF (RequestAnimationFrame)

5.Ò³Ãæ²¼¾Ö£¬Ñùʽ¼ÆËã

6.»æÖÆäÖȾ

7.Ö´ÐÐ RIC (RequestIdelCallback)

µÚÆß²½µÄ RIC ʼþ²»ÊÇÿһ֡½áÊø¶¼»áÖ´ÐУ¬Ö»ÓÐÔÚÒ»Ö¡µÄ 16.6ms ÖÐ×öÍêÁËÇ°Ãæ 6 ¼þʶùÇÒ»¹ÓÐÊ£Óàʱ¼ä£¬²Å»áÖ´ÐС£Èç¹ûÒ»Ö¡Ö´ÐнáÊøºó»¹ÓÐʱ¼äÖ´ÐÐ RIC ʼþ£¬ÄÇôÏÂÒ»Ö¡ÐèÒªÔÚʼþÖ´ÐнáÊø²ÅÄܼÌÐøäÖȾ£¬ËùÒÔ RIC Ö´Ðв»Òª³¬¹ý 30ms£¬Èç¹û³¤Ê±¼ä²»½«¿ØÖÆÈ¨½»»¹¸øä¯ÀÀÆ÷£¬»áÓ°ÏìÏÂÒ»Ö¡µÄäÖȾ£¬µ¼ÖÂÒ³Ãæ³öÏÖ¿¨¶ÙºÍʼþÏìÓ¦²»¼°Ê±¡£

requestIdleCallback µÄÆôʾ

ÎÒÃÇÒÔä¯ÀÀÆ÷ÊÇ·ñÓÐÊ£Óàʱ¼ä×÷ΪÈÎÎñÖжϵıê×¼£¬ÄÇôÎÒÃÇÐèÒªÒ»ÖÖ»úÖÆ£¬µ±ä¯ÀÀÆ÷ÓÐÊ£Óàʱ¼äʱ֪ͨÎÒÃÇ¡£

requestIdleCallback((deadline) => {
// deadline ÓÐÁ½¸ö²ÎÊý
// timeRemaining(): µ±Ç°Ö¡»¹Ê£Ï¶àÉÙʱ¼ä
// didTimeout: ÊÇ·ñ³¬Ê±
// ÁíÍâ requestIdleCallback ºóÈç¹û¸úÉϵڶþ¸ö²ÎÊý {timeout: ...} Ôò»áÇ¿ÖÆä¯ÀÀÆ÷ÔÚµ±Ç°Ö¡Ö´ÐÐÍêºóÖ´ÐС£
if (deadline.timeRemaining() > 0) {
// TODO
} else {
requestIdleCallback(otherTasks);
}
});
// Ó÷¨Ê¾Àý
var tasksNum = 10000

requestIdleCallback(unImportWork)

function unImportWork(deadline) {
while (deadline.timeRemaining() && tasksNum > 0) {
console.log(`Ö´ÐÐÁË ${10000 - tasksNum + 1}¸öÈÎÎñ`)
tasksNum--
}
if (tasksNum > 0) { // ÔÚδÀ´µÄÖ¡ÖмÌÐøÖ´ÐÐ
requestIdleCallback(unImportWork)
}
}

Æäʵ²¿·Öä¯ÀÀÆ÷ÒѾ­ÊµÏÖÁËÕâ¸öAPI£¬Õâ¾ÍÊÇrequestIdleCallback¡£µ«ÊÇÓÉÓÚÒÔÏÂÒòËØ£¬Facebook ÅׯúÁË requestIdleCallback µÄÔ­Éú API£º

ä¯ÀÀÆ÷¼æÈÝÐÔ£»

´¥·¢ÆµÂʲ»Îȶ¨£¬ÊܺܶàÒòËØÓ°Ïì¡£±ÈÈçµ±ÎÒÃǵÄä¯ÀÀÆ÷Çл»tabºó£¬Ö®Ç°tab×¢²áµÄrequestIdleCallback´¥·¢µÄƵÂÊ»á±äµÃºÜµÍ¡£

»ùÓÚÒÔÉÏÔ­Òò£¬ÔÚReactÖÐʵÏÖÁ˹¦ÄܸüÍ걸µÄrequestIdleCallbackpolyfill£¬Õâ¾ÍÊÇScheduler¡£³ýÁËÔÚ¿ÕÏÐʱ´¥·¢»Øµ÷µÄ¹¦ÄÜÍ⣬Scheduler»¹ÌṩÁ˶àÖÖµ÷¶ÈÓÅÏȼ¶¹©ÈÎÎñÉèÖá£

Fiber ΪʲôÊÇ React ÐÔÄܵÄÒ»¸ö·ÉÔ¾£¿

ʲôÊÇ Fiber

Fiber µÄÓ¢Îĺ¬ÒåÊÇ¡°ÏËά¡±£¬ËüÊDZÈỊ̈߳¨Thread£©¸üϸµÄÏߣ¬±ÈỊ̈߳¨Thread£©¿ØÖƵøü¾«ÃܵÄÖ´ÐÐÄ£ÐÍ¡£ÔÚ¹ãÒ弯Ëã»ú¿ÆÑ§¸ÅÄîÖУ¬Fiber ÓÖÊÇÒ»ÖÖЭ×÷µÄ£¨Cooperative£©±à³ÌÄ£ÐÍ£¨Ð­³Ì£©£¬°ïÖú¿ª·¢ÕßÓÃÒ»ÖÖ¡¾¼ÈÄ£¿é»¯ÓÖЭ×÷»¯¡¿µÄ·½Ê½À´±àÅÅ´úÂë¡£

ÔÚ React ÖУ¬Fiber ¾ÍÊÇ React 16 ʵÏÖµÄÒ»Ì×еĸüлúÖÆ£¬Èà React µÄ¸üйý³Ì±äµÃ¿É¿Ø£¬±ÜÃâÁË֮ǰ²ÉÓõݹéÐèÒªÒ»ÆøºÇ³ÉÓ°ÏìÐÔÄܵÄ×ö·¨¡£

React Fiber ÖеÄʱ¼ä·ÖƬ

°ÑÒ»¸öºÄʱ³¤µÄÈÎÎñ·Ö³ÉºÜ¶àСƬ£¬Ã¿Ò»¸öСƬµÄÔËÐÐʱ¼äºÜ¶Ì£¬ËäÈ»×Üʱ¼äÒÀÈ»ºÜ³¤£¬µ«ÊÇÔÚÿ¸öСƬִÐÐÍêÖ®ºó£¬¶¼¸øÆäËûÈÎÎñÒ»¸öÖ´ÐеĻú»á£¬ÕâÑùΨһµÄÏ߳̾Ͳ»»á±»¶ÀÕ¼£¬ÆäËûÈÎÎñÒÀÈ»ÓÐÔËÐеĻú»á¡£

React Fiber °Ñ¸üйý³ÌË鯬»¯£¬Ã¿Ö´ÐÐÍêÒ»¶Î¸üйý³Ì£¬¾Í°Ñ¿ØÖÆÈ¨½»»¹¸ø React ¸ºÔðÈÎÎñЭµ÷µÄÄ£¿é£¬¿´¿´ÓÐûÓÐÆäËû½ô¼±ÈÎÎñÒª×ö£¬Èç¹ûûÓоͼÌÐøÈ¥¸üУ¬Èç¹ûÓнô¼±ÈÎÎñ£¬ÄǾÍÈ¥×ö½ô¼±ÈÎÎñ¡£

Stack Reconciler

»ùÓÚÕ»µÄ Reconciler£¬ä¯ÀÀÆ÷ÒýÇæ»á´ÓÖ´ÐÐÕ»µÄ¶¥¶Ë¿ªÊ¼Ö´ÐУ¬Ö´ÐÐÍê±Ï¾Íµ¯³öµ±Ç°Ö´ÐÐÉÏÏÂÎÄ£¬¿ªÊ¼Ö´ÐÐÏÂÒ»¸öº¯Êý£¬Ö±µ½Ö´ÐÐÕ»±»Çå¿Õ²Å»áÍ£Ö¹¡£È»ºó½«Ö´ÐÐȨ½»»¹¸øä¯ÀÀÆ÷¡£ÓÉÓÚ React ½«Ò³ÃæÊÓͼÊÓ×÷Ò»¸ö¸öº¯ÊýÖ´ÐеĽá¹û¡£Ã¿Ò»¸öÒ³ÃæÍùÍùÓɶà¸öÊÓͼ×é³É£¬Õâ¾ÍÒâζ×Ŷà¸öº¯ÊýµÄµ÷Óá£

Èç¹ûÒ»¸öÒ³Ãæ×ã¹»¸´ÔÓ£¬Ðγɵĺ¯Êýµ÷ÓÃÕ»¾Í»áºÜÉÿһ´Î¸üУ¬Ö´ÐÐÕ»ÐèÒªÒ»´ÎÐÔÖ´ÐÐÍê³É£¬ÖÐ;²»Ä܏ɯäËûµÄʶù£¬Ö»ÄÜ"Ò»ÐÄÒ»Òâ"¡£½áºÏÇ°ÃæÌáµ½µÄä¯ÀÀÆ÷Ë¢ÐÂÂÊ£¬JS Ò»Ö±Ö´ÐУ¬ä¯ÀÀÆ÷µÃ²»µ½¿ØÖÆÈ¨£¬¾Í²»Äܼ°Ê±¿ªÊ¼ÏÂÒ»Ö¡µÄ»æÖÆ¡£Èç¹ûÕâ¸öʱ¼ä³¬¹ý 16ms£¬µ±Ò³ÃæÓж¯»­Ð§¹ûÐèÇóʱ£¬¶¯»­ÒòΪä¯ÀÀÆ÷²»Äܼ°Ê±»æÖÆÏÂÒ»Ö¡£¬Õâʱ¶¯»­¾Í»á³öÏÖ¿¨¶Ù¡£²»½öÈç´Ë£¬ÒòΪʼþÏìÓ¦´úÂëÊÇÔÚÿһ֡¿ªÊ¼µÄʱºòÖ´ÐУ¬Èç¹û²»Äܼ°Ê±»æÖÆÏÂÒ»Ö¡£¬Ê¼þÏìÓ¦Ò²»áÑÓ³Ù¡£

Fiber Reconciler

Á´±í½á¹¹

ÔÚ React Fiber ÖÐÓÃÁ´±í±éÀúµÄ·½Ê½Ìæ´úÁË React 16 ֮ǰµÄÕ»µÝ¹é·½°¸¡£ÔÚ React 16 ÖÐʹÓÃÁË´óÁ¿µÄÁ´±í¡£

ʹÓöàÏòÁ´±íµÄÐÎÊ½Ìæ´úÁËÔ­À´µÄÊ÷½á¹¹£»

<div id="A">
A1
<div id="B1">
B1
<div id="C1"></div>
</div>
<div id="B2">
B2
</div>
</div>

¶àÏòÁ´±í

¸±×÷Óõ¥Á´±í£»

¸±×÷Óõ¥Á´±í

״̬¸üе¥Á´±í£»

״̬¸üе¥Á´±í

Á´±íÊÇÒ»ÖÖ¼òµ¥¸ßЧµÄÊý¾Ý½á¹¹£¬ËüÔÚµ±Ç°½ÚµãÖб£´æ×ÅÖ¸ÏòÏÂÒ»¸ö½ÚµãµÄÖ¸Õ룻±éÀúµÄʱºò£¬Í¨¹ý²Ù×÷Ö¸ÕëÕÒµ½ÏÂÒ»¸öÔªËØ¡£

Á´±í

Á´±íÏà±È˳Ðò½á¹¹Êý¾Ý¸ñʽµÄºÃ´¦¾ÍÊÇ£º

1.²Ù×÷¸ü¸ßЧ£¬±ÈÈç˳Ðòµ÷Õû¡¢É¾³ý£¬Ö»ÐèÒª¸Ä±ä½ÚµãµÄÖ¸ÕëÖ¸Ïò¾ÍºÃÁË¡£

2.²»½ö¿ÉÒÔ¸ù¾Ýµ±Ç°½ÚµãÕÒµ½ÏÂÒ»¸ö½Úµã£¬ÔÚ¶àÏòÁ´±íÖУ¬»¹¿ÉÒÔÕÒµ½ËûµÄ¸¸½Úµã»òÕßÐֵܽڵ㡣

µ«Á´±íÒ²²»ÊÇÍêÃÀµÄ£¬È±µã¾ÍÊÇ£º

1.±È˳Ðò½á¹¹Êý¾Ý¸üÕ¼Óÿռ䣬ÒòΪÿ¸ö½Úµã¶ÔÏó»¹±£´æÓÐÖ¸ÏòÏÂÒ»¸ö¶ÔÏóµÄÖ¸Õë¡£

2.²»ÄÜ×ÔÓɶÁÈ¡£¬±ØÐëÕÒµ½ËûµÄÉÏÒ»¸ö½Úµã¡£

React Óÿռ任ʱ¼ä£¬¸ü¸ßЧµÄ²Ù×÷¿ÉÒÔ·½±ã¸ù¾ÝÓÅÏȼ¶½øÐвÙ×÷¡£Í¬Ê±¿ÉÒÔ¸ù¾Ýµ±Ç°½ÚµãÕÒµ½ÆäËû½Úµã£¬ÔÚÏÂÃæÌáµ½µÄ¹ÒÆðºÍ»Ö¸´¹ý³ÌÖÐÆðµ½Á˹ؼü×÷Óá£

ì³²¨ÄÇÆõÊýÁÐµÄ Fiber

µÝ¹éÐÎʽµÄì³²¨ÄÇÆõÊýÁÐд·¨£º

function fib(n) {
if (n <= 2) {
return 1;
} else {
return fib(n - 1) + fib(n - 2);
}
}

²ÉÓà Fiber µÄ˼·½«Æä¸ÄдΪѭ»·£¨Õâ¸öÀý×Ó²¢²»ÄÜºÍ React Fiber µÄ¶ÔµÈ£©£º

function fib(n) {
let fiber = { arg: n, returnAddr: null, a: 0 }, consoled = false;
// ±ê¼ÇÑ­»·
rec: while (true) {
// µ±Õ¹¿ªÍêÈ«ºó£¬¿ªÊ¼¼ÆËã
if (fiber.arg <= 2) {
let sum = 1;
// ѰÕÒ¸¸¼¶
while (fiber.returnAddr) {
if(!consoled) {
// ÔÚÕâÀï´òÓ¡²é¿´ÐγɵÄÁ´±íÐÎʽµÄ fiber ¶ÔÏó
consoled=true
console.log(fiber)
}
fiber = fiber.returnAddr;
if (fiber.a === 0) {
fiber.a = sum;
fiber = { arg: fiber.arg - 2, returnAddr: fiber, a: 0 };
continue rec;
}
sum += fiber.a;
}
return sum;
} else {
// ÏÈÕ¹¿ª
fiber = { arg: fiber.arg - 1, returnAddr: fiber, a: 0 };
}
}
}

React Fiber ÊÇÈçºÎʵÏÖ¸üйý³Ì¿É¿Ø£¿

¸üйý³ÌµÄ¿É¿ØÖ÷ÒªÌåÏÖÔÚÏÂÃæ¼¸¸ö·½Ã棺

¡¤ÈÎÎñ²ð·Ö

¡¤ÈÎÎñ¹ÒÆð¡¢»Ö¸´¡¢ÖÕÖ¹

¡¤ÈÎÎñ¾ß±¸ÓÅÏȼ¶

ÈÎÎñ²ð·Ö

ÔÚ React Fiber »úÖÆÖУ¬Ëü²ÉÓÃ"»¯ÕûΪÁã"µÄ˼Ï룬½«µ÷ºÍ½×¶Î£¨Reconciler£©µÝ¹é±éÀú VDOM Õâ¸ö´óÈÎÎñ·Ö³ÉÈô¸ÉСÈÎÎñ£¬Ã¿¸öÈÎÎñÖ»¸ºÔðÒ»¸ö½ÚµãµÄ´¦Àí¡£

ÈÎÎñ¹ÒÆð¡¢»Ö¸´¡¢ÖÕÖ¹

workInProgress tree

workInProgress ´ú±íµ±Ç°ÕýÔÚÖ´ÐиüÐ嵀 Fiber Ê÷¡£ÔÚ render »òÕß setState ºó£¬»á¹¹½¨Ò»¿Å Fiber Ê÷£¬Ò²¾ÍÊÇ workInProgress tree£¬Õâ¿ÃÊ÷ÔÚ¹¹½¨Ã¿Ò»¸ö½ÚµãµÄʱºò»áÊÕ¼¯µ±Ç°½ÚµãµÄ¸±×÷Óã¬Õû¿ÃÊ÷¹¹½¨Íê³Éºó£¬»áÐγÉÒ»ÌõÍêÕûµÄ¸±×÷ÓÃÁ´¡£

currentFiber tree

currentFiber ±íʾÉÏ´ÎäÖȾ¹¹½¨µÄ Filber Ê÷¡£ÔÚÿһ´Î¸üÐÂÍê³Éºó workInProgress »á¸³Öµ¸ø currentFiber¡£ÔÚÐÂÒ»ÂÖ¸üÐÂʱ workInProgress tree ÔÙÖØÐ¹¹½¨£¬Ð workInProgress µÄ½Úµãͨ¹ý alternate ÊôÐÔºÍ currentFiber µÄ½Úµã½¨Á¢ÁªÏµ¡£

ÔÚРworkInProgress tree µÄ´´½¨¹ý³ÌÖУ¬»áͬ currentFiber µÄ¶ÔÓ¦½Úµã½øÐÐ Diff ±È½Ï£¬ÊÕ¼¯¸±×÷Óá£Í¬Ê±Ò²»á¸´ÓÃºÍ currentFiber ¶ÔÓ¦µÄ½Úµã¶ÔÏ󣬼õÉÙд´½¨¶ÔÏó´øÀ´µÄ¿ªÏú¡£Ò²¾ÍÊÇ˵ÎÞÂÛÊÇ´´½¨»¹ÊǸüС¢¹ÒÆð¡¢»Ö¸´ÒÔ¼°ÖÕÖ¹²Ù×÷¶¼ÊÇ·¢ÉúÔÚ workInProgress tree ´´½¨¹ý³ÌÖеġ£workInProgress tree ¹¹½¨¹ý³ÌÆäʵ¾ÍÊÇÑ­»·µÄÖ´ÐÐÈÎÎñºÍ´´½¨ÏÂÒ»¸öÈÎÎñ¡£

¹ÒÆð

µ±µÚÒ»¸öСÈÎÎñÍê³Éºó£¬ÏÈÅжÏÕâÒ»Ö¡ÊÇ·ñ»¹ÓпÕÏÐʱ¼ä£¬Ã»ÓÐ¾Í¹ÒÆðÏÂÒ»¸öÈÎÎñµÄÖ´ÐУ¬¼Çסµ±Ç°¹ÒÆðµÄ½Úµã£¬Èóö¿ØÖÆÈ¨¸øä¯ÀÀÆ÷Ö´Ðиü¸ßÓÅÏȼ¶µÄÈÎÎñ¡£

»Ö¸´

ÔÚä¯ÀÀÆ÷äÖȾÍêÒ»Ö¡ºó£¬Åжϵ±Ç°Ö¡ÊÇ·ñÓÐÊ£Óàʱ¼ä£¬Èç¹ûÓоͻָ´Ö´ÐÐ֮ǰ¹ÒÆðµÄÈÎÎñ¡£Èç¹ûûÓÐÈÎÎñÐèÒª´¦Àí£¬´ú±íµ÷ºÍ½×¶ÎÍê³É£¬¿ÉÒÔ¿ªÊ¼½øÈëäÖȾ½×¶Î¡£

¡¤ÈçºÎÅжÏÒ»Ö¡ÊÇ·ñÓпÕÏÐʱ¼äµÄÄØ£¿

ʹÓÃÇ°ÃæÌáµ½µÄ RIC (RequestIdleCallback) ä¯ÀÀÆ÷Ô­Éú API£¬React Ô´ÂëÖÐΪÁ˼æÈݵͰ汾µÄä¯ÀÀÆ÷£¬¶Ô¸Ã·½·¨½øÐÐÁË Polyfill¡£

¡¤»Ö¸´Ö´ÐеÄʱºòÓÖÊÇÈçºÎÖªµÀÏÂÒ»¸öÈÎÎñÊÇÊ²Ã´ÄØ£¿

´ð°¸ÊÇÔÚÇ°ÃæÌáµ½µÄÁ´±í¡£ÔÚ React Fiber ÖÐÿ¸öÈÎÎñÆäʵ¾ÍÊÇÔÚ´¦ÀíÒ»¸ö FiberNode ¶ÔÏó£¬È»ºóÓÖÉú³ÉÏÂÒ»¸öÈÎÎñÐèÒª´¦ÀíµÄ FiberNode¡£

ÖÕÖ¹

Æäʵ²¢²»ÊÇÿ´Î¸üж¼»á×ßµ½Ìá½»½×¶Î¡£µ±ÔÚµ÷ºÍ¹ý³ÌÖд¥·¢ÁËеĸüУ¬ÔÚÖ´ÐÐÏÂÒ»¸öÈÎÎñµÄʱºò£¬ÅжÏÊÇ·ñÓÐÓÅÏȼ¶¸ü¸ßµÄÖ´ÐÐÈÎÎñ£¬Èç¹ûÓоÍÖÕÖ¹Ô­À´½«ÒªÖ´ÐеÄÈÎÎñ£¬¿ªÊ¼Ð嵀 workInProgressFiber Ê÷¹¹½¨¹ý³Ì£¬¿ªÊ¼ÐµĸüÐÂÁ÷³Ì¡£ÕâÑù¿ÉÒÔ±ÜÃâÖØ¸´¸üвÙ×÷¡£ÕâÒ²ÊÇÔÚ React 16 ÒÔºóÉúÃüÖÜÆÚº¯Êý componentWillMount ÓпÉÄÜ»áÖ´Ðжà´ÎµÄÔ­Òò¡£

workInProgress tree ¹¹½¨

ÈÎÎñ¾ß±¸ÓÅÏȼ¶

React Fiber ³ýÁËͨ¹ý¹ÒÆð£¬»Ö¸´ºÍÖÕÖ¹À´¿ØÖƸüÐÂÍ⣬»¹¸øÃ¿¸öÈÎÎñ·ÖÅäÁËÓÅÏȼ¶¡£¾ßÌåµã¾ÍÊÇÔÚ´´½¨»òÕ߸üРFiberNode µÄʱºò£¬Í¨¹ýËã·¨¸øÃ¿¸öÈÎÎñ·ÖÅäÒ»¸öµ½ÆÚʱ¼ä£¨expirationTime£©¡£ÔÚÿ¸öÈÎÎñÖ´ÐеÄʱºò³ýÁËÅжÏÊ£Óàʱ¼ä£¬Èç¹ûµ±Ç°´¦Àí½ÚµãÒѾ­¹ýÆÚ£¬ÄÇôÎÞÂÛÏÖÔÚÊÇ·ñÓпÕÏÐʱ¼ä¶¼±ØÐëÖ´ÐиÃÈÎÎñ¡£¹ýÆÚʱ¼äµÄ´óС»¹´ú±í×ÅÈÎÎñµÄÓÅÏȼ¶¡£

ÈÎÎñÔÚÖ´Ðйý³ÌÖÐ˳±ãÊÕ¼¯ÁËÿ¸ö FiberNode µÄ¸±×÷Ó㬽«Óи±×÷ÓõĽڵãͨ¹ý firstEffect¡¢lastEffect¡¢nextEffect ÐγÉÒ»Ìõ¸±×÷Óõ¥Á´±í A1(TEXT)-B1(TEXT)-C1(TEXT)-C1-C2(TEXT)-C2-B1-B2(TEXT)-B2-A¡£

Æäʵ×îÖÕ¶¼ÊÇΪÁËÊÕ¼¯µ½ÕâÌõ¸±×÷ÓÃÁ´±í£¬ÓÐÁËËü£¬ÔÚ½ÓÏÂÀ´µÄäÖȾ½×¶Î¾Íͨ¹ý±éÀú¸±×÷ÓÃÁ´Íê³É DOM ¸üС£ÕâÀïÐèҪעÒ⣬¸üÐÂÕæÊµ DOM µÄÕâ¸ö¶¯×÷ÊÇÒ»ÆøºÇ³ÉµÄ£¬²»ÄÜÖжϣ¬²»È»»áÔì³ÉÊÓ¾õÉϵIJ»Á¬¹á£¨commit£©¡£

<div id="A1">
A1
<div id="B1">
B1
<div id="C1">C1</div>
<div id="C2">C2</div>
</div>
<div id="B2">
B2
</div>
</div>

¸±×÷ÓÃÁ´

Ö±¹Ûչʾ

ΪÁË·½±ã´ó¼Ò¶Ô±È£¬ÎÒ¾ÍÖ±½Ó·ÅÉÏÁ½ÕŶԱÈͼ°É£¬´ó¼Ò×ÔÐбȶԣ¬²î±ð»¹ÊǺÜÃ÷ÏÔµÄ

Fiber ½á¹¹³¤Ê²Ã´Ñù£¿

»ùÓÚʱ¼ä·ÖƬµÄÔöÁ¿¸üÐÂÐèÒª¸ü¶àµÄÉÏÏÂÎÄÐÅÏ¢£¬Ö®Ç°µÄvDOM treeÏÔÈ»ÄÑÒÔÂú×㣬ËùÒÔÀ©Õ¹³öÁËfiber tree£¨¼´FiberÉÏÏÂÎĵÄvDOM tree£©£¬¸üйý³Ì¾ÍÊǸù¾ÝÊäÈëÊý¾ÝÒÔ¼°ÏÖÓеÄfiber tree¹¹Ôì³öеÄfiber tree£¨workInProgress tree£©¡£

FiberNode ÉϵÄÊôÐÔÓкܶ࣬¸ù¾Ý±ÊÕßµÄÀí½â£¬ÒÔÏÂÕâô¼¸¸öÊôÐÔÊÇÖµµÃ¹Ø×¢µÄ£ºreturn¡¢child¡¢sibling£¨Ö÷Òª¸ºÔðfiberÁ´±íµÄÁ´½Ó£©£»stateNode£»effectTag£»expirationTime£»alternate£»nextEffect¡£¸÷ÊôÐÔ½éÉܲο´ÏÂÃæµÄclass FiberNode£º

class FiberNode {
constructor(tag, pendingProps, key, mode) {
// ʵÀýÊôÐÔ
this.tag = tag; // ±ê¼Ç²»Í¬×é¼þÀàÐÍ£¬È纯Êý×é¼þ¡¢Àà×é¼þ¡¢Îı¾¡¢Ô­Éú×é¼þ...
this.key = key; // react ÔªËØÉ쵀 key ¾ÍÊÇ jsx ÉÏдµÄÄǸö key £¬Ò²¾ÍÊÇ×îÖÕ ReactElement ÉϵÄ
this.elementType = null; // createElementµÄµÚÒ»¸ö²ÎÊý£¬ReactElement É쵀 type
this.type = null; // ±íʾfiberµÄÕæÊµÀàÐÍ £¬elementType »ù±¾Ò»Ñù£¬ÔÚʹÓÃÁËÀÁ¼ÓÔØÖ®ÀàµÄ¹¦ÄÜʱ¿ÉÄܻ᲻һÑù
this.stateNode = null; // ʵÀý¶ÔÏ󣬱ÈÈç class ×é¼þ new Íêºó¾Í¹ÒÔØÔÚÕâ¸öÊôÐÔÉÏÃæ£¬Èç¹ûÊÇRootFiber£¬ÄÇôËüÉÏÃæ¹ÒµÄÊÇ FiberRoot,Èç¹ûÊÇÔ­Éú½Úµã¾ÍÊÇ dom ¶ÔÏó
// fiber
this.return = null; // ¸¸½Úµã£¬Ö¸ÏòÉÏÒ»¸ö fiber
this.child = null; // ×ӽڵ㣬ָÏò×ÔÉíÏÂÃæµÄµÚÒ»¸ö fiber
this.sibling = null; // ÐÖµÜ×é¼þ, Ö¸ÏòÒ»¸öÐֵܽڵã
this.index = 0; // Ò»°ãÈç¹ûûÓÐÐֵܽڵãµÄ»°ÊÇ0 µ±Ä³¸ö¸¸½ÚµãϵÄ×Ó½ÚµãÊÇÊý×éÀàÐ͵Äʱºò»á¸øÃ¿¸ö×Ó½ÚµãÒ»¸ö index£¬index ºÍ key ÒªÒ»Æð×ö diff
this.ref = null; // reactElement É쵀 ref ÊôÐÔ
this.pendingProps = pendingProps; // Ð嵀 props
this.memoizedProps = null; // ¾ÉµÄ props
this.updateQueue = null; // fiber ÉϵĸüжÓÁÐÖ´ÐÐÒ»´Î setState ¾Í»áÍùÕâ¸öÊôÐÔÉϹÒÒ»¸öеĸüÐÂ, ÿÌõ¸üÐÂ×îÖÕ»áÐγÉÒ»¸öÁ´±í½á¹¹£¬×îºó×öÅúÁ¿¸üÐÂ
this.memoizedState = null; // ¶ÔÓ¦ memoizedProps£¬ÉÏ´ÎäÖȾµÄ state£¬Ï൱ÓÚµ±Ç°µÄ state£¬Àí½â³É prev ºÍ next µÄ¹ØÏµ
this.mode = mode; // ±íʾµ±Ç°×é¼þϵÄ×Ó×é¼þµÄäÖȾ·½Ê½
// effects
this.effectTag = NoEffect; // ±íʾµ±Ç° fiber Òª½øÐкÎÖÖ¸üУ¨¸üС¢É¾³ýµÈ£©
this.nextEffect = null; // Ö¸ÏòϸöÐèÒª¸üеÄfiber
this.firstEffect = null; // Ö¸ÏòËùÓÐ×Ó½ÚµãÀÐèÒª¸üÐ嵀 fiber ÀïµÄµÚÒ»¸ö
this.lastEffect = null; // Ö¸ÏòËùÓÐ×Ó½ÚµãÖÐÐèÒª¸üÐ嵀 fiber µÄ×îºóÒ»¸ö
this.expirationTime = NoWork; // ¹ýÆÚʱ¼ä£¬´ú±íÈÎÎñÔÚδÀ´µÄÄĸöʱ¼äµãÓ¦¸Ã±»Íê³É
this.childExpirationTime = NoWork; // child ¹ýÆÚʱ¼ä
this.alternate = null; // current Ê÷ºÍ workInprogress Ê÷Ö®¼äµÄÏ໥ÒýÓÃ
}
}

fiber-tree

function performUnitWork(currentFiber){
//beginWork(currentFiber) //ÕÒµ½¶ù×Ó£¬²¢Í¨¹ýÁ´±íµÄ·½Ê½¹Òµ½currentFiberÉÏ£¬Ã¿Ò»Å¼¶ù×Ó¾ÍÕÒºóÃæÄǸöÐÖµÜ
//Óжù×Ӿͷµ»Ø¶ù×Ó
if(currentFiber.child){
return currentFiber.child;
}
//Èç¹ûûÓжù×Ó£¬ÔòÕҵܵÜ
while(currentFiber){//Ò»Ö±ÍùÉÏÕÒ
//completeUnitWork(currentFiber);//½«×Ô¼ºµÄ¸±×÷Óùҵ½¸¸½ÚµãÈ¥
if(currentFiber.sibling){
return currentFiber.sibling
}
currentFiber = currentFiber.return;
}
}

Concurrent Mode £¨²¢·¢Ä£Ê½£©

Concurrent Mode Ö¸µÄ¾ÍÊÇ React ÀûÓÃÉÏÃæ Fiber ´øÀ´µÄÐÂÌØÐԵĿªÆôµÄÐÂģʽ (mode)¡£react17¿ªÊ¼Ö§³Öconcurrent mode£¬ÕâÖÖģʽµÄ¸ù±¾Ä¿µÄÊÇΪÁËÈÃÓ¦Óñ£³ÖcpuºÍioµÄ¿ìËÙÏìÓ¦£¬ËüÊÇÒ»×éй¦ÄÜ£¬°üÀ¨Fiber¡¢Scheduler¡¢Lane£¬¿ÉÒÔ¸ù¾ÝÓû§Ó²¼þÐÔÄܺÍÍøÂç×´¿öµ÷ÕûÓ¦ÓõÄÏìÓ¦ËÙ¶È£¬ºËÐľÍÊÇΪÁËʵÏÖÒì²½¿ÉÖжϵĸüС£concurrent modeÒ²ÊÇδÀ´reactÖ÷Òªµü´úµÄ·½Ïò¡£

Ŀǰ React ʵÑé°æ±¾ÔÊÐíÓû§Ñ¡ÔñÈýÖÖ mode£º

1.Legacy Mode: ¾ÍÏ൱ÓÚĿǰÎȶ¨°æµÄģʽ

2.Blocking Mode: Ó¦¸ÃÊÇÒÔºó»á´úÌæ Legacy Mode ¶ø³¤ÆÚ´æÔÚµÄģʽ

3.Concurrent Mode: ÒÔºó»á±ä³É default µÄģʽ

Concurrent Mode Æäʵ¿ªÆôÁËÒ»¶ÑÐÂÌØÐÔ£¬ÆäÖÐÓÐÁ½¸ö×îÖØÒªµÄÌØÐÔ¿ÉÒÔÓÃÀ´½â¾öÎÒÃÇ¿ªÍ·Ìáµ½µÄÁ½¸öÎÊÌ⣺

1.Suspense ÊÇ React ÌṩµÄÒ»ÖÖÒì²½´¦ÀíµÄ»úÖÆ, Ëü²»ÊÇÒ»¸ö¾ßÌåµÄÊý¾ÝÇëÇó¿â¡£ËüÊÇReact ÌṩµÄÔ­ÉúµÄ×é¼þÒì²½µ÷ÓÃÔ­Óï¡£

2.ÈÃÒ³ÃæÊµÏÖ Pending -> Skeleton -> Complete µÄ¸üз¾¶, Óû§ÔÚÇл»Ò³ÃæÊ±¿ÉÒÔÍ£ÁôÔÚµ±Ç°Ò³Ã棬ÈÃÒ³Ãæ±£³ÖÏìÓ¦¡£Ïà±Èչʾһ¸öÎÞÓõĿհ×Ò³Ãæ»òÕß¼ÓÔØ×´Ì¬£¬ÕâÖÖÓû§ÌåÑé¸ü¼ÓÓѺá£

ÆäÖÐ Suspense ¿ÉÒÔÓÃÀ´½â¾öÇëÇó×èÈûµÄÎÊÌ⣬UI ¿¨¶ÙµÄÎÊÌâÆäʵ¿ªÆô concurrent mode ¾ÍÒѾ­½â¾öµÄ£¬µ«ÈçºÎÀûÓà concurrent mode À´ÊµÏÖ¸üÓѺõĽ»»¥»¹ÊÇÐèÒª¶Ô´úÂë×öÒ»·¬¸Ä¶¯µÄ¡£

δÀ´¿ÉÆÚ

Concurrent ModeÖ»ÊDz¢·¢£¬¼ÈÈ»ÈÎÎñ¿É²ð·Ö£¨Ö»Òª×îÖյõ½ÍêÕûeffect list¾ÍÐУ©£¬ÄǾÍÔÊÐí²¢ÐÐÖ´ÐУ¬£¨¶à¸öFiber reconciler + ¶à¸öworker£©£¬ÊׯÁÒ²¸üÈÝÒ×·Ö¿é¼ÓÔØ/äÖȾ£¨vDOMÉ­ÁÖ¡£

²¢ÐÐäÖȾµÄ»°£¬¾Ý˵Firefox²âÊÔ½á¹ûÏÔʾ£¬130msµÄÒ³Ãæ£¬Ö»ÐèÒª30ms¾ÍÄܸ㶨£¬ËùÒÔÔÚÕâ·½ÃæÊÇÖµµÃÆÚ´ýµÄ£¬¶øReactÒѾ­×öºÃ×¼±¸ÁË£¬ÕâÒ²¾ÍÊÇÔÚReact FiberÉÏÏÂÎľ­³£Ìýµ½µÄ´ýunlockµÄ¸ü¶àÌØÐÔÖ®Ò»¡£

isInputPending ¡ª¡ª Fiber¼Ü¹¹Ë¼Ïë¶Ôǰ¶ËÉú̬µÄÓ°Ïì

Facebook ÔÚ Chromium ÖÐÌá³ö²¢ÊµÏÖÁË isInputPending() API£¬Ëü¿ÉÒÔÌá¸ßÍøÒ³µÄÏìÓ¦ÄÜÁ¦£¬µ«ÊDz»»á¶ÔÐÔÄÜÔì³ÉÌ«´óÓ°Ïì¡£Facebook Ìá³öµÄ isInputPending API ÊǵÚÒ»¸ö½«ÖжϵĸÅÄîÓÃÓÚä¯ÀÀÆ÷Óû§½»»¥µÄµÄ¹¦ÄÜ£¬²¢ÇÒÔÊÐí JavaScript Äܹ»¼ì²éʼþ¶ÓÁжø²»»á½«¿ØÖÆÈ¨½»ÓÚä¯ÀÀÆ÷¡£

Ŀǰ isInputPending API ½öÔÚ Chromium µÄ 87 °æ±¾¿ªÊ¼Ìṩ£¬ÆäËûä¯ÀÀÆ÷²¢Î´ÊµÏÖ¡£

isInputPending

Svelte ¶Ô¹ÌÓÐģʽµÄ³å»÷

µ±ÏÂǰ¶ËÁìÓò£¬Èý´ó¿ò¼ÜReact¡¢Vue¡¢Angular°æ±¾Öð½¥Îȶ¨£¬Èç¹û˵ǰ¶ËÐÐÒµ»á³öÏÖÄÄЩ¿ò¼ÜÓпÉÄÜ»áÌôÕ½React»òÕßVueÄØ£¿ºÜ¶àÈËÈÏΪSvelte Ó¦¸ÃÊÇÆäÖеÄÑ¡ÏîÖ®Ò»¡£

Svelte½Ð·¨ÊÇ[Svelte], ±¾ÒâÊÇÃçÌõÏËÊݵģ¬ÊÇÒ»¸öÐÂÐËÈÈÃŵÄǰ¶Ë¿ò¼Ü¡£ÔÚ¿ª·¢ÕßÂúÒâ¶È¡¢ÐËȤ¶È¡¢Êг¡Õ¼ÓÐÂÊÉϾùÃûÁÐǰ飬ͬʱ£¬ËüÓиüСµÄ´ò°üÌå»ý£¬¸üÉٵĿª·¢´úÂëÊéд£¬ÔÚÐÔÄܲâÆÀÖУ¬ÓëReact¡¢VueÏà±È£¬Ò²²»åضàÈá£

Svelte µÄºËÐÄ˼ÏëÔÚÓÚ¡ºÍ¨¹ý¾²Ì¬±àÒë¼õÉÙ¿ò¼ÜÔËÐÐʱµÄ´úÂëÁ¿¡»¡£

Svelte ÓÅÊÆÓÐÄÄЩ

¡¤No Runtime ¡ª¡ª ÎÞÔËÐÐʱ´úÂë

¡¤Less-Code ¡ª¡ª д¸üÉٵĴúÂë

¡¤Hight-Performance ¡ª¡ª ¸ßÐÔÄÜ

Svelte ÁÓÊÆ

¡¤ÉçÇø

¡¤ÉçÇø

¡¤ÉçÇø

Ô­Àí¸ÅÀÀ

Svelte ÔÚ±àÒëʱ£¬¾ÍÒѾ­·ÖÎöºÃÁËÊý¾Ý ºÍ DOM ½ÚµãÖ®¼äµÄ¶ÔÓ¦¹ØÏµ£¬ÔÚÊý¾Ý·¢Éú±ä»¯Ê±£¬¿ÉÒԷdz£¸ßЧµÄÀ´¸üÐÂDOM½Úµã¡£

¡¤Rich Harris ÔÚ½øÐÐSvelteµÄÉè¼ÆµÄʱºòûÓвÉÓà Virtual DOM£¬Ö÷ÒªÊÇÒòΪËû¾õµÃVirtual DOM Diff µÄ¹ý³ÌÊǷdz£µÍЧµÄ¡£¾ßÌå¿É²Î¿¼Virtual Dom ÕæµÄ¸ßЧÂð[21]Ò»ÎÄ£»Svelte ²ÉÓÃÁËTemplatesÓï·¨£¬ÔÚ±àÒëµÄ¹ý³ÌÖоͽøÐÐÓÅ»¯²Ù×÷£»

¡¤Svelte ¼Ç¼ÔàÊý¾ÝµÄ·½Ê½£ºÎ»ÑÚÂ루bitMask£©£»

¡¤Êý¾ÝºÍDOM½ÚµãÖ®¼äµÄ¶ÔÓ¦¹ØÏµ£ºReact ºÍ Vue ÊÇͨ¹ý Virtual Dom ½øÐÐ diff À´Ëã³öÀ´¸üÐÂÄÄЩ DOM ½ÚµãЧÂÊ×î¸ß¡£Svelte ÊÇÔÚ±àÒëʱºò£¬¾Í¼Ç¼ÁËÊý¾Ý ºÍ DOM ½ÚµãÖ®¼äµÄ¶ÔÓ¦¹ØÏµ£¬²¢ÇÒ±£´æÔÚ p º¯ÊýÖС£

Êý¾ÝºÍDOM½ÚµãÖ®¼äµÄ¶ÔÓ¦¹ØÏµ

 
   
1609 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
ÈçºÎÉè¼Æ¸ßÀ©Õ¹µÄÔÚÏßÍøÒ³ÖÆ×÷ƽ̨
electronÈëÃÅÐĵÃ
ʹÓà Electron ¹¹½¨×ÀÃæÓ¦ÓÃ
VUE.JS×é¼þ»¯¿ª·¢Êµ¼ù
ÉîÈëÀí½âJSCore
×îпγÌ
HTML 5 + CSS3 Ô­ÀíÓ뿪·¢Ó¦ÓÃ
Webǰ¶Ë¸ß¼¶¹¤³Ìʦ±Ø±¸¼¼ÄÜʵս
Vue´óÐÍÏîÄ¿¿ª·¢ÊµÕ½
ReactÔ­ÀíÓëʵ¼ù
Vue.js½ø½×Óë°¸Àýʵ¼ù
³É¹¦°¸Àý
Öн»¼¯ÍÅ ¹¹½¨Web×Ô¶¯»¯²âÊÔ¿ò¼Ü
ijָÃûµçÐŹ«Ë¾ Vue.js½ø½×Óë°¸Àý
¹úµçÍ¨ÍøÂç¼¼Êõ HTML5+CSS3 +webǰ¶Ë¿ò
ÒÆ¶¯Í¨ÐÅ ÒÆ¶¯»¥ÁªÍøÓ¦Óÿª·¢Ô­Àí
ijµçÁ¦ÐÐ android¿ª·¢Æ½Ì¨×î¼Ñ