±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜ´ÓÁù¸öÎÊÌâ³ö·¢£¬¶Ô
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½ÚµãÖ®¼äµÄ¶ÔÓ¦¹ØÏµ
|