±¾ÎÄÖ¼ÔÚ°ïÖú¶ÁÕßÁ˽⣬ÔÚÈ«Çò¹æÄ£×î´óµÄReact.js
PWAÖ®Ò»¡ª¡ªTwitter Liteµ±ÖУ¬ÊÇÈçºÎÏû³ý¸÷Àà³£¹æÓ뺱¼ûÖ®ÐÔÄÜÆ¿¾±µÄ¡£
ÏëÒª¹¹½¨Ò»¿îÐÔÄܳöÉ«µÄWebÓ¦ÓóÌÐò£¬ÎÒÃÇÐèҪͶÈë´óÁ¿¼¼ÊõÖÜÆÚÒÔ¼ì²âʱ¼äÀ˷ѵ㡢Á˽âÆä·¢ÉúÔÒò²¢³¢ÊÔ¸÷Àà½â¾ö·½°¸¡£Òź¶µÄÊÇ£¬ÕâÖÖ×ö·¹ÍùÍùÎÞ·¨¿ìËÙ½â¾öÎÊÌâ¡£ÐÔÄÜÎÞÒÉÊÇÒ»ÏîÓÀºãµÄÃüÌ⣬¼¼ÊõÈËÔ±ÓÀÔ¶ÅÇ»²ÔÚ¹Û²ìÓë²âÁ¿µ±ÖУ¬È´¼¸ºõÓÀÔ¶ÕÒ²»µ½×îÓŽ⡣²»¹ýÀûÓÃTwitter
Lite£¬ÎÒÃÇÒѾÔÚÖÚ¶à²ãÃæÄÚÈ¡µÃÁËϸСµ«È´¼«¾ß¼ÛÖµµÄ¸Ä½ø£º´Ó³õʼ¼ÓÔØÊ±¼äµ½React×é¼þäÖȾ£¨·ÀÖ¹¶þ´ÎäÖȾ£©£¬ÔÙµ½Í¼Ïñ¼ÓÔØÒÔ¼°¸ü¶à²ãÃæ¡£¾¡¹Ü´ó¶àÊý±ä¸ü±¾Éí²¢²»ÏÔÖø£¬µ«ÆäÏà¼ÓËù´øÀ´µÄ×îÖÕ½á¹ûÊÇ£¬ÎÒÃǵÃÒÔ¹¹½¨ÆðÒ»¿î¹æÄ£¼«´óÇÒËٶȼ«¿ìµÄ½¥½øÊ½WebÓ¦ÓóÌÐò¡£
ÔĶÁ˵Ã÷Èç¹ûÄã¸Õ¸Õ¿ªÊ¼Í¶ÉíWebÓ¦ÓóÌÐòÐÔÄÜÌáÉýµÄ²âÁ¿¹¤×÷£¬ÎÒÇ¿ÁÒ½¨ÒéÄúÊ×ÏÈÁ˽âÈçºÎ¶ÁÈ¡»ðÑæÍ¼ÐÅÏ¢¡£
ºóÎÄÖеĸ÷¸öÕ½ڽ԰üº¬ÓнØÈ¡×ÔChrome¿ª·¢Õß¹¤¾ßÄÚµÄʱ¼äÏ߼Ǽ¡£ÎªÁ˸üÒ×ÓÚÀí½â£¬ÎÒÃÇÔÚÿÏîʾÀýÖÐÇ¿µ÷ÁËÄÄЩÐÅÏ¢´ú±íÇé¿ö²»Àû£¬¶øÄÄЩ´ú±íÇé¿öÕý³£¡£
ÕâÀïÐèÒªÌØ±ð¾Íʱ¼äÏßÓë»ðÑæÍ¼½øÐÐ˵Ã÷£ºÓÉÓÚÎÒÃÇÐèÒª¶Ô´óÁ¿Òƶ¯É豸½øÐй۲죬Òò´Ëͨ³£Ö»ÔÚÄ£Äâ»·¾³ÖмǼCPUËٶȽöΪÎå·ÖÖ®Ò»ÇÒʹÓÃ3GÍøÂçÁ¬½ÓµÄÇé¿ö¡£ÕâЩÌõ¼þ²»½ö¸üΪÏÖʵ£¬Í¬Ê±Òà¸üÒ×ÓÚ±©Â¶ÐÔÄÜÎÊÌâ¡£ÔÚʹÓÃReact
v15.4.0µÄ×é¼þÅäÖÃʱ£¬ÉõÖÁ»á¶ÔÔËÐÐÅäÖüÓÒÔ½øÒ»²½Ñ¹Ëõ¡£×ÀÃæÐÔÄÜʱ¼äÏßÖеÄʵ¼ÊÖµ½«Ô¶¸ßÓÚÎÒÃÇÔÚ±¾ÎÄÖÐÁоٵÄʾÀýÖµ¡£
Ò»¡¢ÃæÏòä¯ÀÀÆ÷½øÐÐÓÅ»¯
1. ʹÓûùÓÚ·ÓɵĴúÂë²ð·Ö»úÖÆ
WebpackËäÈ»¼«ÎªÇ¿´ó£¬µ«È´ÄÑÓÚѧϰ¡£ÎÒÃÇÒ²Ôø¾ÔâÓöµ½CommonsChunkPluginÎÊÌ⣬ÇÒºÜÄÑŪÇåÆäÓëÎÒÃDz¿·ÖÑ»·´úÂëÒÀÀµÐԵĶԽӷ½Ê½¡£¿¼Âǵ½ÕâÒ»µã£¬ÎÒÃÇ×îÖÕÖ»±£ÁôÁË3¸öJavaScript×ÊÔ´Îļþ£¬ÇÒ×ܼÆÂÔ´óÓÚ1
MB£¨gzip´«Êä¸ñʽÔòΪ420 KB£©¡£
ÔÚÕ¾µãÔËÐйý³ÌÖУ¬¼ÓÔØÊý¸öÉõÖÁµ¥Ò»´óÐÍJavaScriptÎļþ¶¼¿ÉÄܸøÒƶ¯Óû§µÄÍøÕ¾ä¯ÀÀÓë½»»¥´øÀ´¾Þ´óÐÔÄÜÆ¿¾±¡£³ýÁ˸÷´óÐͽű¾ÔÚ´«Êä¹ý³ÌÖÐÐèÒªÏûºÄ¸ü¶àÍøÂç×ÊÔ´¼°´«Êäʱ³¤Ö®Í⣬ä¯ÀÀÆ÷µÄ½âÎö¹¤×÷Á¿Ò²½«Òò´ËÓÐËùÌáÉý¡£
ÔÚ¾¹ý¶à´ÎÕùÂÛÖ®ºó£¬ÎÒÃÇ×îÖÕµÃÒÔÀûÓ÷ÓÉ»úÖÆ½«³£¹æÇøÓò²ð·Ö³É¶à¸ö¶ÀÁ¢¿é£¨ÈçÏÂËùʾ£©¡£
const
plugins = [
// extract vendor and webpack's module manifest
new webpack.optimize.CommonsChunkPlugin({
names: [ 'vendor', 'manifest' ],
minChunks: Infinity
}),
// extract common modules from all the chunks
(requires no 'name' property)
new webpack.optimize.CommonsChunkPlugin({
async: true,
children: true,
minChunks: 4
})
]; |
×îºó£¬ÎÒÃÇÔÚÊÕ¼þÏäÖÐÊÕµ½ÁËÕâÑùÒ»·Ý´úÂëÉó²é½áÂÛ£º
Ìí¼ÓÁËϸÁ£¶È¡¢»ùÓÚ·ÓɵĴúÂë²ð·Ö»úÖÆ¡£Ó¦ÓÃÕûÌåµÄ³õʼ»¯ËÙ¶ÈÓëHomeTimelineäÖȾËٶȽÔÓÐËù¸ÄÉÆ£¬ÇÒĿǰµÄÓ¦Óñ»²ð·ÖΪ40¸ö¶ÀÁ¢¿é£¬²¢¸ù¾Ý»á»°³¤¶È½øÐÐʱ¼äÅä¶î¾ù̯¡£-
Nicolas Gallagher
ÈçͼËùʾ£¬Ê±¼äÏßÓÉ´úÂë²ð·Öǰ״̬£¨Í¼1£©×ª»¯ÎªÖ®ºó״̬£¨Í¼2£©¡£ 
ͼ1

ͼ2
ÎÒÃǵijõʼÉèÖã¨Í¼1£©ÐèÒª5ÃëÖÖ²ÅÄÜÍê³ÉÖ÷À¦°ó°üµÄ¼ÓÔØ£¬µ«ÔÚÀûÓ÷ÓÉ»úÖÆÓë³£¹æÇø¿é¶Ô´úÂë½øÐвð·Öºó£¨Í¼2£©£¬¼ÓÔØÊ±¼ä½µµÍµ½ÁË3Ã루ģÄâ3GÍøÂç»·¾³Ï£©¡£
Õâһͻ³öÐÔÄÜÌáÉýÔÚ´ËǰµÄ¾ÍµÃµ½Á˹Ø×¢£¬µ«µ¥Æ¾ÕâÒ»Ïî±ä¸ü£¬¼´Áî¹È¸èLighthouse WebÓ¦ÓÃÉ󼯹¤¾ßµÄÔËÐÐËٶȳöÏÖ¾Þ´ó±ä»¯£º

ͼ3
ÎÒÃÇ»¹Í¨¹ýÔËÐйȸèLighthouse WebÓ¦ÓÃÉ󼯹¤¾ßÁ˽â´Ëǰ£¨Í¼3 Before£©Óë´Ëºó£¨Í¼3
After£©µÄÐÔÄܲîÒì¡£
2.±ÜÃâʹÓÿÉÄÜÔì³ÉÌøÖ¡µÄº¯Êý
ÔÚ¶ÔÎÒÃÇÎÞÏÞ¹ö¶¯Ê±¼äÏß½øÐжà´Îµü´úµÄ¹ý³ÌÖУ¬ÎÒÃdz¢ÊÔʹÓöàÖÖ²»Í¬·½·¨ÒÔ¼ÆËã¹ö¶¯Î»Öü°·½Ïò£¬Ö¼ÔÚÈ·¶¨ÊÇ·ñÓбØÒªÒªÇóAPIÏÔʾ¸ü¶àÍÆÎÄÄÚÈÝ¡£¾ÍÔÚ²»¾Ã֮ǰ£¬ÎÒÃÇ»¹ÔÚʹÓÃreact-waypoint£¬ÇÒ»ñµÃÁ˲»´íµÄЧ¹û¡£È»¶øÎªÁ˽«ÐÔÄÜˮƽÌáÉýÖÁеĸ߶ȣ¬Æä×÷ΪÎÒÃÇÓ¦ÓóÌÐòµÄÖ÷Òªµ×²ã×é¼þÖ®Ò»ÈÔÎÞ·¨ÔÚËÙ¶ÈÉÏÂú×ãÒªÇó¡£
WaypointsµÄ¹¤×÷·½Ê½Îª¼ÆËã´óÁ¿²»Í¬ÔªËصĸ߶ȡ¢¿í¶ÈÓëλÖ㬴ӶøÈ·¶¨Óû§µÄµ±Ç°¹ö¶¯Î»Öá¢Ã¿´Î²Ù×÷Ö®¼äµÄÏà¸ô¾àÀëÒÔ¼°¾ßÌåÖ¸ÏòÄĸö·½Ïò¡£ÕâЩÐÅÏ¢ËäȻȷʵÓÐÓ㬵«ÓÉÓÚÐèÒªÔÚÿһ´Î¹ö¶¯Ê¼þʱ½øÐд¦Àí£¬Òò´Ë»á´øÀ´ÏàÓ¦³É±¾¡ª¡ª¼´´ËÀà¼ÆËã»áµ¼ÖÂÌøÖ¡ÎÊÌ⣬ÇÒ·¢ÉúƵÂʼ«¸ß¡£
µ«ÔÚ½â¾öÎÊÌâ֮ǰ£¬ÎÒÃÇÊ×ÏÈÐèÒªÀí½â¿ª·¢Õß¹¤¾ßËù¸ø³öµÄ¡°ÌøÖ¡¡±½áÂÛ¾¿¾¹ÊÇʲôº¬Òå¡£
Ŀǰ´ó¶àÊýÉ豸»áÿÃë¶ÔÆÁÄ»ÏÔʾÄÚÈݽøÐÐ60´ÎˢС£Èç¹ûÆäÖÐÔËÐÐÓж¯»»òÕß¹ý¶ÉЧ¹û£¬ÒÖ»òÓû§½øÐÐÒ³Ãæ¹ö¶¯²Ù×÷£¬Ôòä¯ÀÀÆ÷ÐèҪƥÅäÉ豸µÄË¢ÐÂÂʲ¢ÌṩһÕÅеÄͼÏñ¡ª¡ª»òÕß³ÆÎªÖ¡¡ª¡ªÒÔ×÷Ϊÿ´ÎÆÁĻˢеÄÏÔʾÄÚÈÝ¡£
ÆäÖÐÿһ֡µÄ³ÖÐøÊ±¼äԼΪÂÔ¸ßÓÚ16ºÁÃ루¼´1ÃëµÄÁùÊ®·ÖÖ®Ò»£¬Ô¼Îª16.66ºÁÃ룩¡£²»¹ýÔÚʵ¼Ê³¡¾°ÖУ¬ä¯ÀÀÆ÷ÈÔÓÐÆäËü¹ÜÀíÈÎÎñÐèÒª´¦Àí£¬Òò´ËÕû¸öË¢ÐÂÄÚÈݵÄÉú³Éʱ¼äÔ¼ÔÚ10ºÁÃë×óÓÒ¡£Èç¹ûÎÞ·¨Âú×ãÕâÒ»Ìõ¼þ£¬ÔòÖ¡ÏÔʾËÙÂʽ«ÓÐËùϽµ£¬µ¼ÖÂÆÁÄ»ÉϵÄÄÚÈݳöÏÖÌø¶¯¡£ÕâÖÖÏÖÏóͨ³£±»³ÆÎªÌøÖ¡£¬ÇÒ»á¸øÓû§µÄÌåÑéÔì³É¸ºÃæÓ°Ïì¡£¡ª?Paul
Lewis ÖøÓÚ¡¶äÖȾÐÔÄÜ¡·
Ëæ×Åʱ¼äµÄÍÆÒÆ£¬ÎÒÃÇ¿ª·¢³öÒ»ÖÖеÄÎÞÏÞ¹ö¶¯×é¼þ£¬²¢½«ÆäÃüÃûΪVirtualScroller¡£ÀûÓÃÕâ¿îÐÂ×é¼þ£¬ÎÒÃÇÄܹ»È·ÇÐÁ˽âÌØ¶¨Ê±¶ÎµÄÌØ¶¨Ê±¼äÖáÖÐÄIJ¿·ÖÍÆÎÄÆ¬¶ÎÐèÒª½øÐÐäÖȾ£¬´Ó¶ø±ÜÃâΪÁ˳ÊÏÖÊÓ¾õЧ¹û¶ø½øÐÐÐèÒªÕ¼ÓôóÁ¿×ÊÔ´µÄ¼ÆËãÈÎÎñ¡£ 
ͼ4 
ͼ5
ËäÈ»¿´ÆðÀ´ÎÊÌâ²¢²»ÑÏÖØ£¬µ«Ö®Ç°£¨Í¼4£©½øÐйö¶¯Ê±£¬ÎÒÃÇÓÉÓÚÐèÒª¼ÆËã¶à¸öÔªËØµÄ¸ß¶È¶øÒý·¢ÁËäÖÈ¾ÌøÖ¡ÎÊÌâ¡£Ö®ºó£¨Í¼5£©£¬ÎÒÃDz»½ö³¹µ×°ÚÍÑÁËÌøÖ¡£¬Òà¼õÉÙÁË¿¨¶Ù²¢ÌáÉýÁËʱ¼äÖá¹ö¶¯ËÙ¶È¡£
ͨ¹ý±ÜÃâµ÷ÓÃÄÇЩ¿ÉÄÜÒý·¢²»±ØÒªÌøÖ¡µÄº¯Êý£¬ÍÆÎĵÄʱ¼äÖá¹ö¶¯±äµÃ¸üΪÎ޷죬ÕâÒâζ×ÅÎÒÃÇÄܹ»Ìṩ¸üΪ·á¸»ÇÒ¼¸ºõÓëÔÉúÓ¦ÓÃÎÞÒìµÄʹÓÃÌåÑé¡£¸üÖµµÃÒ»ÌáµÄÊÇ£¬ÕâÏî±ä¸ü»¹¸øÊ±¼äÖáµÄ¹ö¶¯Ë³»¬¶È´øÀ´ÌáÉý¡£ÕâÔÙ´ÎÖ¤Ã÷£¬Ã¿Ò»ÏîС¸Ä½ø¶¼½«»ýÀÛÆðÀ´²¢×îÖÕʵÏÖÀíÏëÐÔÄܱíÏÖ¡£
3.ʹÓøüСͼÏñ
ΪÁËÔÚTwitter LiteÉÏÂÊÏÈʹÓýϵʹ«Êä´ø¿í×ÊÔ´£¬ÎÒÃÇÅäºÏ¶à¸öÍŶӶÔCDNÉϵĿÉÓÃͼÏñ½øÐÐÁ˸üÐÂÓë³ß´çµ÷Õû¡£ÊÂʵ֤Ã÷£¬Í¨¹ý½µµÍͼÏñ³ß´ç£¬ÎÒÃǵÃÒÔÏÔÖø½µµÍËùÐèÒªäÖȾµÄʵ¼Ê¹¤×÷Á¿£¨°üÀ¨¹æÄ£ÓëÖÊÁ¿£©£¬²¢·¢Ïִ˾ٲ»½öÄܹ»½µµÍ´«Êä´ø¿íÕ¼ÓÃÂÊ£¬Í¬Ê±ÒàÄܹ»ÌáÉýä¯ÀÀÆ÷µÄÐÔÄܱíÏÖ¡ª¡ªÌرðÊÇÔÚ¶Ô°üº¬´óÁ¿Í¼ÏñµÄÍÆÎÄʱ¼äÖá½øÐйö¶¯²Ù×÷ʱ¡£
ΪÁ˺ËʵС³ß´çͼÏñ¸øÐÔÄÜ´øÀ´µÄÈ·ÇÐÌáÉý£¬ÎÒÃǶÔChrome¿ª·¢Õß¹¤¾ßÖеÄRasterʱ¼äÏß½øÐÐÁ˹۲졣ÔÚ¶ÔͼÏñ³ß´ç½øÐÐÊÝÉí֮ǰ£¬½âÂ뵥һͼÏñµÄʱ¼äÒ»°ãΪ300ºÁÃëÉõÖÁ¸ü³¤£¬¾ßÌåÈçÒÔÏÂʱ¼äÏ߼Ǽͼ×ó²àËùʾ¡£ÕâÒ»¹ý³Ì·¢ÉúÔÚͼÏñÄÚÈÝÏÂÔØÍê³ÉÖ®ºó£¬ÇÒÐèÒª¾¹ý´¦Àí£¬Í¼Ïñ²ÅÄÜÔÚÒ³ÃæÖеõ½ÕýÈ·ÏÔʾ¡£
µ±¹ö¶¯Ò³Ã沢ϣÍû·ûºÏÿÃë60Ö¡äÖȾ±ê×¼ÒªÇóʱ£¬ÎÒÃÇÏ£Íû¾¡¿ÉÄܽ«Ã¿Ö¡ÏÔʾÄÚÈݵÄäÖȾʱ¼ä¿ØÖÆÔÚ16.667ºÁÃëÒÔÄÚ¡£Í¨¹ý¼ÆË㣬ÕâÒâζ×ÅÎÒÃÇÐèÒª½ü18Ö¡²ÅÄܽ«µ¥Ò»Í¼ÏñäÖȾÍê³É²¢ÏÔʾÔÚÊÓͼÄÚ£¬Ð§¹ûÏÔÈ»²»¹»ÀíÏë¡£ÁíÒ»ÏîÐèҪעÒâµÄʱ¼äÖ¸±êÔÚÓÚ£¬´ó¼Ò¿ÉÒÔ¿´µ½£¬Maineʱ¼äÏß»á³ÖÐøÊܵ½×è¶Ï£¬Ö±µ½¶ÔӦͼÏñÍê³É½âÂ루Èç¿Õ°×ÇøËùʾ£©¡£ÕâÒâζ×ÅÕâÕýÊÇÎÒÃÇÒªÕÒµÄÐÔÄÜÆ¿¾±£¡

ͼ6

ͼ7
½Ï´óͼÏñ£¨Í¼6£©½«ÔÚ18Ö¡ÖÜÆÚÄÚ×è°Ö÷Ï̵߳ÄÔËÐУ¬¶ø½ÏСͼÏñ£¨Í¼7£©Ôò½öÐèÒª1Ö¡×óÓÒ¡£
ÏÖÔÚÎÒÃÇÒѾ¶ÔͼÏñ³ß´ç½øÐÐÁËÏ÷¼õ£¨Í¼6£©£¬¶ø³ß´ç×î´óµÄͼÏñÈç½ñ½öÐèÒª1Ö¡ÖÜÆÚ¼´¿ÉÍê³É½âÂë¡£
¶þ¡¢ÓÅ»¯React
1.ʹÓÃshouldComponentUpdate·½·¨
¶ÔReactÓ¦ÓóÌÐò½øÐÐÐÔÄÜÓÅ»¯µÄÒ»ÖÖ³£¼û×÷·¨ÔÚÓÚʹÓÃshouldComponentUpdate·½·¨¡£ÎÒÃÇÒ»Ö±ÔÚ¾¡¿ÉÄÜʹÓÃÕâÒ»·½·¨£¬µ«ÓÐʱЧ¹û²¢²»¾¡ÈçÈËÒâ¡£

ͼ8
ÔÞµÚÒ»ÌõÍÆÎĻᵼÖÂÆä±¾ÉíÒÔ¼°ÆäϵÄÕû¸öConversation½øÐÐÖØÐÂäÖȾ£¡
ÏÂÃæÎÒÃÇÀ´¿´Ò»¸öʼÖÕ±£³Ö¸üеÄ×é¼þ¾ÈÃü£ºµ±ÔÚÖ÷ʱ¼äÏßÖеã»÷ÐÄÐÎͼ±êÒÔÔÞÒ»ÌõÍÆÎÄʱ£¬µ±Ç°ÆÁÄ»ÉϵÄÈ«²¿Conversation×é¼þ¶¼½«½øÐÐÖØÐÂäÖȾ¡£ÔÚ¶¯»Ê¾Àýµ±ÖУ¬´ó¼Ò¿ÉÒÔ¿´µ½ÂÌÉ«µÄ¸ßÁÁ¿òÌ壬ÕâÊÇÒòΪÎÒÃǵIJÙ×÷µ¼Öµ±Ç°ÍÆÎÄ֮ϵÄÕû¸öConversation×é¼þ½Ô½øÐиüУ¬¶øä¯ÀÀÆ÷ÐèÒª¶ÔÆä½øÐÐÖØÐÂÌî³ä¡£
ÒÔÏÂΪ¶ÔÕâÒ»²Ù×÷½øÐиÅÀ¨µÄÁ½·ù»ðÑæÍ¼¡£ÔÚδʹÓÃshouldComponentUpdate·½·¨£¨Í¼9£©Ê±£¬ÎÒÃÇ¿ÉÒÔ¿´µ½ÕûÌåÊ÷×´½á¹¹½Ô½øÐÐÁ˸üÐÂÓëÖØÐÂäÖȾ£¬¶øÐ§¹û½öΪ¶ÔÆÁÄ»ÉϵÄÐÄÐÎͼ±ê½øÐÐ×ÅÉ«¡£¶øÔÚÌí¼ÓÁËshouldComponentUpdate·½·¨£¨Í¼10£©Ö®ºó£¬ÎÒÃÇÎÞÐè¸üÐÂÕû¸öÊ÷×´½á¹¹£¬´Ó¶øÍ¨¹ý±ÜÃâÔËÐв»±ØÒª½ø³Ì¶ø½ÚÔ¼ÁËÊ®·ÖÖ®Ò»Ãë´¦Àíʱ¼ä¡£

ͼ9

ͼ10
֮ǰ£¨Í¼9£©£¬ÔÚÔÞijÌõ·ÇÏà¹ØÍÆÎÄʱ£¬Õû¸öConversations½Ô½øÐиüм°ÖØÐÂäÖȾ¡£¶øÔÚÌí¼Ó¸ÃÂß¼£¨Í¼10£©Ö®ºó£¬¿ÉÒÔ¿´µ½¸Ã×é¼þ¼°Æä¸÷×ÓÔªËØ²»ÔÙÀ˷Ѳ»±ØÒªµÄCPUÖÜÆÚ¡£µã»÷»òµã´¥½øÐзŴó¡£
2.½«²»±ØÒªÈÎÎñÍÆ³ÙÖÁcomponentDidMountÖ®ºó
ÕâÒ»±ä¸üËÆºõ·Ç³£¼òµ¥£¬µ«ÔÚ¿ª·¢Twitter LiteÕâÀà´óÐÍÓ¦ÓóÌÐòʱȴºÜÈÝÒ×±»ºöÂÔ¡£
ÎÒÃÇ·¢ÏÖ£¬ÎÒÃǵÄÔÓдúÂëÖдæÔÚ´óÁ¿Á¢×ãcomponentWillMount ReactÉúÃüÖÜÆÚ·½·¨½øÐиß×ÊÔ´Õ¼ÓÃÁ¿¼ÆËã·ÖÎöµÄÇé¿ö¡£Ã¿Ò»´Î´ËÀà¼ÆËã¶¼»á¸øÆäËü×é¼þµÄäÖȾÔì³É·Á°¡£ÕâÀï20ºÁÃ룬ÄÇÀï90ºÁÃ룬×îÖÕµÄÐÔÄÜÍÏÀÛ½«·Ç³£³ÁÖØ¡£×î³õ£¬ÎÒÃÇÔø³¢ÊÔ½«ÊµÏÖ½øÐÐäÖȾµÄÿÌõÍÆÎĽøÐмǼ£¬²¢½«½á¹ûдÈëÖÁcomponentWillMountÖеÄÊý¾Ý·ÖÎö·þÎñÖУ¬¶øºó²Å¶ÔÆä½øÐÐʵ¼ÊäÖȾ£¨ÈçÏÂͼ×ó²àʱ¼äÏßËùʾ£©¡£

ͼ11

ͼ12
ͨ¹ý½«·Ç±ØÒª´úÂë·¾¶ÓÉcomponentWillMountÍÆ³ÙÖÁcomponentDidMount£¬ÎÒÃǵÃÒÔ½ÚÔ¼ÁË´óÁ¿µ±Ç°ÆÁÄ»ÄÚµÄÍÆÎÄäÖȾʱ³¤¡£µã»÷»òµã´¥½øÐзŴó¡£
ͨ¹ý½«¼ÆËãÓëÍøÂçµ÷ÓÃ×ªÒÆÖÁReact×é¼þµÄcomponentDidMount·½·¨ÖУ¬ÎÒÃǵÃÒÔ½â³ý¶ÔÖ÷Ï̵߳ÄЧÂÊ·Á°£¬Í¬Ê±¼õÉÙÁ˶Ը÷×é¼þ½øÐÐäÖȾʱµÄÒâÍâÌøÖ¡×´¿ö£¨Í¼12Ëùʾ£©¡£
3.±ÜÃâʹÓÃdangerouslySetInnerHTML
ÔÚTwitter Liteµ±ÖУ¬ÎÒÃÇÑ¡ÔñʹÓÃSVGͼ±ê£¬ÒòΪÆä¼«¾ß¿ÉÒÆÖ²ÐÔÇÒÊÇ×îΪÀíÏëµÄ¿ÉÀ©Õ¹Ñ¡Ïî¡£Òź¶µÄÊÇ£¬ÔÚ¾ÉÓÐReact°æ±¾µ±ÖУ¬´ó²¿·ÖSVGÊôÐÔÔÚÁ¢×ã×é¼þ½øÐÐÔªËØ´´½¨Ê±²¢²»ÊÜÖ§³Ö¡£Òò´Ë£¬ÔÚ×î³õ¿ªÊ¼±àдÕâ¿îÓ¦ÓóÌÐòʱ£¬ÎÒÃDZ»ÆÈͨ¹ýdangerouslySetInnerHTMLÒÔ½«SVGͼ±ê×÷ΪReact×é¼þ½øÐÐʹÓá£
¾ÙÀýÀ´Ëµ£¬ÎÒÃǵÄÔʼHeartIconÈçÏÂËùʾ:
const
HeartIcon = (props) => React.createElement('svg',
{
...props,
dangerouslySetInnerHTML: { __html: '<g><path
d="M38.723 12c-7.187 0-11.16 7.306-11.723
8.131C26.437 19.306 22.504 12 15.277 12 8.791
12 3.533 18.163 3.533 24.647 3.533 39.964 21.891
55.907 27 56c5.109-.093 23.467-16.036 23.467-31.353C50.467
18.163 45.209 12 38.723 12z"></path></g>'
},
viewBox: '0 0 54 72'
}); |
ÕâÀïÐèҪǿµ÷Ò»µã£¬ÎÒÃDz»½ö²»¹ÄÀøÊ¹ÓÃdangerouslySetInnerHTML£¬¸üÖØÒªµÄÊÇ£¬ÊÂʵ֤Ã÷ÆäÕýÊǵ¼ÖÂһϵÁйÒÔØÓëäÖȾ»ºÂýÎÊÌâµÄÔ´Í·¡£

ͼ13

ͼ14
֮ǰ£¨Í¼13£©£¬¿ÉÒÔ¿´µ½¹ÒÔØ4¸öSVGͼ±êÐèÒªÔ¼20ºÁÃ룬¶øÖ®ºó£¨Í¼14£©Ôò½öÐèÒª8ºÁÃë¡£µã»÷»òµã´¥½øÐзŴó¡£
ͨ¹ý¶ÔÒÔÉÏ»ðÑæÍ¼½øÐзÖÎö£¬ÎÒÃǵÄÔʼ´úÂ루ͼ13£©ÏÔʾÆäÔÚµÍÅäÖÃÉ豸ÉÏÐèÒª20ºÁÃë·½¿ÉÍê³ÉÍÆÎĵײ¿4¸öSVGͼ±êµÄ¹ÒÔØ²Ù×÷¡£ËäÈ»¾Í±¾Éí¶øÑÔʱºÄ²¢²»¿äÕÅ£¬µ«¿¼Âǵ½´óÁ¿ÍÆÎĹö¶¯²Ù×÷Çé¿ö£¬ÎÒÃÇÒâʶµ½Õâ»áÔì³É¾Þ´óµÄʱ¼äÀË·Ñ¡£
ÓÉÓÚReact v15¶Ô´ó²¿·ÖSVGÊôÐÔÌṩ֧³Ö£¬Òò´ËÎÒÃÇ¿ªÊ¼³¢ÊÔ²¢Ï£ÍûÁ˽ⲻÔÙʹÓÃdangerouslySetInnerHTML»á´øÀ´ÔõÑùµÄЧ¹û¡£Í¨¹ý¼ì²éÉý¼¶°æ±¾µÄ»ðÑæÍ¼£¨Í¼14£©£¬ÎÒÃǵÃÒÔ½«Ã¿×éͼ±êµÄ¹ÒÔØÓëäÖȾʱ¼äƽ¾ùËõ¶Ì60%£¡
ÏÖÔÚ£¬ÎÒÃǵÄSVGͼ±êÊôÓÚ¼òµ¥µÄÎÞ״̬×é¼þ£¬ÇÒ²»ÔÙʹÓá°dangerous¡±º¯Êý£¬ÇÒ¹ÒÔØËÙ¶ÈÆ½¾ùÌáÉý60%¡£¾ßÌåÈçÏ£º
const
HeartIcon = (props = {}) => ( <svg {...props}
viewBox='0 0 ${width} ${height}'> <g><path
d='M38.723 12c-7.187 0-11.16 7.306-11.723 8.131C26.437
19.306 22.504 12 15.277 12 8.791 12 3.533 18.163
3.533 24.647 3.533 39.964 21.891 55.907 27 56c5.109-.093
23.467-16.036 23.467-31.353C50.467 18.163 45.209
12 38.723 12z'></path></g>
</svg>
); |
4.ÔÚ¹ÒÔØ¼°Ð¶ÔØ´óÁ¿×é¼þÊ±ÍÆ³ÙäÖȾ
ÔÚµÍÅäÖÃÉ豸µ±ÖУ¬ÎÒÃÇ×¢Òâµ½×Ô¼ºµÄÖ÷µ¼º½À¸¿ÉÄÜÐèÒªÏ൱³¤µÄʱ¼ä²ÅÄܹ»Íê³É¶Ô¶àÏîµã´¥²Ù×÷µÄÕýÈ·ÏìÓ¦£¬Õâ»áµ¼ÖÂÓû§ÎóÒÔΪµÚÒ»´Îµã´¥Î´ÄÜ×àЧ²¢½øÐз´¸´³¢ÊÔ¡£
ͨ¹ýͼ15¿ÉÒÔ¿´µ½£¬ÎÒÃǵÄHomeͼ±êºÄʱ½ü2Ãë²ÅÍê³É¸üв¢¶Ôµã´¥²Ù×÷×÷³öÏìÓ¦£º

ͼ15
Èç¹û²»¶ÔäÖȾ½øÐÐÍÆ³Ù£¬Ôòµ¼º½À¸ÐèÒª½Ï³¤ºÄʱ²ÅÄÜ¿ªÊ¼ÏìÓ¦¡£
Çë±ðÎó»á£¬Õâ¾ø²»ÊÇÓÉÓÚÔËÐÐGIFËùÔì³ÉµÄÖ¡ÂÊ»ºÂý¡£ÊÂʵÉÏ£¬ÆäËÙ¶ÈȷʵÁîÈËÎÞ·¨ÈÌÊÜ£¬µ«´Ë´ÎHomeÆÁÄ»ÖеÄÈ«²¿Êý¾Ý¶¼ÒѾ¼ÓÔØÍê³É¡ª¡ªÄÇô£¬ÎªÊ²Ã´ÈÔÐèÒª³¤³¤Ê±¼ä²ÅÄܽ«È«²¿ÄÚÈÝÕýÈ·ÏÔʾ³öÀ´£¿
ÊÂʵ֤Ã÷£¬´óÐÍ×é¼þÊ÷×´½á¹¹£¨ÀýÈçÍÆÎÄʱ¼äÖᣩµÄ¹ÒÔØÓëÐ¶ÔØÔÚReactÖлáÏûºÄ´óÁ¿¼ÆËã×ÊÔ´¡£
×÷Ϊ×î¼òµ¥µÄÒªÇó£¬ÎÒÃÇÏ£Íû½â¾öÕâÒ»µ¼º½À¸ÎÞ·¨ÏìÓ¦Óû§ÊäÈë²Ù×÷µÄ×´¿ö¡£Òò´Ë£¬ÎÒÃÇ´´½¨ÁËÒ»¸öСÐÍHigherOrderCompoent×é¼þ£º
import
hoistStatics from 'hoist-non-react-statics';
import React from 'react';
/**
* Allows two animation frames to complete to
allow other components to update
* and re-render before mounting and rendering
an expensive `WrappedComponent`.
*/
export default function deferComponentRender(WrappedComponent)
{
class DeferredRenderWrapper extends React.Component
{
constructor(props, context) {
super(props, context);
this.state = { shouldRender: false };
}
componentDidMount() {
window.requestAnimationFrame(() => {
window.requestAnimationFrame(() => this.setState({
shouldRender: true }));
});
}
render() {
return this.state.shouldRender ? <WrappedComponent
{...this.props} /> : null;
}
}
return hoistStatics(DeferredRenderWrapper,
WrappedComponent);
} |
ÎÒÃǵÄHigherOrderComponentÓÉ Katie Sievert±àд¡£
ÔÚ±»Ó¦ÓÃÓÚÎÒÃǵÄHomeTimelineÖ®ºó£¬ÎÒÃÇ·¢ÏÖµ¼º½À¸Äܹ»ÊµÏÖ½ü¼´Ê±ÏìÓ¦£¬Õ⼫´óÌá¸ßÁËÓ¦ÓóÌÐòµÄÕûÌåʹÓøÐÊÜ¡£
const
DeferredTimeline = deferComponentRender(HomeTimeline);
render(<DeferredTimeline />); |

ͼ16
ÔÚÍÆ³ÙäÖȾ֮ºó£¬µ¼º½À¸Äܹ»ÊµÏÖÁ¢¼´ÏìÓ¦¡£
Èý¡¢ÓÅ»¯Redux
1.±ÜÃâÆµ·±½øÐÐ״̬´æ´¢
¾¡¹Ü×é¼þ¿ØÖÆÍùÍù±»×÷ΪÀíÏëµÄʵ¼ù·½°¸£¬µ«ÊÂʵ֤Ã÷¿ØÖÆÊäÈëÄÚÈݻᵼÖÂÿһ´Î°´¼ü½ÔÔì³É¸üÐÂÓëÖØÐÂäÖȾ¡£
ÕâÒ»µãÔÚÖ÷Ƶ¸ß´ï3 GHzµĄ̈ʽ¼ÆËã»úÉϲ¢²»ÊÇÎÊÌ⣬µ«¶ÔÓÚCPUÐÔÄܽÏΪÓÐÏÞµÄСÐÍÒÆ¶¯É豸¶øÑÔ£¬Óû§½«ÔÚÊäÈëʱÔâÓöÃ÷ÏÔµÄÑÓ³Ù¡ª¡ªÌرðÊÇÔÚ¶ÔÊä³öÄÚÈÝÖеĴóÁ¿×Ö·û½øÐÐɾ³ýʱ¡£
ΪÁ˱£Áôµ±Ç°ËùÊäÈëµÄÍÆÎÄÖµ²¢¼ÆËãÊ£Óà¿ÉÊäÈë×Ö·ûÊý£¬ÎÒÃÇʹÓÃÒ»ÏîÊÜ¿Ø×é¼þ²¢ÔÚÿ´Î°´¼üʱ½«ÊäÈëÄÚÈÝÖеĵ±Ç°Öµ´«µÝÖÁÎÒÃǵÄRedux״̬ÄÚ¡£
ͼ17Ϊһ¿îµäÐ͵ÄAndroid 5É豸£¬Ã¿´Î°´¼ü´øÀ´µÄ±ä¸ü¶¼»áµ¼ÖÂÔ¼200ºÁÃëµÄÑÓ³Ù¡£Èç¹ûÓû§ÊäÈëËٶȺܿ죬ÔòÓ¦ÓõÄʵ¼ÊÔËÐÐ״̬½«·Ç³£Ôã¸â¡£ÊÂʵÉÏ£¬Óû§¾³£±¨¸æ³ÆÆä×Ö·û²åÈëµã»áµ½´¦ÂҴܲ¢µ¼ÖÂÊäÈëÄÚÈÝÏÝÈë»ìÂÒ¡£

ͼ17

ͼ18
ÔÚʹÓÃÓ벻ʹÓÃReduxÁ½ÖÖÇé¿öÏ£¬¶Ôÿ´Î°´¼üµÄ¸üÐÂËٶȽøÐжԱȡ£µã»÷»òµã´¥½øÐзŴó¡£
ͨ¹ý×èֹÿ´Î°´¼üºó½«²Ý¸åÍÆÎÄ״̬´«µÝÖÁÖ÷Redux״̬²¢½«Æä±£ÁôÔÚReact×é¼þµÄ±¾µØ×´Ì¬ÄÚ£¬ÎÒÃǵÃÒÔ½«ÑÓ³Ùˮƽ½µµÍ³¬¹ý50%£¨Í¼18£©¡£
2.½«ÅúÁ¿²Ù×÷ºÏ²¢Îªµ¥Ò»µ÷¶È
ÔÚTwitter Lieµ±ÖУ¬ÎÒÃÇÀûÓÃreduxÅäºÏreact-reduxÒÔ½«×é¼þÈ·±£¸÷×é¼þÄܹ»¶©ÔÄÊý¾Ý״̬±ä¸ü¡£ÎÒÃÇ»¹¶ÔÊý¾Ý½øÐÐÁËÓÅ»¯£¬¼´ÀûÓÃNormalizrÓëcombineReducers½«Æä²ð·ÖΪµ¥Ò»´óÐÍ´æ´¢ÄÚÈÝÖеĶà¸ö¶ÀÁ¢Çø¼ä¡£ÕâÒ»ÇÐ×îÖÕÓÐЧ±ÜÃâÁËÊý¾ÝÖØ¸´²¢È·±£ÎÒÃǵĴ洢Á¿±£³ÖÔڽϵÍˮƽ¡£È»¶ø£¬Ã¿Ò»´Î»ñÈ¡µ½ÐÂÊý¾Ý£¬ÎÒÃǶ¼ÐèÒªµ÷¶È¶àÏî²Ù×÷ÒÔ½«´ËÐÂÊý¾ÝÌí¼ÓÖÁÊʺϵĴ洢¿âÄÚ¡£
¿¼Âǵ½react-reduxµÄ¹¤×÷·½Ê½£¬ÕâÒâζ×ÅÿÏîµ÷¶È²Ù×÷¶¼½«µ¼ÖÂÎÒÃǵÄÁ¬½Ó×é¼þ£¨±»³ÆÎªContainers£¬¼´ÈÝÆ÷£©ÐèÒªÖØÐ¼ÆËã±ä¸ü²¢¿ÉÄÜÐèÒª½øÐÐÖØÐÂäÖȾ¡£
¾¡¹ÜÎÒÃÇʹÓÃÁËÒ»¿î¶¨ÖÆ»¯Öмä¼þ£¬µ«ÈÔ´æÔÚÆäËü´óÁ¿Öмä¼þ¿É¹©Ñ¡Ôñ¡£´ó¼Ò¿ÉÒÔ°´ÕÕÐèÇó´ÓÖÐÌôÑ¡»òÕß±àдÄú×Ô¼ºµÄ¶¨ÖÆÖмä¼þ¡£
ÅжÏÅúÁ¿²Ù×÷ÊÕÒæµÄ×î¼Ñ·½Ê½ÔÚÓÚʹÓÃChrome React PerfÀ©Õ¹¡£ÔÚ³õʼ¼ÓÔØÊ±£¬ÎÒÃÇÔÚºǫ́ÖжÔδ¶ÁÈ¡DM½øÐÐÔ¤»º´æ¼°¼ÆËã¡£Ôڴ˹ý³ÌÖУ¬ÎÒÃÇ»áÏòÆäÖÐÌí¼Ó´óÁ¿¹¦ÄÜʵÌ壨°üÀ¨»á»°¡¢Óû§¡¢ÏûÏ¢ÌõÄ¿µÈ£©¡£ÔÚδ½øÐÐÅúÁ¿µ÷¶Èǰ£¨Í¼19£©£¬´ó¼Ò¿ÉÒÔ¿´µ½Ã¿Ò»×é¼þµÄäÖȾ´ÎÊý£¨Ô¼16´Î£©Ô¼ÎªÊ¹ÓÃÅúÁ¿µ÷¶Èºó£¨Í¼20£¬Ô¼8´Î£©µÄ2±¶¡£

ͼ19

ͼ20
ÀûÓÃChrome React PerfÀ©Õ¹¶ÔÅúÁ¿µ÷¶Èǰ£¨Í¼19£©ÓëÅúÁ¿µ÷¶Èºó£¨Í¼20£©µÄReduxäÖȾ´ÎÊý½øÐбȽϡ£µã»÷»òµã´¥½øÐзŴó¡£
ËÄ¡¢Service Workers
¾¡¹ÜĿǰService WorkersÉÐδµÃµ½È«²¿ä¯ÀÀÆ÷µÄÖ§³Ö£¬µ«ÆäÒѾ³ÉΪTwitter
LiteÖм«¾ß¼ÛÖµµÄ×é³É²¿·Ö¡£ÔÚʹÓÃService WorkersµÄÇé¿öÏ£¬ÎÒÃÇÄܹ»ÀûÓÃÆäÍÆËÍ֪ͨ²¢Ô¤»º´æÓ¦ÓóÌÐò×ʲú¡£Òź¶µÄÊÇ£¬ÓÉÓÚÆäÉÐÊôÓÚÒ»ÖÖÐÂÐ˼¼Êõ£¬Òò´ËÎÒÃÇ»¹ÐèÒª½øÐÐÉîÈëÑо¿ÒÔÁ˽âÆäÐÔÄÜÌØÐÔ¡£
1.Ô¤»º´æ×ÊÔ´
Óë´ó¶àÊý²úÆ·Ò»Ñù£¬Twitter LiteµÄ¿ª·¢¹¤×÷»¹Ô¶Î´Íê³É¡£ÎÒÃÇÕýÔÚ»ý¼«¶ÔÆä½øÐÐÍØÕ¹¡¢Ìí¼Óй¦ÄÜ¡¢ÐÞ¸´bug²¢ÌáÉýÆäÔËÐÐËÙ¶È¡£ÕâÒâζ×ÅÎÒÃÇÐèҪƵ·±²¿ÊðеÄJavaScript×ʲú°æ±¾¡£
Òź¶µÄÊÇ£¬Õâ¿ÉÄÜ»á¸ø¸ÃÓ¦ÓóÌÐòµÄÓû§´øÀ´À§ÈÅ£¬ÆÈʹÆäÖØÐÂÏÂÔØ´óÁ¿½Å±¾ÎļþÒÔ²é¿´ÍÆÎÄÄÚÈÝ¡£
ÔÚÖ§³ÖService WorkersµÄä¯ÀÀÆ÷µ±ÖУ¬ÎÒÃǵÃÒÔÈ·±£¸÷¹¤×÷³ÌÐòÔÚºǫ́ÖÐÒÔ×Ô¶¯»¯·½Ê½¸üС¢ÏÂÔØ²¢»º´æ¸÷±ä¸üÎļþ£¬´Ó¶øÒÔ²»Ó°ÏìÓû§µÄ·½Ê½Íê³ÉÉý¼¶¡£
ÄÇôÕâÒ»ÇÐÄܹ»¸øÓû§´øÀ´ÔõÑùµÄÊÕÒæ£¿¾ßÌåÀ´½²£¬ÆäÄܹ»ÒÔ¼¸ºõ¼´Ê±·½Ê½Íê³ÉºóÐøÓ¦Óð汾¼ÓÔØ¡£
δÆôÓÃServiceWorkerÔ¤»º´æ£¨Í¼21£©ÓëÆôÓÃÔ¤»º´æ£¨Í¼22£©Çé¿öϵÄÍøÂç×ʲú¼ÓÔØÊ±¼ä¡£µã»÷»òµã´¥½øÐзŴó¡£

ͼ21

ͼ22
Èç´ó¼ÒËù¼û£¨Í¼21£©£¬ÔÚδÆôÓÃServiceWorkerÔ¤»º´æ»úÖÆµÄÇé¿öÏ£¬µ±Ç°ÊÓͼÖеÄÿһÏî×ʲú¶¼ÐèÒª´ÓÍøÂç´¦¼ÓÔØ²¢·µ»ØÖÁÓ¦ÓóÌÐò´¦¡£ÔÚÁ¼ºÃµÄ3GÍøÂç»·¾³Ï£¬ÕâÒ»¼ÓÔØ¹ý³ÌÈÔÐèÒªÔ¼6Ãë·½¿É½áÊø¡£È»¶øÔÚÆôÓÃServiceWorkerµÄÔ¤»º´æ»úÖÆºó£¨Í¼22£©£¬Í¬ÑùµÄ3GÍøÂç¿ÉÔÚ1.5ÃëÒÔÄÚÍê³ÉÒ³Ãæ¼ÓÔØ¡ª¡ªÐÔÄÜÌáÉý¸ß´ï75%£¡
2¡£ÍƳÙServiceWorker×¢²á
ÔÚ´ó¶àÊýÓ¦ÓóÌÐòµ±ÖУ¬ÎÒÃÇÄܹ»°²È«µØ½«ServiceWorkerÁ¢¼´×¢²áÖÁ¼ÓÔØÒ³Ãæµ±ÖУº
<script>
window.navigator.serviceWorker.register('/sw.js');
</script> |
È»¶ø¿¼Âǵ½ÎÒÃÇÐèÒªÏòä¯ÀÀÆ÷·¢ËÍ´óÁ¿Êý¾ÝÒÔäÖȾ³öÍêÕûµÄÒ³ÃæÄÚÈÝ£¬Òò´ËÔÚTwitter
LiteÖÐÕâÒ»ÇÐÍùÍùÎÞ·¨ÊµÏÖ¡£ÎÒÃÇ¿ÉÄÜÎÞ·¨¿ìËÙ·¢Ëͳä×ãµÄÊý¾Ý£¬»òÕßÄúËùµÇ½µÄÒ³Ãæ²¢²»Ö§³Ö¶ÔÀ´×Ô·þÎñÆ÷µÄÊý¾Ý½øÐÐÔ¤Ìî³ä¡£ÓÉÓÚÕâÒ»µãÍâ¼ÓÆäËüһЩÏÞÖÆ£¬ÎÒÃÇÐèÒªÔÚ³õÊ¼Ò³Ãæ¼ÓÔØºóÁ¢¼´Éú³É²¿·ÖAPIÇëÇó¡£
Ò»°ãÀ´½²£¬ÕâÖÖ×÷·¨²¢²»»á´øÀ´¸ºÃæÓ°Ï졣Ȼ¶øÈç¹ûÄ¿±êä¯ÀÀÆ÷ÉÐδ°²×°µ±Ç°°æ±¾µÄServiceWorker£¬ÎÒÃÇÔòÐèÒªÒªÇóÆä°²×°¡ª¡ªÕâ»á´øÀ´ÓÃÓÚ¶Ô¶àÏîJS¡¢CSSÒÔ¼°Í¼Ïñ×ʲú½øÐÐÔ¤»º´æµÄÔ¼50ÏîÇëÇó¡£
µ±ÎÒÃǼòµ¥¶ÔServiceWoker½øÐÐÁ¢¼´×¢²áʱ£¬¿ÉÒÔ¿´µ½ä¯ÀÀÆ÷ÄÚ»áÁ¢¼´½øÐÐÍøÂçÁ¬½Ó£¬ÇÒÖ±½Óµ½´ïÎÒÃǵIJ¢·¢ÇëÇóÊýÁ¿ÉÏÏÞ¡£

ͼ23

ͼ24
Çë×¢Ò⣬ÔÚÁ¢¼´¶ÔService Worker½øÐÐ×¢²áʱ£¬Æä»á×è°È«²¿ÆäËüÍøÂçÇëÇó£¨Í¼23£©¡£ÍƳÙService
Worker×¢²á£¨Í¼24£©ÔÊÐíÎÒÃǶÔÒ³Ãæ¼ÓÔØÄÚÈݽøÐгõʼ»¯£¬´Ó¶øÔÚ²¢·¢ÇëÇóÉÏÏÞÖ®ÄÚÍê³É±ØÒªµÄÍøÂçÇëÇó¡£µã»÷»òµã´¥½øÐзŴó¡£
ͨ¹ý½«ServiceWorker×¢²áÍÆ³ÙÖÁÆäËüAPIÇëÇó¡¢CSSÓëͼÏñ×ʲú¼ÓÔØÍê³ÉÖ®ºó£¬ÎÒÃÇÄܹ»±£Ö¤Ò³ÃæÍê³ÉäÖȾ²¢¾ß±¸ÏìÓ¦ÄÜÁ¦£¬¾ßÌåÈç½ØÍ¼Ëùʾ£¨Í¼24£©¡£
Îå¡¢±¾ÎÄС½á
×ÜÌå¶øÑÔ£¬±¾ÎÄÖ»ÁгöÁËÎÒÃÇÔÚTwitter Liteµ±ÖÐËùʵÏֵIJ¿·Ö¸Ä½ø¡£Î´À´ÎÒÃÇ»¹½«ÔÚTwitter
LiteÖÐ×÷³ö¸ü¶à³¢ÊÔ£¬²¢¼ÌÐø·ÖÏíÎÒÃÇÔÚÆÚ¼ä·¢ÏÖµÄÎÊÌâÒÔ¼°¿Ë·þÀ§ÄѵľßÌå·½·¨¡£ÓûÁ˽â¸ü¶àÓëÎÒÃǵ±Ç°¿ª·¢½ø¶ÈÓëReact¼°PWA·ÖÎö½áÂÛµÄÐÅÏ¢£¬Çë¹Ø×¢ÎÒ£¨https://mobile.twitter.com/paularmstrong£©¼°
Twitter Lite£¨https://mobile.twitter.com/paularmstrong/lists/twitter-lite/members£©¿ª·¢ÍŶӡ£
|