ÔÚÏÖ´úǰ¶ËÓ¦ÓõŤ³Ìʵ¼ùÖУ¬Ç°ºó¶Ë·ÖÀëµÄ¼Ü¹¹»áΪÁ½¶Ë´øÀ´¸ü¶àµÄÁé»îÐÔ£¬ÒѳÉΪÖ÷Á÷Ç÷ÊÆ¡£ÓëÖ®Ïà¶ÔµÄ£¬´«Í³µÄµ¥ÌåWebÓ¦Óã¨Monolithic
Web Application£©Ôò½«Ç°ºó¶Ë´úÂë·ÅÔÚÒ»Æð£¬ËäÈ»ñîºÏÐÔ½ÏÇ¿£¬µ«ÔÚ²úÆ·Ñз¢µÄÌØ¶¨½×¶ÎÈÔ¾ßÓнÏÇ¿µÄÓÅÊÆ£¬ÔçÆÚµÄASP.NET¡¢Java
Spring MVC£¬ÒÔ¼°Ruby On Rails¶¼Êǵ¥ÌåÓ¦ÓõĴú±íÐÔ¿ò¼Ü¡£
±¾ÎĽ«ÒÔFreeWheel´Óµ¥ÌåÓ¦ÓøÄÔìΪǰºó¶Ë·ÖÀëµÄʵ¼ùΪÀý£¬×ÅÖØ½éÉÜÆä¼äǰ¶ËËùÓöµ½µÄÌôÕ½ºÍ½â¾ö·½°¸¡£
Ïà½ÏÏû·ÑÕߣ¬ÉÌÒµÓû§¶Ôǰ¶ËÓ¦ÓõÄÐèÇó¸ü¾ß¸´ÔÓÐÔ£¬ÇÒ¸üÇ¿µ÷ÖÊÁ¿¡£FreeWheelÉî¸ûÆóÒµ¼¶µÄÊÓÆµ¹ã¸æÁìÓò10Ä꣬Æä»ùÓÚRuby
On Rails¿ò¼ÜΪ¹ã¸æÖ÷´òÔìµÄWeb¹ÜÀíÓ¦ÓÃÒѾÀú¶àÂÖµü´úºÍÑݽø£¬Ä¿Ç°ÒÑ´ïµ½20¶à¸ö²úÆ·Ä£¿é£¬1200+Ò³Ãæ£¬´úÂëÁ¿ÒÑ´ïµ½143.5ÍòÐдúÂ룬ÆäÖаüº¬39ÍòÐлùÓÚjQueryµÄ´«Í³JS´úÂ롣Ϊ±£Ö¤ÆäÖÊÁ¿£¬ÆäÖаüº¬ÁË20.2ÍòÐе¥Ôª²âÊÔ´úÂ룬³ý´ËÒÔÍ⣬»¹ÓжÀÁ¢µÄ½ü2Íò¸ö×Ô¶¯»¯²âÊԽű¾¡£ÔÚÁ½Äêǰ£¬ÎÒÃǸÐÊܵ½Á˵¥ÌåÓ¦ÓõľÖÏÞÐÔ£¬²¢¾ö¶¨½«Æä¸ÄÔì³ÉΪǰºó¶Ë·ÖÀëµÄ¼Ü¹¹¡£

¼¼ÊõÑ¡ÐÍ
FreeWheelǰ¶ËÕ¹ÏÖµÄÒµÎñ¶àÖÖ¶àÑù£¬µ«ÆäÓû§ÌåÑéÇ¿µ÷¸ßЧÐԺ͸ßÒ»ÖÂÐÔ¡£Îª¸¨ÖúÒµÎñÑз¢ÍŶӽøÒ»²½ÌáÉýǰ¶Ë¿ª·¢µÄЧÂʺÍЧ¹û£¬ÎÒÃÇÔÚ¸ÄÔìǰÆÚ¶©Á¢ÁË×é¼þ»¯µÄÄ¿±ê£¬Á¦Çó½«Í³Ò»µÄÓû§ÌåÑéºÍ¸´ÔÓµÄÄÚ²¿½»»¥Âß¼·â×°½ø×é¼þ£¬Í¨¹ý×Ô¶¯»¯²âÊÔ±£Ö¤ÆäÖÊÁ¿£¬²¢×îÖÕÔÚÒµÎñÄ£¿éÖй㷺¸´Óá£
Õë¶ÔÒÔÉÏÄ¿±ê£¬ÎÒÃÇÑ¡ÔñReact×÷ΪÐÂǰ¶ËºËÐļ¼Êõ£¬ÒÔES6×÷Ϊ¿ª·¢ÓïÑÔ£¬ÀûÓÃWebpackºÍBabel½øÐбàÒë´ò°ü¡£ÒÔMochaÈ«¼ÒͰ¼ÓEnzyme×÷Ϊµ¥Ôª²âÊÔ¿ò¼Ü±£Ö¤×é¼þÖÊÁ¿¡£Ã¿¸öÒµÎñÄ£¿é¾ù¿ª·¢¡¢´ò°ü²¢·¢²¼ÎªÒ»¸ö¶ÀÁ¢µÄSPA£¨Single
Page Application£¬µ¥Ò³Ó¦Óã©£¬¶à¸öÄ£¿éSPAÖ®¼ä£¬³ýÁËÒÔͳһµÄSSO·þÎñ±£Ö¤Óû§ÈÏÖ¤Í⣬²¢ÎÞ¸ü¶àµÄñîºÏ£¬ÕâÒ»µã±£Ö¤Á˶à¸öÒµÎñÄ£¿éÍŶӵŤ×÷²»»á»¥ÏàÖÆÔ¼¡£
ÔÚµ¥ÏòÊý¾ÝÁ÷¿ò¼ÜÑ¡ÔñÉÏ£¬ÎÒÃÇ»ùÓÚFacebookµÄFluxÍÆ½øÁËÏ൱³¤µÄÒ»¶Îʱ¼ä¡£ÔÚÉÏÏßÁ½¸öÒµÎñÄ£¿éºó£¬ÎÒÃÇÈÏʶµ½FreeWheelµÄÒµÎñ¶Ôǰ¶ËÊý¾ÝÁ÷ÐèÇóµÄ¸´ÔÓ¶ÈÔ¶¸ßÓÚ³£¼ûµÄTodoMVCÑùÀý£¬FluxʵÏÖÕâЩÐèÇóʱ»áÓöµ½½Ï¶àÀ§ÄÑ¡£ÎÒÃÇÆÀ¹ÀÁ˵±Ê±µÄÉçÇøÐÂÐãRedux£¬ËüÄÜÒ»¶¨³Ì¶È»º½âÎÒÃÇÓöµ½µÄÎÊÌ⵫ÈÔÓоÖÏÞÐÔ¡£ÎÒÃÇ×îÖÕ¾ö¶¨ÒÔReduxºÍImmutableJSΪ»ù´¡£¬¿ª·¢Ò»Ì×еĵ¥ÏòÊý¾ÝÁ÷¿ò¼Üspark-modula¡£ÕâµãÔÚÏÂÒ»½Ú»áÓÐÏêϸÃèÊö¡£
ÀàËÆµÄ»¹ÓÐǰ¶Ë·ÓÉ¡£ÎÒÃdzõÆÚµÄÑ¡ÐÍÊÇreact-router£¬Ëæºó¸ù¾ÝÏîÄ¿ÐèÒª¿ª·¢ÁËеÄǰ¶Ë·ÓÉ¿ò¼Üspark-router¡£
¸üÏêϸµÄǰ¶Ë¿ò¼ÜÑ¡ÐÍÈçÏ£º

ÖÁÓÚºó¶Ë£¬ÎÒÃǵÄÑ¡ÐÍÊÇÒÔGolang¿ª·¢µÄ΢·þÎñ¡£½è´ËÆõ»ú£¬ÍŶӽ«ÔÀ´ÄÚÖÃÓÚµ¥ÌåÓ¦ÓÃÖеĺó¶Ë·þÎñÖØÐÂ×öÁËÒ»´ÎÊáÀí£¬²¢Öð²½Öع¹³É΢·þÎñ¼Ü¹¹ÖеÄÈô¸É¸ö΢·þÎñ¡£Ç°¶ËÔÚͨ¹ýSSOÑéÖ¤ºó£¬ÒÔJSON¸ñʽÓë΢·þÎñ½»»»Êý¾Ý¡£ÕâЩ΢·þÎñ³ýÁËÂú×ãǰ¶ËʹÓã¬Ò²»áͨ¹ýgateway×÷ΪAPI±©Â¶¸øÎÒÃǵĿͻ§£¬¸ü»áΪ¹«Ë¾ÄÚ²¿µÄÆäËû΢·þÎñÌṩ»ù´¡¡£ºó¶Ë¼Ü¹¹²»ÊDZ¾ÎÄÖØµã£¬¹Ê²»×¸Êö£¬ÓÐÐËȤµÄ¶ÁÕßÇë²Î¼ûFreeWheel·¢±íµÄÆäËûÎÄÕ¡£
ÐÂÂÖ×ÓSparkUI
ΪÁËÍÆ½øÇ°ºó¶Ë·ÖÀë¸ÄÔ죬ÎÒÃdzÉÁ¢ÁËÒ»¸öרÃŵÄǰ¶ËСÍŶӣ¬ÓëÒµÎñÄ£¿é¿ª·¢ÍŶӽôÃܺÏ×÷£¬¾ÀúÊýÊ®¸öµü´ú£¬¿ª·¢²¢ÍêÉÆÁËÒ»Ì×»ùÓÚReactµÄǰ¶Ë¿ò¼Ü£¬ÄÚ²¿Ãû³ÆÎª¡°SparkUI¡±£¨ÕâÒ»Ãû³ÆÓëApache
Spark»òJava SparkÎ޹أ©¡£ÏÂͼÊÇSparkUI¿ò¼ÜµÄ¼òÒª¼Ü¹¹£º

ÆäÖÐÉÏÓεÄReact¡¢Redux¡¢ImmutableJSµÈ¿ò¼ÜΪSparkUIµÄÖ±½ÓÒÀÀµ£¬ÏÂÓεÄBusiness
ComponentsÒµÎñ×é¼þ¡¢Business ModulesÒµÎñÄ£¿éÔòΪ»ùÓÚSparkUI¿ò¼Ü¿ª·¢ÒµÎñ´úÂëµÄ²ú³ö£»ÏνÓÉÏÏÂÓεģ¬ÔòÊÇSparkUIµÄºËÐÄ×é³É²¿·Ö¡£
¿ÉÖØÓÃ×é¼þLibrary Components
SparkUI½ØÖ¹ÖÁ½Ø¸åÈÕÒÑ»ýÀÛÁË40¸ö×Ópackage£¬ÆäÖкܴóÒ»²¿·ÖΪ¿ÉÖØÓõÄUI×é¼þ£¬ÎÒÃdzÆÖ®ÎªLibrary
Components£¬ÀýÈçspark-loading¡¢spark-calendar¡¢spark-raw-gridµÈ¡£·²ÊÇÒµÎñÄ£¿éÌá³öµÄ¶Ôǰ¶Ë×é¼þµÄÐèÇó£¬Ö»ÒªÓëÒµÎñ²¢²»Ö±½ÓÏà¹ØµÄ£¬ÎÒÃǶ¼»áÉè¼Æ²¢µü´ú¿ª·¢ÏàÓ¦µÄ¿ÉÖØÓÃ×é¼þ¡£
ÎÒÃÇÔÚÉè¼Æ¿ÉÖØÓÃ×é¼þʱ£¬×ñѵÄһЩҪµã°üÀ¨£º
ÎÞ״̬×é¼þ£¨Stateless Component£©ÓÅÓÚ״̬»¯×é¼þ£¨Stateful Component£©£»
×éºÏ×é¼þ£¨Composing Components£©ÓÅÓÚ¾ßÓÐDSL£¨Domain Specific
Language£©ÊôÐԵĵ¥Ò»×é¼þ£»
¸ß½××é¼þ£¨HOC£¬Higher-Order Component£©ÓÅÓÚ»ìºÏÊôÐÔ£¨Mixins£©¡£
Ó¦ÓÃ״̬¹ÜÀí¿ò¼Üspark-modula
ÉÏÒ»½ÚÌáµ½FluxËùÌṩµÄµ¥ÏòÊý¾ÝÁ÷²»ÄÜÍêÈ«Âú×ãÎÒÃǵÄÒµÎñÐèÇó¡£ÎÒÃÇÔÚ¶Ô±ÈÁËFluxºÍReduxºó£¬¾ö¶¨×ÔÖ÷¿ª·¢Ò»Ö»ÐÂÂÖ×Ó¡£µ±Ê±Ãæ¶ÔµÄÌôÕ½°üÀ¨µ«²»ÏÞÓÚ£º
ÔÚRuby On RailsÓ¦ÓÃÖУ¬¿ª·¢ÍŶÓÔøÉè¼Æ²¢¿ª·¢ÁË´óÁ¿µÄModel£¬Õâ²»½öÊÇÒòΪҪ×ñÊØRoRµÄMVCʵ¼ù£¬¸üÊÇÒòΪҵÎñµÄ¸´Ôӳ̶ȿ͹ÛÒªÇóÓÐÍêÕûµÄ½¨Ä££¬²¢»ùÓÚÄ£ÐÍÍÆ½øÇ°¶ËµÄ¿ª·¢¡£ÎÒÃǵÄÐÂÂÖ×ÓÐèÒªÒÔÀàËÆµÄ·½Ê½À´Ïû»¯ÒµÎñµÄ¸´ÔÓÐÔ£»
ÔÚÒµÎñµÄǰ¶ËÐèÇóÖУ¬³£³£ÓÐÒ»¸öÒ³ÃæÄÚ°üº¬2¸öÉõÖÁ¶à¸öGrid£¬ÕâЩGridÖ®¼ä»á»¥ÏàÓ°Ïì¡£±ÈÈçÒ»¸öµäÐͳ¡¾°£º¡°Grid
AÔÚ×Ô¶¯¼ÓÔØºó£¬Èç¹ûÖ»°üº¬Ò»Ìõ¼Ç¼£¬Ôò×Ô¶¯Ñ¡ÖÐÕâÌõ¼Ç¼£¬²¢°´¸Ã¼Ç¼ID¶ÁÈ¡Grid B¡±¡£ÕâÑùµÄ½»»¥ÔÚReactÉçÇø±»³ÆÎª¸±×÷Óü´Side
Effects¡£ÎÒÃǵÄÐÂÂÖ×ÓÐèÒªÓÃÏà¶Ô¼òµ¥µÄ·½Ê½Ö§³ÖSide EffectsµÄ´¦Àí¡£
ÕâÖ»Ó¦ÓÃ״̬¹ÜÀíµÄÐÂÂÖ×ÓÎÒÃÇÆðÃûΪModula£¬²¢Èëspark-modula°ü¡£¾¹ý¿ìËÙµü´ú£¬Modula¿ò¼ÜÒÑÕýÊ½Ìæ´úÔçÆÚµÄFlux£¬Ó¦ÓÃÓÚÒµÎñÄ£¿é¿ª·¢¡£Modula°üÀ¨ModelÄ£ÐÍ¡¢Constants³£Á¿¡¢ContainerÈÝÆ÷¡¢Test
Utility²âÊÔ¹¤¾ßËĸö×é³É²¿·Ö£¬ÆäÖÐModel°üº¬Props/Hierarchy¡¢Context¡¢Sender/Receiver¡¢Delegates¡¢Bubble
Event¡¢Lifecycle Methods¡¢Services¡¢Local PropsµÈ¸ÅÄAPI¡£ÒÔÏÂÊÇÒ»¸öµäÐ͵ÄModelÀý×Ó£º

¿ÉÒÔ¿´³öÉϰ벿·ÖÏ൱ÓÚModelµÄschema£¬Props/Hierarchy/Context »ùÓÚImmutableÊý¾Ý½á¹¹ÊµÏÖÁËÊý¾ÝÄ£ÐÍ£»¶øÏ°벿·ÖÏ൱ÓÚModelµÄÐÐΪ£¬Sender/Receiver
+ Modula ContainerʵÏÖÁ˵¥ÏòÊý¾ÝÁ÷¡£
Modula¿ò¼Ü»ùÓÚReduxµ«²¢²»ÏÞÓÚRedux£¬Ó벿·ÖReduxÉú̬£¨Èçredux-devtools£©¼æÈÝ£¬ÇÒÒÑÍêÕû·â×°²¢Òþ²ØÁ˵ײãµÄRedux¡£
¹ØÓÚSparkUI¸üÍêÕûµÄ½éÉÜ£¬Çë²Î¼ûºóÐø¸üÏêϸµÄÎÄÕ¡£
ǰºó¶ËÕûºÏ
´Óµ¥ÌåÓ¦ÓøÄÔì³Éǰºó¶Ë·ÖÀëµÄ¼Ü¹¹ºó£¬ÀíÏë״̬Ï£¬Ç°ºó¶Ë¿ÉÒÔ·Ö±ð¶ÀÁ¢¿ª·¢¡¢²âÊÔ¡¢²¿Êð£¬È»¶øÈôÏëʵÏÖÕûÌåÒµÎñ£¬ÔòÐèÒª½«Ç°ºóÁ½¶ËÕûºÏ¡£±¾½Ú½«½éÉÜÎÒÃÇ¿ªÕ¹¸ÄÔ칤×÷ÒÔÀ´£¬ÔÚǰºó¶ËÕûºÏÁìÓò»ýÀ۵IJ¿·Ö×î¼Ñʵ¼ù¡£
RESTful½Ó¿Ú
ºó¶Ë½Ó¿Ú¾ù°´ÕÕÉçÇøRESTful½Ó¿Ú±ê×¼¶¨Ò壺
ÓïÒ廯URL£¬»îÓÃGET/POST/PUT/DELETEËÄÖÖHTTP·½·¨£»
Ö§³ÖJSONÓëXMLÁ½ÖÖÊý¾Ý³ÊÏÖ¸ñʽ£¬Ä¬ÈÏÇé¿öÏ£¬HTTPÇëÇóºÍÏìÓ¦¾ùʹÓÃJSON£¬¼ÓÈëXML²ÎÊý£¬ÇëÇóºÍÏìÓ¦¸ÄΪʹÓÃXML£»
ÓÅÏÈʹÓÃHTTP״̬Â루Status Code£©±íÏÖºó¶Ë³É¹¦×´Ì¬»ò¸÷Àà³£¼û´íÎó£¬ÈçHTTP 200(OK)¡¢401(Unauthorized)¡¢422(Unprocessable
Entity)µÈ£»
ͳһҵÎñ´íÎóÂëºÍ´íÎóÏûÏ¢£»
ÒÔISO 8061±ê×¼ÊäÈëÊä³öÈÕÆÚʱ¼ä£¬È磺2015-09-08T01:55:28Z¡£
ÔÚǰ¶ËÎÒÃÇ»ùÓÚä¯ÀÀÆ÷fetch½Ó¿Ú£¬·â×°ÁËspark-fetch°ü£¬ÌṩÈçϹ¦ÄÜ£º
ä¯ÀÀÆ÷fetchµÄËùÓй¦ÄÜ£»
JSONÐòÁл¯¡¢·´ÐòÁл¯£»
ΪHTTP´íÎóͳһÏÔʾ¶Ô»°¿ò£¬ÆäÖÐ401״̬»áÌø×ªÖÁµÇÂ¼Ò³Ãæ£»
¸ù¾ÝÓû§ÐèÒª»º´æÌض¨×ÊÔ´£»
·ÀÖ¹Cross-Site Request Forgery (CSRF)¡£
ÎÒÃÇΪǰ¶Ë¿ª·¢ÁËÒ»Ì×¼òµ¥µÄDiscover·þÎñ·¢ÏÖ£¬ÒÔkey-value·½Ê½ÃèÊöǰ¶ËÖлáÓõ½µÄRESTful·þÎñ£¬spark-fetch°üÔÚ·¢ÆðHTTPÇëÇóʱֻҪ´«ÈëkeyºÍÏà¹Ø²ÎÊý¼´¿É¡£Ä¿Ç°Ö÷ÒªÓÃÀ´·Àֹǰ¶Ë´úÂëÀïhard-code·þÎñURL£¬Ö®ºó»áÓëÕû¸ö¹«Ë¾¼¶±ðµÄ·þÎñ·¢ÏÖÕûºÏÆðÀ´¡£
³ý´ËÖ®Í⣬ÎÒÃÇ»¹ÔÚºó¶Ë¿ª·¢ÁËÒ»Ì×API Gateway£¬ÌṩÈÏÖ¤£¨authentication£©¡¢ÏÞÁ÷£¨throttling£©¡¢¿çÓòµÈ¹«¹²¹¦ÄÜ¡£ÉÏÊöRESTful½Ó¿Ú±¾ÉíÎÞÐë´¦ÀíÈÏÖ¤µÈÂß¼¡£ÔÚ²¿Êðºó¶Ë·þÎñºó£¬Ö»ÓÐAPI
Gateway¿ª·Å¸øÍâÍø·ÃÎÊ£¬ÆäËûRESTful½Ó¿Ú¾ùÏÞÓÚ»ú·¿ÄÚÍø·ÃÎÊ£¬¾ÓÉAPI GatewayµÄ·´Ïò´úÀíÌṩ¸øÍâÍø¡£¼´Ç°¶ËÔÚµ÷ÓÃÕâЩ½Ó¿Úʱ£¬±ØÐë¾¹ýAPI
Gatewayµ÷Óá£
ÈÏÖ¤ÊÚȨ
ÎÄÕÂÒ»¿ªÊ¼Ìáµ½µÄµ¥ÌåWebÓ¦ÓÃÆäʵÔÚFreeWheelÓжàÌ×£¬·Ö±ð¶ÔÓ¦ÓÚ¶à¸öÒµÎñÏß»ò²úÆ·Ïß¡£ÕâЩµ¥ÌåÓ¦Óÿª·¢µÄ½×¶ÎÓÐÏÈÓк󣬼ܹ¹ºÍʵÏÖµÄÉè¼ÆÒ²´æÔÚ×Ųî±ð£¬ÆäÖкÜÖØÒªµÄÒ»µã¾ÍÊÇÈÏÖ¤·½Ê½µÄ²î±ð£¬ÎªÁËÂú×ã¶à¸öÓ¦ÓÃÁªºÏµÇ¼µÄÐèÇó£¬ÓÈÆäÊÇÏòºó¼æÈÝSPAµÄÁªºÏµÇ¼£¬ÎÒÃÇÔÚºó¶ËÒÔGolang¿ª·¢ÁËеÄSSO·þÎñ¡£SPAÔÚµÇÂ¼Ò³Ãæµ÷ÓÃSSO½Ó¿Ú£¬µÇ¼³É¹¦Ôò»ñÈ¡token²¢´æÈëcookie£¬ÕâÑùºóÐøµÄ½Ó¿ÚÇëÇó¾Í»á½«cookie´«ÈëAPI
GatewayÒÔ»ñÈ¡ÈÏÖ¤ÐÅÏ¢¡£
ÖÁÓÚÊÚȨ£¨authorization£©£¬ÎÒÃÇÔÚÏÖÓеÄRuby On RailsÓ¦ÓÃÖд󲿷ÖÊÇ»ùÓÚCanCan¿ò¼ÜʵÏֵ쬏ÄÔìΪǰºó¶Ë·ÖÀë¼Ü¹¹ºó£¬ÎÒÃǽ«Óëµ¼º½¡¢¹¦ÄÜÈë¿ÚÏà¹ØµÄÊÚȨÐÅÏ¢´Óºó¶ËÍêÕû´«»ØÇ°¶Ë£¬ÓÃǰ¶Ë´úÂëÅжÏÌØ¶¨µ¼º½»ò×é¼þÊÇ·ñÏÔʾ¡¢ÊÇ·ñ½ûÓᣵ±È»£¬RESTful½Ó¿ÚÖÐÈÔÓÐÍêÕûµÄÊÚȨÅжÏÂß¼¡£Èç¹ûÓжñÒâÓû§Í¨¹ýhackµÄ·½Ê½ÐÞ¸ÄÁËǰ¶ËÊÚȨÐÅÏ¢·ÃÎÊÁ˱¾²»ÄÜ·ÃÎʵĽçÃæ£¬ËûÒÀ¾ÉÎÞ·¨»ñµÃÁбíÊý¾Ý¡¢Ò²ÎÞ·¨Ìá½»Êý¾ÝÐ޸ġ£
ºó¶ËDockerÈÝÆ÷»¯
ÔÚÒµÎñÄ£¿é¿ª·¢¹ý³ÌÖУ¬¿ª·¢ÈËÔ±ÐèÒªÔÚ¿ª·¢Ç°¶Ë´úÂëµÄͬʱÄÜ·ÃÎʵ½ºó¶Ë½Ó¿Ú¼°²âÊÔÊý¾Ý¡£Èç¹ûÊǵ¥ÌåÓ¦ÓõĿª·¢£¬¿ª·¢ÈËÔ±Ö»ÒªÅäÖÃÒ»Ì׿ª·¢»·¾³¼´¿É´ïµ½Õâ¸öÄ¿±ê£¬µ«ÔÚǰºó¶Ë·ÖÀëºó£¬Ç°¶Ë¿ª·¢ÈËÔ±³ýÁËÅäÖÃǰ¶Ë¿ª·¢»·¾³£¬»¹ÒªÅäÖúó¶Ë¡£ºó¶Ë´úÂëÓиüÐÂʱ£¬ÐèÒª¼°Ê±¼ì³ö´úÂ벢˳Àû±àÒ룬Êý¾Ý¿âÓиüÐÂʱҲÐèÒªÖ´ÐÐÏàÓ¦µÄSQL½Å±¾¡£ÕâЩÈÕ³£¹¤×÷³ÉΪǰ¶Ë¿ª·¢ÈËÔ±µÄÍ´µã¡£
ºó¶ËDockerÈÝÆ÷»¯ÓÐЧ½â¾öÁËÕâһʹµã¡£ÎÒÃÇĿǰµÄCI (Continuous Integration)
Pipeline»áÔÚºó¶Ë´úÂë¼ìÈëÔ¶³ÌGitºó´¥·¢±àÒ룬±àÒë³É¹¦ºó»á´´½¨Ò»¸ö°üº¬¸Ã±àÒë°æ±¾µÄDocker
image²¢ÉÏ´«ÖÁ¹«Ë¾ÄÚ²¿µÄDocker image²Ö¿â£¬ÀàËÆµÄ»¹ÓÐÊý¾Ý¿â£¬ÒÔ¼°ÆäËûÖмä¼þµÄimage¡£Ç°¶Ë¿ª·¢ÈËÔ±²»ÔÙÐèÒª´î½¨ºó¶Ë¿ª·¢»·¾³£¬Ö»ÐèÔÚ¿ª·¢»úÉϰ²×°Docker£¨ÈçDocker
for Mac£©£¬ÔÚǰ¶Ë¹¤³ÌÄÚ»áά»¤Ò»¸ödocker-compose.xml£¬ÉùÃ÷ÁËǰ¶Ë¹¤³ÌËùÐèÒªµÄºó¶ËDocker
image£¬Ã¿´Î¸ÃÎļþ¸üкó£¬Ç°¶Ë¿ª·¢ÈËÔ±Ö»ÐèÒªÔËÐÐdocker-compose up -d¼´¿ÉÆô¶¯Ò»ÏµÁÐDocker
container£¬ÔÚ±¾»úÔËÐÐÍêÕûµÄºó¶Ë·þÎñ£¬ÕâÀïÉõÖÁ°üº¬ÁËÊÊÓÃÓÚ¿ª·¢µÄ²¿·Ö²âÊÔÊý¾Ý¡£
ÕûºÏ²âÊÔ
ǰºó¶ËµÄ·ÖÀëºÍÕûºÏ¶ÔÖÊÁ¿±£Ö¤Ìá³öÁËеÄÒªÇó¡£ÎÒÃÇÔÚǰ¶Ë±àдfetchÂ߼ʱ£¬»áÒÔmock·½Ê½±àд¶ÔÓ¦µÄµ¥Ôª²âÊÔ¡£ºó¶Ëÿ¸ö½Ó¿ÚÒ²ÓÐÏìÓ¦µÄµ¥Ôª²âÊÔ¡£¶øÕâÁ½¶Ë·Ö±ðµÄµ¥Ôª²âÊÔ»¹²»×ãÒÔ±£Ö¤Èí¼þÖÊÁ¿£¬ÀíÂÛÉϽ²£¬×ÝʹÁ½Õßµ¥Ôª²âÊÔ¸²¸ÇÂʾù´ïµ½100%£¬Ò²²»Äܱ£Ö¤¸²¸ÇËùÓÐÓÃÀý¡£×÷ΪÖÊÁ¿±£Ö¤µÄ¹Ø¼ü»·½Ú£¬ÔÚÁ½¶ËµÄµ¥Ôª²âÊÔ¶¼Í¨¹ýºó£¬ÎÒÃǵÄCI»áÖ´Ðж˵½¶ËµÄ×Ô¶¯»¯²âÊÔ¡£ÕâЩ×Ô¶¯»¯²âÊÔÄ£·ÂÁËÓû§µÄʹÓó¡¾°£¬ÍêÕûµÄ¸²¸ÇÁËǰ¶Ë¡¢ºó¶Ë¡¢Êý¾Ý¿âÄËÖÁÆäËûÖмä¼þ¡£
½¥½ø¸ÄÔì
SparkUIµÄ²úÉúΪǰºó¶Ë·ÖÀë¸ÄÔìÌṩÁ˼áʵµÄ»ù´¡¡£Èç¹û°´×îÀíÏëµÄ·½Ê½Íƽø£¬Ö»ÒªÒµÎñ¿ª·¢ÍŶӻùÓÚSparkUI¶ÔÏÖÓеÄRuby
On RailsµÄµ¥ÌåÓ¦ÓõÄǰ¶Ë²¿·Ö¡¢»ùÓÚGolang΢·þÎñ·½Ê½¶ÔÆäºó¶Ë²¿·Ö½øÐÐÖØ¹¹¸Äд¡¢¼ùÐÐǰºó¶ËÕûºÏµÄ×î¼Ñʵ¼ù£¬¼´¿É´ï³Éǰºó¶Ë·ÖÀëµÄÄ¿±ê¡£¶øÎÄÕ¿ªÍ·ÔøÌáµ½£¬ÏÖ´æµÄRailsÓ¦ÓÃÌå»ý´ó¡¢¸´ÔӶȸߣ¬×ÝʹÓÐ×ÅÒµÎñ¿ª·¢ÍŶӵÄÈ«Á¦Ö§³Ö£¬ÎÒÃÇÒ²ºÜÄÑÔÚÒ»¸ö½Ï¶Ìʱ¼äÄÚ³¹µ×Íê³Éǰºó¶Ë·ÖÀëµÄ¸ÄÔì¡£¸üºÎ¿öÊг¡Ç§±äÍò»¯£¬ÔÚÒµÎñ²¿ÃÅ·þÎñÀϿͻ§¡¢»ñȡпͻ§¹ý³ÌÖУ¬²úÆ·¾ÀíÃÇÒ²»á²»¶ÏµØÌá³öеIJúÆ·ÐèÇó¸øÎÒÃǵĿª·¢ÍŶӣ¬¼¼ÊõÑݽøºÍÒµÎñÍÆ½øÁ½ÕßÐèҪȡµÃÒ»¸öƽºâ¡£ÎÒÃÇΪ´ï³ÉÕâһƽºâ£¬ËùÌá³öµÄ·½°¸ÊÇ£º½¥½ø¸ÄÔì¡£
»ìºÏ¹¤³Ì½á¹¹
ÎÒÃǵÄÒµÎñÄ£¿éÔÚRuby On Rails¹¤³ÌÖÐÊÇÒÔModule·½Ê½´æÔڵ쬳ýÁ˹«¹²µÄMVCºÍ×ÊÔ´·ÅÔÚͳһµÄModuleÀÿ¸öÒµÎñModule¶¼ÓÐ×Ô¼ºµÄMVCºÍ×ÊÔ´£¨ÕâÀïµÄ×ÊÔ´ÌØÖ¸JavascriptºÍCSS£©¡£ÎÒÃÇÒÔÒµÎñModule×÷Ϊ¸ÄÔìµÄµ¥Ôª¡£
ÓÉÓÚ×ÊÔ´µÈÏÞÖÆ£¬Ç°ºó¶Ë·ÖÀë¸ÄÔìÔÚǰ¶Ë¡¢ºó¶ËµÄÍÆ½ø½Ú×ಢ²»Ò»Ö¡£±È½Ï¶àµÄÇé¿öÊÇModuleǰ¶Ë¸ÄÔìÏÈÐУ¬ºó¶ËÒÀ¾ÉÑØÓÃRailsÔÓеÄController£¨Ò²Óв¿·ÖÊÊÅ乤×÷£©¡£ÔÚÕâÖÖÇé¿öÏ£¬Module¾SparkUI¸ÄдµÄǰ¶Ë£¨ÒÔÏÂͳ³ÆÎª¡°ÐÂǰ¶Ë¡±£©¶ÀÁ¢ÓÚRails¹¤³ÌÖ®Íâ½øÐдò°ü²¿ÊðËù´øÀ´µÄºÃ´¦²¢²»Ã÷ÏÔ£¬¹Ê½«Õⲿ·ÖÐÂǰ¶Ë´úÂëµÄÔ´ÂëÒÀ¾É·ÅÔÚRails¹¤³ÌModuleĿ¼Ï£¬Í¨¹ýWebpack´ò°üµÄbundle
JS£¯CSSÒ²°´ÕÕModule¶Ô×ÊÔ´ÎļþµÄÔ¼¶¨£¨convention£©·ÅÔÚmodules/my_module/app/assets/javascripts/my_module/compiledĿ¼Ï£¬²¢½åÓÉRails
Asset Pipeline´ò°ü½øRails¹¤³Ì·¢²¼°ü½øÐÐͳһ²¿Êð¡£
¶ÔÓÚÉÏÊöbundle JS/CSS£¬ÎÒÃÇÈÔʹÓÃRailsÒ³ÃæÄ£°æ×÷ΪÈë¿Ú£¬ÒÔÆÚ¼õÉÙ¶ÔRails¹¤³ÌµÄÓ°Ï죺
<%= javascript_include_tag
"my_module/compiled/my_module" %>
<%- @js_module_alias = "my_module"
%>
<div id="spa"></div>
<script>
(function() {
var React = require('react');
var ReactDOM = require('react-dom');
var AppContainer = require('<%= @js_module_alias
%>').AppContainer;
ReactDOM.render(
React.createElement(AppContainer),
document.getElementById('spa')
);
})();
</script> |
ÖÁÓÚ·ÓÉ£¬¼ÈÈ»ÎÒÃÇÒѾÔÚÐÂǰ¶ËÖÐʵÏÖǰ¶Ë·ÓÉ£¬ÄÇÔÚRails¶ËµÄºó¶Ë£¨Ò³Ã棩·ÓɾͿÉÒÔίÍиøÇ°¶Ë£º
scope 'spa'
do
get '/', :to => 'spa#index', :as => 'spa'
get '*pages', :to => 'spa#index'
end |
¾ÓÉÒÔÉÏ·½°¸£¬ÎÒÃÇÔÚ¾¡Á¿¶ÌµÄÖÜÆÚ¸ÄдÁ˸ü¶àµÄÒµÎñÄ£¿é£¬¶ÔÔËάµÄÓ°ÏìÒ²·Ç³£Ð¡¡£¶ÔÓÚÕâЩҵÎñÄ£¿é£¬ÎÒÃÇÔ¤ÆÚÔÚÆä¸Äдºó¶Ë΢·þÎñʱ½«Ç°¶Ë´úÂë´ÓRailsÀï³¹µ×·ÖÀë³öÀ´£¬Íê³É¸ÃÄ£¿éµÄǰºó¶Ë·ÖÀë¡£
ÔÚÉÏÊöRuby On RailsÏîĿ֮Í⣬FreeWheelÒ²Æô¶¯ÁËÈô¸É¸öÐÂÏîÄ¿¡£ÕâЩÏîĿһ²½µ½Î»£¬Ö±½Ó°´ÕÕǰºó¶Ë·ÖÀë¼Ü¹¹Éè¼Æ¿ª·¢£¬Æäǰ¶ËÍêÈ«»ùÓÚSparkUI¡£ÎÒÃÇÒ²»ùÓÚNginx¿ª·¢ÁËÒ»Ì×ÇáÁ¿µÄ¾²Ì¬×ÊÔ´·þÎñÆ÷£¬Ç°¶ËÀûÓÃWebpack±àÒë´ò°ü³Étar°ü²¢¶ÀÁ¢ÉÏÏß¡£
SparkUI¶ÀÁ¢¹¤³Ì
ÔÚС²½¿ìÅܽ׶Σ¬ÎÒÃǽ«SparkUIÔ´ÂëÖ±½Ó·ÅÔÚRails¹«¹²ModuleÖУ¬ÁîÎÒÃÇ¿ÉÒÔ¿ìËÙÑéÖ¤¿ÉÖØÓÃ×é¼þµÄÉè¼ÆÊÇ·ñÂú×ãÒµÎñÐèÒª¡£È»¶øÕâÑùµÄ½á¹¹»á´øÀ´¼¸·½ÃæÎÊÌ⣺
°æ±¾¹ÜÀí¡£ÈκζÔSparkµÄµü´ú¶¼»áÖ±½ÓÓ°Ïìµ½ÒµÎñÄ£¿é£»
¿ª·¢Ð§ÂÊ¡£SparkUIÊÇ´¿JS¿â£¬Rails¹¤³Ì¿ª·¢»·¾³¸øSparkUI¿ª·¢´øÀ´Ò»¶¨¸ºµ££»
Ô´ÂëȨÏÞ¡£ÈκÎÒµÎñÄ£¿é¿ª·¢ÈËÔ±¾ù¿ÉÐÞ¸ÄSparkUI´úÂ룬´øÀ´Ç±ÔÚ´úÂë³åÍ»£»
¿ç¹¤³Ì¸´Óá£ÈκÎRails¹¤³ÌÖ®ÍâµÄ¹¤³ÌÔÚÀûÓÃSparkUIʱ¶¼»á±È½Ï·±Ëö¡£
ÎÒÃÇÔÚSparkUIÍÆ³ö1.0°æ±¾Ê±£¬½«ÆäÔ´Âë´ÓRails¹¤³ÌÖÐÕª³ö£¬ÒÆÈëÒ»¸öеĴ¿Ç°¶Ë¹¤³Ì¡£SparkUIÔÚÕâ¸öй¤³ÌÖУ¬ÈÔÓÉBabelºÍWebpack´ò°ü£¬µ«»á×÷Ϊlibrary·¢²¼µ½¹«Ë¾NexusÉÏ˽ÓÐNPM
RepositoryÀï¡£Rails¹¤³Ì»òÆäËû´¿Ç°¶Ë¹¤³ÌÔÚÆäpackage.jsonºÍ.npmrcÅäÖÃÖÐÉùÃ÷¶ÔÌØ¶¨°æ±¾SparkUIµÄÒÀÀµ£¬Ö´ÐÐnpm
installºóÔò¿ÉÒÔÔÚǰ¶Ë´úÂëÖÐʹÓÃSparkUI¡£
ÕâÒ»¸Ä±ä´ó´ó½â·ÅÁËSparkUIºÍÒµÎñÄ£¿éÁ½·½µÄÉú²úÁ¦£º
¶ÀÁ¢µÄ´úÂë¿â¿ÉÒÔÒþ²Ø²¿·ÖSparkUIµÄÄÚ²¿API»ò¹¤¾ß´úÂ룬·ÀÖ¹ÒµÎñÄ£¿éÖÐÀÄÓã»
²»Í¬µÄ·¢°æ½Ú×àÁîSparkUI¿ÉÒÔ×·Öð¸ü¸ßµÄ´úÂëÖÊÁ¿£¬Ä¿Ç°ÆäÔ´´úÂë¹²¼Æ9.3ÍòÐУ¬µ¥Ôª²âÊÔ¸²¸ÇÂʸߴï99.43%£»
ÒµÎñÄ£¿é´úÂë¿ÉÒÔ¸üÓмƻ®µØÉý¼¶SparkUI°æ±¾£¬ÔÚ´Ë֮ǰÎÞÐë·´¸´»Ø¹é²âÊÔ¡£
ÐÂÀÏJS´úÂë»ìÓÃ
¶ÔÓÚRails¹¤³ÌµÄ²¿·Ö¹¦ÄÜÄ£¿é£¬Æäǰ¶ËʵÏÖÓкܴóÒ»²¿·ÖÊÇ»ùÓÚjQuery¿ª·¢µÄJS¡£ËäÈ»ÕâЩ´úÂë²¢²»ÊÇ»ùÓÚReact»òSparkUI¿ª·¢µÄ£¬µ«ËüÃÇÒ²¿ÉÒÔÖ±½ÓÔÚǰºó¶Ë·ÖÀëºóµÄǰ¶ËÖжÀÁ¢Ê¹Óá£ÎÒÃÇÔÚͳһµÄÁ£¶ÈÏ£¬´´½¨ÁËÒ»²ã¶ÔReactÓѺõÄÊÊÅäÆ÷spark-adapter£¬¶ÔÔÓÐjQuery
JS½Ó¿Ú½øÐÐÁË·â×°ºÍ¸ôÀë¡£ÒµÎñÄ£¿é¿ª·¢ÈËÔ±¿ÉÒÔ×ÔÐоö¶¨¶ÔÓÚÕâÒ»²¿·ÖJS´úÂëÊÇ»ùÓÚSparkUIÖØÐ´»¹ÊÇ·ÅÔÚAdapterÖÐÒÔ¼ÌÐøÑØÓá£
ÖÊÁ¿±£Ö¤
×÷ΪÉÌÒµÓ¦Óã¬ÆäÈí¼þÖÊÁ¿ÊǾø²»ÄÜÍ×еġ£Ç°ºó¶Ë·ÖÀë¸ÄÔìÒ²²»ÄܳÉΪ½µµÍÈí¼þÖÊÁ¿µÄÀíÓÉ¡£ÎÒÃDZ£Ö¤ÖÊÁ¿µÄºËÐÄÊDzâÊÔ£º
SparkUI×é¼þ¿â±¾ÉíÒª¾ßÓÐ×î¸ß±ê×¼µÄµ¥Ôª²âÊÔ¸²¸ÇÂÊ£»
ÒµÎñÄ£¿é¸ÄдΪÐÂǰ¶Ëʱ£¬Ò²Òª»ùÓÚSparkUIÌṩµÄ»ù´¡ÉèÊ©±àдµ¥Ôª²âÊÔ£»
¶ÔÓÚRails¹¤³ÌÔÓеÄ×Ô¶¯»¯²âÊԽű¾£¬ÔÚÒµÎñÄ£¿é¸ÄÔìΪ»ùÓÚSparkUIµÄÐÂǰ¶Ëʱ£¬Ò²ÒªÍ¬Ê±¸üУ»
½«²âÊÔ¼ÓÈëCI (Continuous Integration) Pipeline£¬Ò»ÓÐMerge
RequestÌá½»¾ÍÖ´ÐвâÊÔ£¬²âÊԳɹ¦²ÅÔÊÐíMerge£»
¸÷×éleadÔÚMerge RequestÉÏ×ö´úÂëÉó²éʱÑϸñ°Ñ¹Ø¡£
ÁíÍâÒ»¸öÓÐЧʵ¼ùÊÇΪÐÂÉÏÏßÐÂǰ¶ËµÄÄ£¿éÌṩ»Ø¹ö»úÖÆ¡£ÒòΪÔÚÕâÒ»½×¶Î£¬Rails¹¤³ÌÀïÌØ¶¨¹¦ÄÜÄ£¿éµÄÐÂÀÏǰ¶Ë´úÂë¿ÉÒÔͬʱ´æÔÚ£¬Ö»ÐèÔÚ¹¦ÄÜÈë¿Ú´¦ÉèÖÃÒ»¸ö¿ª¹Ø£¬¾Í¿ÉÒÔÔÚÏßÉÏÖ´ÐÐÐÂǰ¶ËÓöµ½ÑÏÖØÎÊÌâÊ±ËæÊ±Çл»»ØÀÏǰ¶Ë¡£
×ܽá
ǰºó¶Ë·ÖÀë¼Ü¹¹ÊÇÖî¶àǰ¶ËÓ¦ÓÃϵͳµÄ±Ø¾Ö®Â·£¬¶øÏÖʵÇé¿öÍùÍùÐèÒª¹Ë¼°Öî¶àÀúÊ·¼Ü¹¹¡£±¾ÎÄÒÔµ¥ÌåÓ¦ÓÃΪ±³¾°£¬Éè¼Æ¿ª·¢¿ÉÖØÓÃ×é¼þ¿âΪÊֶΣ¬ÔÚ±£Ö¤Ð§ÂÊÓëÖÊÁ¿µÄ»ù´¡ÉÏ£¬Ö𲽸ÄÔìΪǰºó¶Ë·ÖÀë¼Ü¹¹¡£Ï£Íû¶ÔͬÑùÃæ¶ÔÕâÒ»Çé¿öµÄ¶ÁÕßÓÐËù°ïÖú¡£
ÎÄÖÐÌáµ½µÄSparkUI¿ò¼Ü£¬ÆäÖÐÓëFreeWheelÒµÎñ²¢²»Ö±½ÓÏà¹ØµÄ´¿¼¼Êõ²¿·Ö£¬±ÈÈçspark-modula¡¢spark-routerµÈ°ü£¬ÎÒÃÇÒѼƻ®½«ÆäÖ𲽿ªÔ´¡£Ï£Íû½ìʱÄÜÓë¸ü¶àµÄǰ¶Ë¼¼Êõר¼ÒºÍȺÌåÉîÈë̽ÌÖ¡¢¹²Í¬½ø²½£¬²¢×îÖÕ¶Ôǰ¶ËÉçÇøÓÐËù¹±Ïס£ |