ÔÎÄÁ´½Ó http://www.csdn.net/article/2015-08-04/2825370-react
2004Ä꣬¶ÔÓÚǰ¶ËÉçÇøÀ´Ëµ£¬ÊÇÀï³Ì±®Ê½µÄÒ»Äê¡£Gmailºá¿Õ³öÊÀ£¬Ëü´øÀ´»ùÓÚǰ¶ËäÖȾµÄÔÉúÓ¦Óü¶±ðµÄÌåÑ飬Ïà¶ÔÓÚ֮ǰµÄ·þÎñ¶ËäÖÈ¾ÍøÒ³¿ÉνÌáÉýÁËÒ»¸öʱ´ú£¬´¥¶¯ÁËÓû§µÄGµã¡£×Ô´Ë£¬Ç°¶ËäÖȾµÄÍøÕ¾³ÉΪÎÞÊý¿ª·¢Õß×·ÖðµÄ·½Ïò¡£
ΪÁ˸üºÃµØ¿ª·¢Ç°¶ËäÖȾµÄ“ÔÉú¼¶±ðµÄ”ÍøÕ¾£¬°üÀ¨BackboneºÍAngularÔÚÄÚµÄһϵÁÐǰ¶Ë¿ò¼ÜÓ¦Ô˶øÉú£¬²¢Ñ¸ËÙ»ñµÃÁË´ó¹æÄ£µÄ²ÉÓᣵ« ÊÇºÜ¿ìµØ£¬ÐµÄÐÔÄܺÍSEOÎÊÌâÒ²½Óõà¶øÀ´¡£¼¸¾³¢ÊÔºó£¬TwitterÉõÖÁ´Óǰ¶ËäÖÈ¾ÖØ»Ø·þÎñÆ÷äÖȾ£¬¶øStrikinglyÒ²Ãæ¶Ô¹ýͬÑù¼¬ÊÖµÄÎÊÌâ¡£
2014Ä꣬React½øÈëÎÒÃǵÄÊÓÏß¡£ÈÃÈ˶úĿһеÄÊÇ£¬¶ÔÓÚÆäËû¿ªÔ´¿ò¼ÜÓöµ½µÄÖÖÖÖÎÊÌ⣬React¶¼×ÔÐŵظø³öÁ˽â´ð¡£¼¸ºõûÓÐÓÌÔ¥£¬ÎÒÃÇ¿ªÊ¼Ê¹ÓÃReactÀ´Öع¹Strikingly¡£Èô¸ÉÄêºó£¬µ±ÎÒÃÇ»ØÍû£¬Ò²Ðí»á·¢ÏÖ£¬2014ÄêÒ²ÊÇǰ¶ËÉçÇøÀï³Ì±®Ê½µÄÒ»Äê¡£
React¼ò½é
React¾¿¾¹ÊÇʲô£¿Facebook°ÑËü¼òµ¥µÍµ÷µØ¶¨Òå³ÉÒ»¸ö“ÓÃÀ´¹¹½¨UIµÄJavaScript¿â”¡£Õâ¸ö¶¨ÒåÒ²Ðí»áÈÃÎÒÃÇÁªÏëµ½Ðí¶à JavaScriptÄ£°åÓïÑÔ£¨±ÈÈçHandlebarsºÍSwig£©£¬»òÕßÔçÆÚµÄ¿Ø¼þ¿â£¨±ÈÈçYUIºÍDojo£©£¬µ«ÊÇReactËù»ùÓڵöºËÐĸÅÄî ʹËüÓëÄÇЩģ°åºÍ¿Ø¼þ¿âåÄÈ»²»Í¬¡£ÊÂʵÉÏÕ⼸¸öºËÐĸÅÄî·Ç³£³¬Ç°£¬ÒѾ¸øÕû¸öǰ¶ËÊÀ½ç´øÀ´Á˳å»÷ÐÔµÄÓ°Ïì¡£ËüÃǰüÀ¨£º
1. ×é¼þºÍ»ùÓÚ×é¼þµÄÉè¼ÆÁ÷³Ì£»
2. µ¥ÏòÊý¾ÝÁ÷¶¯£»
3. ÐéÄâDOMÈ¡´úÎïÀíDOM×÷Ϊ²Ù×÷¶ÔÏó£»
4. ÓÃJSXÓ﷨ȡ´úHTMLÄ£°å£¬ÔÚJavaScriptÀïÉùÃ÷ʽµØÃèÊöUI¡£
Õ⼸Ìõ¼òµ¥µÄÔÔò·ÅÔÚÒ»Æð´øÀ´ÁË´óÁ¿µÄºÃ´¦£º
1. ǰ¶ËºÍºó¶Ë¶¼Äܹ»´ÓReact×é¼þäÖÈ¾Ò³Ãæ£¬ÍêÈ«½â¾öÁËSEO³¤ÆÚÀ§ÈÅJavaScriptµ¥Ò³Ó¦ÓõÄÎÊÌ⣻
2. ÎÒÃÇ¿ÉÒÔ¼òµ¥Ö±½ÓµØÐ´Ç°¶Ë²âÊÔ¶øÍêÈ«ÍüµôDOMÒÀÀµ£»
3. ×é¼þµÄ·â×°·½Ê½ºÍµ¥ÏòÊý¾ÝÁ÷¶¯Äܹ»¼«´óµØ¼ò»¯Ç°¶Ë¼Ü¹¹µÄÀí½âÄѶȡ£
ÎÒÃÇÀ´¿´Ò»¸öÀý×Ó£º
[js] view plaincopy
1. var HelloMessage = React.createClass({
2. render: function() {
3. return <div>Hello {this.props.name}</div>;
4. }
5. });
6.
7. React.render(<HelloMessage name="John" />, document.body);
Õâ¸öReact°æµÄHello WorldÒѾչÏÖÁËReactµÄһЩºËÐÄÌØÐÔ¡£Ê×ÏÈ£¬HelloMessageÊÇÒ»¸öReact×é¼þ£»´´½¨ReactÓ¦ÓõÄʱºò£¬ÎÒÃÇ×ÜÊÇÒÔ×é¼þΪ³ö·¢ µã¡£Ã¿¸ö×é¼þµÄºËÐÄÊÇÒ»¸örender·½·¨£¬ÔÚÆäÖÐÎÒÃǰÑÕâ¸ö×é¼þµÄpropsºÍstateÆ´×°µ½Ò»¸ö×îÖÕÒªäÖȾµÄÄ£°åÖУ¬È»ºó·µ»ØÕâ¸öÄ£°å£¨È·ÇеØËµÕâ ÀïÊÇÒ»¸öUIÃèÊö¶ø²»ÊÇ´«Í³ÒâÒåÉϵÄÄ£°å£©¡£Õâ¶Î´úÂëÀï¿´ÆðÀ´ÏñHTMLÒ»ÑùµÄ²¿·Ö¾ÍÊÇÖøÃûµÄJSXÓï·¨£¬ËüÊÇÔÚReactÖÐÃèÊö“Ä£°å”µÄ×î¼Ñ·½Ê½¡£
ÏÖÔÚ£¬ÒÔvar¿ªÍ·µÄµÚÒ»¶ÎÀïÎÒÃǶ¨ÒåÁËÒ»¸ö½ÐHelloMessageµÄ×é¼þ£»ÏÂÃæµÄReact.renderÕâÒ»ÐÐËù×öµÄ£¬ÔòÊǰÑÕâ¸ö×é¼þäÖȾ µ½document.bodyÀï——Ò²¾ÍÊÇÎÒÃÇʵ¼ÊµÄÒ³ÃæÉÏ¡£µ«ÔÚʹÓá´HelloMessage/¡µµÄʱºò£¬ÎÒÃÇ×öÁËÁíÒ»¼þ Ê£ºname="John"¡£¿´ÆðÀ´ºÜÏñHTMLÖеÄÔªËØÊôÐÔ£¬µ«ÊǼÈÈ»JSX²»ÊÇHTML£¬Õâ¸öÓï·¨µÄ×÷ÓÃÊÇÊ²Ã´ÄØ£¿Êµ¼ÊÉÏ£¬Õâ¾ÍÊÇÎÒÃÇÏòReact×é ¼þ´«ÈëpropsµÄ·½Ê½¡£»ØÍ·¿´µÚÒ»¶Î£¬ÎÒÃÇ¿ÉÒÔ¿´µ½ÔÚ×é¼þµÄÄÚ²¿ÓжÔthis.props.nameµÄÒýÓá£Õâ¸öname¾ÍÊÇÎÒÃǸոÕÖ¸¶¨µÄJohn£¡
¿´µ½ÕâÀÈç¹ûÄãÊìϤjQueryµÄ»°Ò²ÐíÔÚÏ룬ÕâÓë$(document.body).html('Hello John') ÓÐʲô¸ù±¾Çø±ðÄØ£¿
Õâ¾ÍÊÇÐéÄâDOM³ö³¡µÄµØ·½ÁË¡£ÎÒÃÇÏñдHTMLÒ»ÑùдJSX£¬µ«ÊÇJSX²¢²»»áÖ±½Ó±ä³ÉHTMLºÍDOM¡£ÔÚÄ»ºó£¬Reactά»¤×ÅÒ»¸öÐéÄâ DOM£¬¶øÊµ¼ÊÉϱ»ä¯ÀÀÆ÷Ö±½Ó²Ù×÷µÄ“ÎïÀí”DOMÖ»ÊÇÕâ¸öÐéÄâDOMµÄͶӰ¡£ÐéÄâDOM²»ÒÀÀµÓÚä¯ÀÀÆ÷»·¾³£¬Ëü¿ÉÒÔÔËÐÐÔÚÈκÎJavaScriptÖ´ÐÐ »·¾³¡£Õâ¾ÍÈÃÏÂÃæµÄ´úÂë³ÉΪ¿ÉÄÜ£º
[js] view plaincopy
1. var html =React.renderToString(<HelloMessage name="John"/>);res.send(html);
Èç¹ûµÚ¶þÐÐÓеãÑÛÊ죬ÄãûÓв´헗Õâ¶Î´úÂë·¢ÉúÔÚ·þÎñÆ÷¶Ë£¡Êǵģ¬Í¬ÑùµÄ HelloMessage£¬ÎÒÃDz»½ö¿ÉÒÔÈÃReactÔÚǰ¶ËäÖȾµ½Ò³Ã棬ͬÑù¿ÉÒÔÔÚºó¶ËÖ±½ÓäÖȾ³ÉHTML×Ö·û´®£¬È»ºó°ÑËü·µ»Ø¸øÇ°¶Ë¡£·þÎñ¶ËÔ¤äÖȾ¾ÍÕâô×ÔÈ»µØ·¢ÉúÁË¡£
React´øÀ´µÄ¸ïÃüÐÔ´´ÐÂÊÇǰ¶ËÊÀ½ç¹ýÈ¥¼¸Äê×¶¯ÈËÐĵı仯¡£×Ô´Ó½Ó´¥ReactÒÔÀ´£¬ÎÒÃÇÉîÐÅReact»á³¹µ×¸Ä±ä¿Í»§¶Ë¿ª·¢Õߣ¨°üÀ¨Ç°¶Ë¡¢ iOSºÍAndroid£©µÄ¿ª·¢ÌåÑé¡£ÔÚÏÂÃæµÄƪ·ùÀÎÒÃÇÏë´ÓËĸö´óµÄ·½Ïò——Ä¿±êƽ̨£¨Targets£©¡¢Êý¾Ý´¦Àí£¨Data£©¡¢¹¤¾ß£¨Tools£© ºÍеÄÌôÕ½——·ÖÏíÒ»ÏÂReactÉú̬ϵͳºÍÉçÇøµÄ½øÕ¹ºÍδÀ´Ç÷ÊÆ¡£
Ä¿±êƽ̨
¶ÔÓÚÐéÄâDOMµÄÌÖÂÛ£¬ºÜ¶àÈË»á˵ËÙ¶È¿ì¹ýÓÚÕæÕýµÄDOM¡£ÕâÑùµÄÌÖÂÛ¿ÉÒÔÈÃÈË¿ìËÙÈëÃÅÀí½âReact£¬µ«ÊÇÕæÕýд¹ýReactÓ¦ÓõÄÈË»áÃ÷°×ËÙ¶È ²¢²»ÊÇÐéÄâDOMµÄ¾«Ëè¡£ÎÒÃÇÈÏΪÐéÄâDOMµÄ´æÔÚ°ïÖúÎÒÃÇ×öµ½ÁËÁ½¼þÊ¡£µÚÒ»ÊÇÉêÃ÷ʽUI¡£Í¨¹ýÐéÄâDOM£¬UI²»ÔÙÊÇÒ»¸ö²»¶Ï±»¸ü±äµÄDOM£¬ÄãÖ»Òª ÉêÃ÷UIÊÇÔõôÉú³ÉµÄ£¬React»á×Ô¶¯°ïÄã°ÑUIµÄ¸Ä±ääÖȾµ½ÕæÕýµÄDOMÉÏ¡£ÕâÖÖеÄ˼ά·½Ê½ÈÃÄã¿ÉÒÔ²»ÓÃÊÖ¶¯²Ù×÷ÕæÕýµÄDOM¡£µÚ¶þÊǶà Target¡£ÎÒÃÇÒ»Ö±ÔÚ½²Web£¬µ«ReactÈÃÎÒÃÇ×öµ½WebÒÔÍâµÄTarget¡£ÐéÄâDOM¸üÏñÊÇUIÐéÄâ»ú£¬×Ô¶¯°ïÄãÓ³Éäµ½ÕæÕýµÄʵÏÖÉÏ£¬¿ÉÒÔÊÇ ä¯ÀÀÆ÷DOM¡¢iOS UI¡¢Android UI¡£ÉõÖÁÓÐÈË×öµ½ÁËReactÓ³Éäµ½ÖÕ¶ËÎı¾UI¡£
¶àTargetsÊÇReactÉçÇø³£³£ÔÚÌÖÂÛµÄÖ÷Òª»°ÌâÖ®Ò»¡£¶àTargetsµÄ¸ù±¾ÊÇÌá¸ß¿ª·¢ÕßÌåÑé¡£¿ª·¢ÕßÌåÑ飨DX£¬Developer Experience£©ÊÇÔÚReactÉçÇøÀïÂŴα»ÌáÆðµÄ¸ÅÄî¡£ÈçºÎÔÚ±£³ÖÒ»ÑùµÄÓû§ÌåÑéÏ£¬Ìá¸ß¿ª·¢ÕßÌåÑ飬ÊǰüÀ¨ReactÔÚÄÚµÄǰ¶ËÉçÇøÕýÔÚ˼¿¼µÄ ÎÊÌâ¡£ÊÂʵÉÏÈκÎÒ»¼ÒÓжà¿Í»§¶ËµÄ¹«Ë¾¶¼ÃæÁÙ×ÅÕâÑùͬһ¸öÎÊÌ⣺ÔÚ¸÷ÖÖ¿Í»§¶ËÓïÑÔÀïÖØÐÂÔìÂÖ×Ó¡£¿ª·¢ÕßÐèҪѧϰеÄÓïÑÔ¡¢Ð´ºÍά»¤ÀàËÆµÄ¹¦ÄÜ¡£ÌáÉý¿Í»§¶Ë ¿ª·¢ÕßÌåÑé¾ÍÊǼõÉÙѧϰ³É±¾ºÍά»¤³É±¾¡£Õâ¾ÍÊÇReactÌᳫµÄ“Learn once,write everywhere”¡£
×î½üÒ²ÓÐһЩ¹ÄÎèÈËÐĵÄÏûÏ¢¡£FacebookÄÚ²¿Ads Manager iOS°æ±¾ÓÉ7λǰ¶Ë¹¤³ÌʦÓÃReact Native»¨ÁË5¸öÔÂÍê³É¡£¶øAndroid°æ±¾£¬ÊÇͬһ°àÈË£¬3¸öÔÂÄÚÍê³É¡£´úÂëÖØÓÃÂÊ´ïµ½ÁË87%¡£
¶àTargetsÒ²¿ÉÒÔÊÇÔÚµ¥¸öƽ̨¸üÉî¶ÈµÄ½áºÏ¡£À´×ÔReactºËÐÄÍŶӵÄSebastian MarkbågeÔÚReactEurope´ó»áÉϸøÁËÒ»¸öÈÃÈËÄ¿µÉ¿Ú´ôµÄÑݽ²¡¶DOM as a Second-class Citizen¡·¡£Ñݽ²ÖÐËû³©ÏëReactÖ±½ÓÊä³öµ½ä¯ÀÀÆ÷¼Ü¹¹µÄµ×²ã£¨Í¼1ä¯ÀÀÆ÷µÄäÖȾ¼Ü¹¹£¬Í¼2ΪSebastian MarkbågeÈÏΪReact¿ÉÒÔ×öµÄÊÂÇ飩¡£
ͼ1 ä¯ÀÀÆ÷µÄäÖȾ¼Ü¹¹
ͼ2 Sebastian MarkbågeÈÏΪReact»¹¿ÉÒÔ×öºÜ¶àÊÂÇé
¹ÃÇÒ²»Ì¸¸Ã²»¸ÃÕâô×ö£¬Í¨¹ýÐéÄâDOM´ò¿ªÁËÕâÑùµÄ»ú»á¾ÍÒѾÈÃÎÒÃÇÐ˷ܲ»ÒÑÁË¡£Ò²ËµÃ÷ÁËFacebookÔÚÉè¼ÆReactʱÒѾ¿¼Âǵ½³¬Ô½DOM¡£Ï뷨ȷʵºÜ³¬Ç°¡£
¡¾·þÎñ¶ËÔ¤äÖȾ£¨Pre-rendering£©¡¿
¶ÔÓÚÆäËûÖ÷Á÷ǰ¶Ë¿ò¼Ü£¬Ò³ÃæSEOºÍÊ״δò¿ªËٶȵÄÎÊÌâ¶¼ºÜÈÃÈËÍ·ÌÛ¡£Twitterµ±ÄêÒòΪÊ״δò¿ªËٶȹýÓÚÂýÉõÖÁÖØ»Ø·þÎñÆ÷äÖȾ·½°¸¡£Ò»Ö±ÒÔÀ´ ÈËÃÇÒ»Ö±ÔÚѰÕÒÒ»ÖÖÖ»ÐèÒª±àдһ´ÎUI×é¼þ£¬Ç°ºó¶Ëͬʱ¶¼ÄÜäÖȾµÄ·½°¸¡£Èç¹ûÄÜ×öµ½µÄ»°£¬ÎÒÃǾͿÉÒÔÔÚÊ״δò¿ªÒ³ÃæÊ±ÏÈÓ÷þÎñ¶ËäÖÈ¾Ò³ÃæHTML£¬µ±ä¯ÀÀ Æ÷ÊÕµ½ºóÒѾ¿ÉÒÔÏÔÊ¾Ò³Ãæ¡£ÕâÑùSEOºÍÊ״δò¿ªËٶȶ¼Äܱ»½â¾ö¡£ÕâÖÖÍêÃÀ·½°¸ÉçÇøÀï³ÆÖ®ÎªIsomorphic/Universal App¡£
ReactÔÉúÖ§³ÖÁËPre-rendering£¨·þÎñ¶ËäÖȾ£©¡£ÓÉÓÚÓÐÐéÄâDOM£¬Ò²¾ÍÒâζ×ÅÎÒÃÇÖ»ÐèÒªºó¶ËÔËÐÐJavaScriptÒýÇæ¾ÍÄÜäÖȾÕû¸öDOM¡£Ä¿Ç°Ö÷Á÷ºó¶ËÓïÑÔ¶¼¿ÉÒÔÔËÐÐV8 JavaScriptÒýÇæ¡£±ÈÈçStrikinglyµÄºó¶ËʹÓÃRuby on Rails£¬Ö»ÐèҪʹÓÿªÔ´µÄreact-rails gem¾Í¿ÉÒÔÔÚRailsºó¶ËäÖȾǰ¶ËReact×é¼þ¡£
ʹÓ÷þÎñ¶ËäÖȾʱҪעÒâwindowºÍdocumentÕâЩä¯ÀÀÆ÷²ÅÓеÄÈ«¾Ö±äÁ¿ÊDz»´æÔڵġ£React×é¼þÌṩÕâÁ½¸ölifecycle hook£ºcomponentDidMountºÍcomponentDidUpdateÔÚ·þÎñÆ÷²»»á±»ÔËÐУ¬Ö»ÓÐÔÚǰ¶Ë²Å»áÔËÐС£Ê¹Ó÷þÎñÆ÷äÖȾʱÈç¹ûÒª ʹÓÃÈκÎä¯ÀÀÆ÷²ÅÓеıäÁ¿ÐèÒª°Ñ´úÂë·Åµ½ÕâÁ½¸ölifecycle hook¶¨ÒåÀï¡£
Êý¾Ý´¦Àí
React¶¨Òå×Ô¼ºÎªMVCÖеÄView¡£ÕâÈÃǰ¶Ë¿ª·¢Õß´ÓV¿ªÊ¼È¥Ë¼¿¼UIÉè¼Æ¡£µ«ÏÖÔÚÕë¶ÔÊý¾Ý²Ù×÷ºÍ»ñÈ¡·½Ê½£¬ÉçÇøÀﻹûÓÐÒ»ÖÖ¹«Èϵķ½·¨¡£ÕâÒ²ÊÇÈκÎдReactÓ¦ÓÃʱ×îÄÑ´¦ÀíµÄµØ·½¡£
¡¾Flux¡¿
¶ÔÓÚMºÍC£¬FacebookÌá³öÁËFluxµÄ¸ÅÄî¡£FluxÊÇÒ»¸öרÃÅΪReactÉè¼ÆµÄÓ¦ÓóÌÐò¼Ü¹¹£ºÓ¦ÓóÌÐòÓÉDispatcher¡¢StoreºÍView×é³É£¬ÆäÖеÄView¾ÍÊÇÎÒÃǵÄReact×é¼þ¡£FluxµÄºËÐÄÊÇÈçͼ3ËùʾµÄµ¥ÏòÊý¾ÝÁ÷¶¯¡£
ͼ3 µ¥ÏòÊý¾ÝÁ÷¶¯ÎªFluxµÄºËÐÄ
Ó¦ÓóÌÐòÖеÄÈκÎÒ»´ÎÊý¾Ý±ä»¯¶¼×÷ΪAction·¢Æð£¬¾¹ýDispatcher·Ö·¢³öÈ¥£¬±»Ïà¹ØµÄStore½ÓÊÕµ½²¢ÕûºÏ£¬È»ºó×÷ΪpropsºÍ stateÌṩ¸øView£¨React×é¼þ£©¡£µ±Óû§ÔÚViewÉÏ×öÁËÈκÎÓëÊý¾ÝÏà¹ØµÄ½»»¥£¬View»á·¢ÆðеÄAction£¬¿ªÆôÒ»´ÎеÄÊý¾Ý±ä»¯ÖÜ ÆÚ¡£ÕâÖÖµ¥ÏòÐÔʹFluxÔڸ߲ã´ÎÉϱȴ«Í³MVC¼Ü¹¹ºÍÒÔAngularºÍKnockoutΪ´ú±íµÄË«ÏòÊý¾Ý°ó¶¨ÈÝÒ×Àí½âµÃ¶à£¬´ó´ó¼ò»¯ÁË¿ª·¢ÕßµÄ˼¿¼ºÍ Debug¹ý³Ì¡£
ÔÚFacebook°ÑFlux×÷ΪһÖÖÉè¼ÆÄ£Ê½£¨¶ø²»ÊÇÒѾ×öºÃµÄ¿ò¼Ü£©Ðû²¼Ö®ºó£¬¼¸ºõÿ¸öÔ³öÏÖһеÄFlux¿â£¬ËûÃǶ¼Óи÷×ÔµÄÌØÉ«£¬ÓеĶԷþ ÎñÆ÷äÖȾ֧³Ö±È½ÏºÃ£¬ÓеÄÔËÓÃÁ˸ü¶àº¯Êýʽ±à³ÌµÄ¸ÅÄî¡£ºÜ¶àFlux¿â¸üÏñÊÇʵÑ飬ÕâÓÐÖúÓÚReactÉú̬µÄÉú³¤£¬µ«²»¿É·ñÈϵÄÊÇ£¬Î´À´»áÓдóÁ¿Flux ¿âÂýÂýËÀÈ¥£¬¶øÖ»ÓÐÉÙÊý»á´æÁôÏÂÀ´»ò½øÐкϲ¢¡£
¡¾GraphQL¡¿
ÔÚ¹¹½¨´óÐÍǰ¶ËÓ¦ÓÃʱ£¬Ç°¶ËºÍºó¶Ë¹¤³Ìʦͨ¹ýAPIµÄ·½Ê½½øÐкÏ×÷¡£APIÒ²ÊÇË«·½µÄÐÒé¡£ÏÖÔÚÖ÷Á÷µÄ·½Ê½ÊÇRESTful API£¬È»¶øÔÚʵ¼ùÖУ¬ÎÒÃÇ·¢ÏÖRESTfulÔÚÒ»Ð©ÕæÊµÉú²ú»·¾³µÄÐèÇóϲ»ÊǺÜÊÊÓá£ÍùÍùÎÒÃÇÐèÒª¹¹½¨×Ô¶¨Òåendpoint£¬¶øÕâÎ¥±³ÁË RESTfulµÄÉè¼ÆÀíÄî¡£
¾Ù¸öÀý×Ó£¬ÎÒÃÇÏëÒªÏÔʾÂÛ̳Ìû×Ó¡¢×÷ÕߺͶÔÓ¦µÄÁôÑÔ¡£ÎÒÃÇ·Ö±ðÒª·¢³öÈý¸ö²»Í¬µÄÇëÇó¡£µÚ¶þ¸öÇëÇóÒÀÀµµÚÒ»¸öÇëÇó½á¹û·µ»ØµÄuser_id£¬Ç°¶ËÐèҪд´úÂëе÷ÇëÇóÖ®¼äµÄÒÀÀµ¡£·Ö±ð·¢³öÈý¸ö²»Í¬ÇëÇóÔÚÒÆ¶¯¶ËÕâÖÖÍøÂç²»Îȶ¨µÄ»·¾³ÏÂЧ¹ûºÜ²»ÀíÏë¡£
[js] view plaincopy
1. GET /v1/posts/1
2. {
3. "id": 1,
4. "title":"React.js in Strikingly",
5. "user_id":2
6. }
[js] view plaincopy
1. GET /v1/users/2
2. {
3. "id":2,
4. "name":"dfguo"
5. }
[js] view plaincopy
1. GET /v1/posts/1/comments
2. [{
3. "id":6,
4. "name":"rechtar",
5. "comment":"Thanks for sharing! I would love to see some examples on GraphQL."},{
6. "id":9,
7. "name":"tengbao",
8. "comment":"I heard that you guys also use immutable.js. How did it help?"},{
9. "id":12,
10. "name":"syjstc",
11. "comment":"Impressive work! Thanks guys!"
12. },{
13. "id":18,
14. "name":"abeth86",
15. "comment":"Thanks for the sharing!"
16. }]
Ϊ½â¾öÕâÀàÎÊÌ⣬¹¤³Ìʦ»á×Ô¶¨ÒåһЩendpoint¡£¶ÔÓÚÕâ¸öÀý×Ó£¬ÎÒÃÇ¿ÉÒÔ½¨Á¢Ò»¸ö/feedsµÄendpoint£¬¼¯ºÏÁËËùÓÐǰ¶ËÐèÒªµÄ½á¹û£º
[js] view plaincopy
1. GET /v1/feeds/1
2. {
3. "id":1,
4. "title":"React.js in Strikingly",
5. "user":{
6. "id":2,
7. "name":"dfguo"
8. },
9. "comments":[
10. {
11. "id":6,
12. "name":"rechtar",
13. "comment":"Thanks for sharing! I would love to see some examples on GraphQL."
14. }...
15. ]
16. }
µ«ÊÇÎÒÃÇÔÚijЩ³¡¾°ÉÏ¿ÉÄÜÖ»ÐèÒªpostºÍuser£¬²»ÏëÒªcomments¡£ÕâʱÄѵÀÒªÔÙ¶¨ÒåÒ»¸öfeeds_without_comments µÄendpoint£¿Ëæ×ÅÐèÇóµÄ¸Ä±ä£¬×Ô¶¨ÒåendpointµÄ·½·¨ÍùÍùʹµÃAPI½Ó¿Ú±äµÃÀÛ׸£¬Î¥±³ÁËRESTfulµÄÉè¼ÆÀíÄî¡£¶øÈκÎǰ¶Ë¹¤³ÌʦÐèÒª µÄÊý¾ÝÒ»µ©Òª¸Ä±ä¶¼ÐèÒªºó¶Ë¹¤³ÌʦµÄÅäºÏ£¬Õâ½µµÍÁ˲úÆ·µÄµü´úËÙ¶È¡£
À´×ÔFacebookµÄGraphQLÊÇÎÒÈÏΪĿǰ×î½Ó½üÍêÃÀµÄ½â¾ö·½·¨¡£ºó¶Ë¹¤³ÌʦֻÐèÒª¶¨Òå¿ÉÒÔ±»²éѯµÄType System£¬Ç°¶Ë¹¤³Ìʦ¾Í¿ÉÒÔʹÓÃGraphQL×Ô¶¨Òå²éѯ¡£GraphQL²éѯÓï¾äÖ»ÐèÒªÐÎÈÝÐèÒª·µ»ØµÄÊý¾ÝÐÎ×´£º
{
post(id:1){
id,
title,
user{
id,
name
},
comments{
id£¬
name,
comment
}
}
}
GraphQL·þÎñÆ÷¾Í»á·µ»ØÕýÈ·µÄJSON¸ñʽ£º
[js] view plaincopy
1. {
2. "id":1,
3. "title":"React.js in Strikingly",
4. "user":{
5. "id":2,
6. "name":"dfguo"
7. },
8. "comments":[
9. {
10. "id":6,
11. "name":"rechtar",
12. "comment":"Thanks for sharing! I would love to see some examples on GraphQL.
13. }...
14. ]
15. }
GraphQLÒ²ÔÉúÖ§³ÖÁËAPI°æ±¾¿ØÖÆ£¬ÈÃÄã¿ÉÒÔͬʱ¹²´æ¶à¸ö°æ±¾µÄ¿Í»§¶Ë£¨°üÀ¨WebºÍMobile£©¡£ÕâЩ¶¼»á¼õÉÙ¿Í»§¶Ë¹¤³ÌʦºÍºó¶Ë¹¤³ÌʦµÄñîºÏ¶È£¬Ìá¸ßÉú²úÁ¦¡£
½ñÄê7Ô¸ÕÍÆ³öÁËGraphQLµÄ¹æ·¶²¢¿ªÔ´ÁËJavaScript GraphQL¿â¡£È»¶øÒªÈÃGraphQL³ÉΪÖ÷Á÷£¬FacebookÐèÒª´òÔìÒ»¸öÏñReactÕâÑùµÄÉú̬ϵͳ¡£ÒªÏëÔÚÄã×Ô¼ºµÄÓ¦ÓÃÉÏÓÃGraphQL»¹ ±ØÐëÒªÓкó¶ËÓïÑÔÌṩGraphQL¿âµÄÖ§³Ö¡£±ÈÈçStrikinglyÐèÒªGraphQL Ruby¿â¡£Õâ²»½ö½öÐèҪǰ¶Ë¹¤³Ìʦ¡£ÎÒÃÇÈÏΪÕ⽫»á±ÈReactÉú̬ϵͳ¸üÄѽ¨Á¢£¨¼ûͼ4Ëùʾ£©¡£FacebookÐèÒªÕû¸öÉçÇøµÄ²ÎÓë²ÅÄÜ´ïµ½¡£
ͼ4 GraphQLÉú̬ϵͳ
¡¾Relay¡¿
RelayÊÇFacebookÌá³öµÄÔÚReactÉÏÓ¦ÓÃGraphQLµÄ·½°¸¡£ReactµÄ»ù´¡µ¥Î»ÊÇ×é¼þ£¨Component£©£¬¹¹½¨´óÐÍÓ¦ÓÃ¾Í ÊÇ×éºÏºÍǶÌ××é¼þ¡£ÒÔ×é¼þΪµ¥Î»µÄÉè¼ÆÄ£Ê½ÊÇĿǰÉçÇøÀï×îÈϿɵģ¬ÕâÒ²ÊÇǰ¶ËÊÀ½çµÄÇ÷ÊÆÖ®Ò»¡£Ã¿¸ö×é¼þÐèÒªµÄÊý¾ÝÒ²Ó¦¸ÃÔÚ×é¼þÄÚ²¿¶¨Òå¡£RelayÈÃ×é¼þ ¿ÉÒÔ×Ô¶¨ÒåÆäËùÐèÒªGraphQLÊý¾Ý¸ñʽ£¬ÔÚ×é¼þʵÀý»¯µÄʱºòÔÙÈ¥GraphQL·þÎñÆ÷»ñÈ¡Êý¾Ý¡£RelayÒ²»á×Ô¶¯¹¹½¨Ç¶Ì××é¼þµÄGraphQL²é ѯ£¬ÕâÑù¶à¸öǶÌ×µÄ×é¼þÖ»ÐèÒª·¢Ò»´ÎÇëÇó¡£Relay½«»áÔÚ8Ô·ݿªÔ´¡£
¡¾Immutability¡¿
ReactÉçÇø½ÓÊÜÁ˺ܶຯÊýʽ±à³ÌµÄÏë·¨£¬ÆäÖÐÊÜClojureÓ°ÏìºÜÉî¡£¶ÔImmutableÊý¾ÝµÄʹÓþÍÊÇÀ´×ÔClojureÉçÇø¡£µ±Äê Om£¬Õâ¸öÓÃClojureScriptдµÄReact wrapperÔÚËÙ¶ÈÉϾÓÈ»ÍêŰÔÉúJavaScript°æ±¾µÄReact¡£ÕâÈÃÕû¸öÉçÇø¶¼Õð¾ªÁË¡£ÆäÖÐÒ»¸öÔÒò¾ÍÊÇClojureScriptʹÓÃÁË ImmutableÊý¾Ý¡£ReactÉçÇøÀïҲð³öÁËImmutable.js£¬ÕâÈÃJavaScriptÀïÒ²ÄÜʹÓÃImmutableÊý¾Ý£¬ÍêÃÀÃÖ²¹ÁË JavaScriptÔÚ¸ºÔðÊý¾Ý¶ÔÏó±È½ÏµÄÏÈÌìÐÔ²»×ã¡£Immutable.jsÒ²³ÉΪÁ˹¹½¨´óÐÍReactÓ¦Óõıر¸¡£ÉõÖÁÓÐÔÚÌÖÂÛÊÇ·ñ°Ñ Immutable.jsÖ±½ÓÄÉÈëJavaScriptÓïÑÔÖС£ÎÒÃÇÈÏΪСÐÍÓ¦Óò»»áÓöµ½ÐéÄâDOMµÄÐÔÄÜÆ¿¾±£¬ÒýÈëImmutable.jsÖ»»áÈÃÊý¾Ý ²Ù×÷ºÜÀÛ׸¡£
¹¤¾ß
¹¤ÓûÉÆÆäÊ£¬±ØÏÈÀûÆäÆ÷¡£ReactµÄ»ð±¬µÃÁ¦ÓÚÀ´×ÔÉçÇøµÄ¹¤¾ß£¬¶øReactÒ²ÍÆ¶¯ÁËÕâЩ¹¤¾ßµÄ½ø²½¡£ÕâÀïÎÒÃÇÏë½éÉܼ¸¸öReactÉçÇøÀï±È½ÏÊÜ»¶ÓµÄ¹¤¾ß¡£
¡¾Webpack¡¿
ÔÚReactÀÓÉÓÚÐèÒªÓõ½JSX£¬Ê¹ÓÃWebpack»òBrowserifyÕâÀ๤¾ß±àÒë´úÂëÒѾ½¥½¥³ÉΪǰ¶Ë¹¤³Ìʦ¹¤×÷Á÷³ÌµÄÒ»²¿·Ö¡£WebpackÊÇÒ»¿îÇ¿´óµÄǰ¶ËÄ£¿é¹ÜÀíºÍ´ò°ü¹¤¾ß£¨¼ûͼ5Ëùʾ£©¡£ÕâÀïÁгöËüµÄÒ»Ð©ÌØÐÔ£º
1. ͬʱ֧³ÖCommonJSºÍAMDÄ£¿é£»
2. Áé»îºÍ¿ÉÀ©Õ¹µÄLoader£¨¼ÓÔØÆ÷£©»úÖÆ£¬ÀýÈçÌṩ¶ÔJSX¡¢ES6¡¢LessµÄÖ§³Ö£»
3. Ö§³Ö¶ÔCSS£¬Í¼Æ¬µÈÆäËû×ÊÔ´½øÐдò°ü£»
4. ¿ÉÒÔ»ùÓÚÅäÖúÍÖÇÄÜ·ÖÎö´ò°ü³É¶à¸öÎļþ£»
5. ÄÚÖÃÇ¿´óµÄCode Splitting¹¦ÄÜ¿ÉÒÔ²ð·Ö²¢¶¯Ì¬¼ÓÔØ°ü£»
6. ¿ª·¢Ä£Ê½Ö§³ÖHot Module Replacementģʽ£¬Ìá¸ß¿ª·¢Ð§ÂÊ¡£
ͼ5 ǰ¶ËÄ£¿é¹ÜÀíºÍ´ò°ü¹¤¾ßWebpack
¡¾Babel¡¿
ECMAScript 6£¨ES6£©¹æ·¶ÔÚ½ñÄêËÄÔ¸ÕÇö¨£¬ReactÉçÇø»ù±¾È«ÃæÓµ±§ES6¡£µ«Ä¿Ç°»¹Óкܶàä¯ÀÀÆ÷²»Ö§³ÖES6¡£Ê¹ÓÃÏñWebpackÕâÑùµÄ¹¤¾ß±àÒë´úÂëʹµÃ ÎÒÃÇ¿ÉÒÔÔÚ¿ª·¢Ê±Ê¹ÓÃES6£¨»òÕ߸üа汾£©£¬ÔÚÉÏÏßǰ±àÒë³ÉES5¡£±àÒ빤¾ßÖÐ×îÒýÈË×¢ÒâµÄÊÇBabel¡£Ç°ÉíΪES6to5£¬BabelÊÇĿǰÉçÇø×î »ðµÄES6±àÒëµ½ES5µÄ´úÂ빤¾ß£¬FacebookÍŶÓÉõÖÁÒѾ¾ö¶¨×ªÓÃBabel¶ø²»ÔÙά»¤Ö®Ç°ÄÚ²¿Ê¹ÓõÄjstranform¡£Í¨¹ýLoader»ú ÖÆ£¬Webpack¿ÉÒԷdz£¼òÒ׵غÍBabel½áºÏÓ¦Óá£
¡¾React-hot-reload¡¿
ÔÚ¿ª·¢ÈκδóÐÍǰ¶ËÓ¦Óùý³ÌÖУ¬ÎÒÃdz£³£»áÒòΪһЩС´íÎó¾ÍÐèÒªÖØÐÂË¢ÐÂÕû¸öÒ³Ãæ¡£React-hot-reload³¢ÊÔ½â¾öÕâ¸öÎÊÌ⣬Ìá¸ß¿ª·¢Ð§ÂÊ¡£ËûʹÓÃÁËWebpackµÄHot Module Replacement¹¦ÄÜ£¬¶¯Ì¬Ìæ»»React×é¼þµÄlifecycle hook¶¨Ò壬²»ÓÃË¢ÐÂÒ³ÃæÒ²¿ÉÒÔ¸üдúÂë±ä»¯¡£
¡¾React Developer Tool¡¿
Õâ¿îFacebook¹Ù·½ÍƳöµÄChrome²å¼þ¿ÉÒÔÈÃÄã·½±ãµØÔÚä¯ÀÀÆ÷ÖÐÖ±½Ó²é¿´ReactµÄ×é¼þ½á¹¹¡£°²×°ºó£¬ÔÚChrome¿ª·¢Õß¹¤¾ßÖлá¶à³öÒ»¸öReact Tab¡£½çÃæ¾ÍÏñDOM InspectorÒ»Ñù£¬Ö»²»¹ýÊÇ¿´React×é¼þ½á¹¹¹ØÏµ¡£ÊÇ¿ª·¢ReactÓ¦Óò»¿É¶àµÃµÄ¹¤¾ßÖ®Ò»¡£
ÌôÕ½
ReactÕýÔÚ¿ìËÙ¿ªÍØ×ÅËüµÄ½®½ç£¬ÕâÒâζÔÚ»ñµÃеÄϲÔõÄͬʱ£¬ÎÒÃÇÒ²ÃæÁÙ×ÅÐí¶àеÄÌôÕ½¡£ÏÖÔÚÎ§ÈÆ×ż¸¸ö´óµÄÒéÌ⣬ReactÉçÇøÈÔûÓдï³É¶¨ÂÛ£¬Ã¿ÖÜÉõÖÁÿÌì¶¼ÓÐеÄʵÑéÏîÄ¿ÔÚ³¢ÊÔÕâЩÎÊÌâµÄ½â¾ö¡£
¡¾¶¯»¡¿
Ò»Ö±ÒÔÀ´´ó¼Ò¶¼¶Ô¶¯»Ó¦¸ÃÔÚReactÀïÔõô±í´ïΪ״̬¸Ðµ½À§»ó¡£Cheng LouµÄReact Tween StateÊÇÎÒÃÇÈÏΪ×î·ûºÏReact˼άµÄ×ö·¨¡£°ÑÎ»ÒÆ´æÔÚStateÀȻºóͨ¹ýJavaScript¶¯Ì¬äÖȾеÄλÖᣲ»¹ý´ó¼Ò¶Ô¸Ã×ö·¨ÊÇ·ñÄÜ´ïµ½ ÂúÒâµÄËÙ¶ÈÒ»Ö±³ÖÓб£Áô̬¶È¡£ÔÚ½ñÄêReactEuropeµÄÑݽ²ÖУ¬ËûΪÎÒÃÇÕ¹ÏÖ³öÁ˳öÉ«µÄЧ¹ûºÍËÙ¶È£¬·Ç³£ÖµµÃÒ»¿´¡£
ÔÚStrikingly£¬ÎÒÃǶÔÓÚ¶¯»Ôò²ÉÈ¡Á˱ȽÏʵÓÃÖ÷ÒåµÄ´¦Àí·½Ê½£ºÎÒÃǶ¨ÒåÁËһЩÈÝÆ÷×é¼þ£¬±ÈÈç¡´JQFade/¡µºÍ¡´JQSlide/¡µ£¬ ÔÚÆäÖе÷ÓÃjQueryµÄ¶¯»·½·¨À´ÊµÏÖÏàÓ¦µÄTransition¡£ÕâÖÖ·½Ê½ÔÚÀíÂÛÉϲ¢²»ÍêÈ«·ûºÏReactµÄ¾«Éñ£¬²»¹ýµ½ÏÖÔÚΪֹ»¹ÊÇÄܹ»Âú×ãÎÒÃÇÐè ÇóµÄ¡£
¡¾Flux¿âÓëRelay¡¿
ÕýÈçÉÏÎÄÒѾÌáµ½¹ýµÄ£¬Ä¿Ç°FluxµÄ¸÷ÖÖʵÏÖ¿ÉνÊǰٻ¨Æë·Å£¬ÆäÖл¹²¢Ã»ÓгöÏÖÒ»¸ö¾ßÓÐȨÍþÐÔµÄÊÂʵ±ê×¼¡£RelayͬÑùÒ²ÊǸոշõ»¯²»¾ÃµÄÐÂÉú¸ÅÄî——ËùÓÐÕâЩÒâζ×ÅËäÈ»Flux+Relay»á´øÀ´Éú²úÁ¦µÄ·ÉÉý£¬ÒªÊµ¼ÊÓÃÉÏËüÃÇÎÒÃÇ»¹Òª´ýÒÔʱÈÕ¡£
¡¾CSS¡¿
CSSÊÇÒ»¸öÓÐȤµÄ»°Ìâ£ºËÆºõËùÓÐÈ˶¼¾õµÃµ±Ç°µÄCSSÓÐÉî¿ÌµÄȱÏÝ£¬µ«ÊǶÔÓÚÔõô½â¾öÕâЩȱÏÝ´ó¼ÒµÄÒâ¼ûÈ´·Ö³ÉÁËÁ½Åɸ÷²»ÏàÈãºÒ»ÅÉÈÏΪCSS “¿ÉÒÔ±»Ð޺Ô£¬²¢ÇÒÖÂÁ¦ÓÚÐÞºÃËü£¬Óɴ˵®ÉúÁËcssnextÕâÑùµÄÏîÄ¿£»ÁíÒ»ÅÉÈÏΪCSS´Ó¸ù±¾ÉÏ×÷Ϊµ®ÉúÓÚÒ»¸ö¹ÅÀÏʱ´úµÄ¶«Î÷£¬ÒѾ²»ÄÜÊÊÓ¦´ó¹æÄ£¡¢ ×é¼þ»¯µÄÏÖ´ú¿ª·¢Á÷³Ì£¬Õâһ˼Ï뼯Öз´Ó³ÔÚChristopher ChedeauµÄÑݽ²¡¶React: CSS in JS¡·ÖУ»ÔÚÆäÖÐËûÌá³öÁËCSSµÄÆß¸ö¸ù±¾ÎÊÌ⣬ȻºóÖ¸³öÔÚJavaScriptÖÐÖ±½ÓʹÓÃinline CSS¿ÉÒÔ¼¸ºõ“Ãâ·Ñ”µØ½â¾öËùÓÐÕâЩÎÊÌâ¡£ÔÚ´«Í³µÄWeb¿ª·¢×î¼Ñʵ¼ùÖÐinline CSSÒ»Ö±ÊDZ»Ñ¹ÖƵķ´ÃæÊµ¼ù£¬ÏÖÔÚÎÒÃÇÈ´Äܹ»ÒÔÒ»¸öȫеÄÊӽǿ´´ýËü£¬ÕâÒ²ÍêÃÀµØÀýÖ¤ÁËReactÕæµÄÊÇÔÚ¸øÕû¸öǰ¶ËÊÀ½ç´øÀ´¸ù±¾ÐÔµÄÍÆ¶¯¡£
×ܽá
ÔÚ²»¾ÃǰµÄJSConf 2015ÉϺÕÃÅÌá³öÁËǰ¶ËµÄĦ¶û¶¨Àí£ºÇ°¶Ëÿ18Ô»áÄÑÒ»±¶¡£Ç°¶ËÖ®ËùÒԱ仯Õâô¿ì£¬ÊÇÒòΪÎÒÃÇÏÖÔÚÃæÁÙ×ÅǰËùδÓеŤ³Ì»¯ÌôÕ½¡£½ñÌìµÄǰ¶Ë¸´ÔӶȸú¼¸Äê ǰÍêÈ«²»ÊÇÒ»¸öµÈ¼¶¡£ÕâÒ²´ÙʹÉçÇøÒªÕÒµ½ÔÚÕâÖÖ¸´ÔÓ¶ÈÏÂÄܱ£³Ö¿ª·¢Ð§ÂʺͿª·¢ÌåÑéµÄ¹¤¾ßºÍÉè¼ÆÄ£Ê½¡£ReactÉçÇø´ÓÆäËûÁìÓò£¨ÓÎÏ·äÖȾ¡¢ ClojureScript¡¢º¯Êýʽ±à³Ì£©ÍµÊ¦Ñ§ÒÕ£¬½áºÏǰ¶ËÃæÁٵĶÀÌØÎÊÌ⣬Ìá³öÁËһϵÁнâ¾ö·½°¸¡£ReactÉçÇøÔÚ¸÷·½Ãæ¶¼ÍÆ¶¯×Åǰ¶ËÉçÇøÍùǰ½ø¡£Õâ ¶ÔÕû¸öÉçÇø¶¼ÊǺÃÊ¡£ÎÒÃÇҲϣÍûǰ¶Ë¸÷¸ö¿ò¼Ü¿ÉÒÔ»¥Ïàѧϰ£¬¹²Í¬Íƶ¯Õû¸öÉçÇøµÄ·¢Õ¹¡£