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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
SAMģʽ£º¹¹½¨º¯ÊýÏìӦʽǰ¶Ë¼Ü¹¹¹ý³ÌÖÐѧµ½µÄ¾­Ñé
 
À´Ô´£ºInfoQ ·¢²¼ÓÚ2016-12-5
  6463  次浏览      28
 

ÔÚ²»¶Ï·¢Õ¹µÄJavaScript±à³ÌÁìÓò£¬ÏìӦʽ±à³Ì¼¼ÊõÕý±äµÃÓú¼ÓÁ÷ÐС£ÕâһϵÁÐÎÄÕÂÊÔͼÏò´ó¼Ò½éÉܸ÷½·¨Ä¿Ç°µÄ½øÕ¹£¬½éÉܸ÷ÖÖ¿ÉÓü¼Êõ£¬ÒÔ¼°¸ÃÁìÓò²úÉúµÄ±ä»¯¡£´ÓElmµÈÐÂÓïÑÔµ½Angular 2¶ÔRxJSµÄÖ§³Ö£¬ÎÞÂÛ´ÓÊÂʲô¹¤×÷µÄ¿ª·¢Õß¾ùÓÐÏà¹ØÐ¼¼Êõ¿É¹©Ê¹Óá£

InfoQµÄÕâÆªÎÄÕÂÒѰüº¬ÔÚ¡°ÏìӦʽJavaScript¡±ÏµÁÐÎÄÕÂÖС£Äã¿ÉÒÔ¶©ÔÄRSS²¢ÔÚÄÚÈݸüкó»ñµÃ֪ͨ¡£

Ö÷Òª½áÂÛ

ǰ¶Ë¼Ü¹¹Ê¦ÕýÔÚ¿ìËÙÏòן¯ÊýÏìӦʽ£¨Functional reactive£©µÄģʽԾ½ø¡£

º¯ÊýʽHTML¡¢µ¥ÏòÊý¾ÝÁ÷»òµ¥Ì¬Ê÷£¨Single state tree£©ÊǸÃģʽµÄÖØÒªÔªËØ¡£

RxJSºÍ²»¿É±äÐÔµÄ×÷Óñ»¸ß¹ÀÁË¡£

SAMģʽµÄ²»Í¬Ö®´¦ÔÚÓÚ£¬ËüÖ÷ҪרעÓÚÇ¡µ±µØÊµÏÖ¡°Ó¦ÓóÌÐò״̬ͻ±ä¡±¡£

ÎÒÃÇ¿ÉÒÔʹÓÃ×Ô¼º¹ßÓõÄWeb¿ò¼ÜʵÏÖSAM¡£

ÏÖ´ú»¯Óû§ÌåÑéÒªÇóËùÓüܹ¹²»½öÒªÄܳÖÐø¡°ÏìÓ¦¡±Óû§ÊäÈ룬¶øÇÒÒªÄܶԲ»Í¬ÀàÐ͵Ļ·¾³£¨ºÃÓѺÍÍæ¼Ò¡¢ÎïÀí´«¸ÐÆ÷¡¢ÓŲ½Ë¾»úµÖ´ï³Ë¿ÍÉϳµÎ»Öõķ½Ê½¡­£©×ö³öÏìÓ¦¡£GUIͨ¹ý½ø»¯ÒѳÉΪ¹ã·º¡¢¶¯Ì¬µÄ·Ö²¼Ê½ÏµÍ³ÖеÄÒ»¸ö½Úµã£¬Òò´Ë»áÊܵ½´Ó²¢·¢µ½×é¼þʧ°ÜµÈ¸÷ÖÖϵͳ¸´ÔÓÐÔµÄÓ°Ïì¡£

ÕâÖÖÇé¿öÏ£¬Ç°¶Ë¼Ü¹¹Ê¦ÕýÔÚÒÔΪº¯ÊýÏìӦʽģʽΪĿ±ê¾­ÀúÒ»´ÎÖØ´óµÄתÐÍ¡£¸÷ÖÖ¿ò¼Ü¡¢¿â£¬ÉõÖÁÓïÑÔ²ã³ö²»ÇËüÃÇÊÔͼͨ¹ý»ý¼«Ö÷¶¯µÄ¾ºÕùÁìµ¼´Ë´ÎתÐÍ£º

React/Redux

Elm

Cycle.js

Angular 2

Vue.js

Om

MobX

Inferno

DART

Jean-Jacques½ñÄê¶þÔ·¢²¼µÄһƪÎÄÕÂÖÐÃèÊöÁËÒ»ÖÖÊܵ½React.jsºÍTLA+Æô·¢µÄȫк¯ÊýÏìӦʽģʽ£ºSAMģʽ¡£

SAM½¨Ò齫ͼÐÎÓû§½çÃæµ×²ãµÄÒµÎñÂß¼­·ÖΪÈý¸ö¸ÅÄ²Ù×÷£¨Action£©¡¢Ä£ÐÍ£¨Model£©ºÍ״̬£¨State£©¡£²Ù×÷ÏòÄ£Ð͹©Öµ£¬½öÄ£ÐÍ¿ÉÒÔ½ÓÊÜÕâÑùµÄÖµ¡£Ò»µ©½ÓÊÜ£¬½«Í¨¹ý״̬ÑéÖ¤ËùÓж©ÔÄ·½£¬ÓÈÆäÊÇÊÓͼ£¨ÊÓͼ¿É¿´×÷¡°×´Ì¬µÄ¾ßÌå³ÊÏÖ¡±£©ÒѾ­»ñµÃ֪ͨ¡£Ã¿¸öʼþ¿É×÷Ϊ¡°²½Ö衱½øÐд¦Àí£¬²½Öè¿ÉÓÉÌáÒé/½ÓÊÜ/ѧϰÁ÷Ëù×é³É¡£ÕâÖÖ¸ÅÄîΪʼþÅÅÐòºÍЧ¹û£¨Èçºó¶ËAPIµ÷Ó㩵Ĵ¦ÀíÌṩÁËÒ»¸ö¼áʵµÄ»ù´¡¡£

SAMµÄʹÓò»ÒÀÀµ¾ßÌå¿ò¼Ü£¬¹²Í¬´òÔìÕâһģʽµÄºÜ¶àÉçÇø³ÉÔ±1Ò²Â½Ðø¿ª·¢ÁËһϵÁпª·¢Õß¹¤¾ß£¬²¢Í¨¹ý²»Í¬¿ò¼Ü±àдÁË´óÁ¿·¶Àý´úÂ룬ËùÓÿò¼Üº­¸ÇÁË´ÓVanilla JavaScriptµ½AWS LambdaµÈÖî¶àÀàÐÍ¡£

±¾ÎĽ«½éÉÜÎÒÃÇÔÚʵÏÖSAMģʽµÄ¹ý³ÌÖÐѧµ½µÄ¾­Ñé¡£±¾ÎĵÄÄ¿±ê²¢²»ÔÚÓڱȽϻòÆÀ¼Û¸÷ÖÖ¿ò¼Ü»ò¿âµÄÓÅÁÓ£¬ÕâÖÖÀàÐ͵ıȽÏÒѾ­Ì«¶àÁË£¨ÀýÈçMatt RaibleµÄ¡¶Comparing Hot JavaScript Frameworks¡·Ò»Ê飩¡£

±¾ÎĽ«Ö÷ҪרעÓÚÔÚǰ¶Ë¼Ü¹¹ÖУ¬ÄܶÔ×îÖÕ½»¸¶³É¹ûÓëÏÖ´ú»¯×îÖÕÓû§Ó¦ÓóÌÐòµÄ¿Éά»¤ÐÔ²úÉúÖ±½ÓÓ°ÏìµÄ£¬Êµ¼ù²ãÃæµÄÄÚÈÝ£º

±à³ÌÄ£ÐÍ£¨»ùÓÚ×é¼þµÄÊÓͼ¡¢Ò»ÖÂÐÔ¡¢¸±×÷Óá­£©

Á¬½Ó£¨RxJS£©

¼Ü¹¹£¨Í¨ÓÃJavaScript£©

ÎÒÃÇ´òËã½â¾öÄÄЩÎÊÌ⣿

ǰ¶Ë±à³ÌÄ£ÐÍÍêÈ«»ùÓÚʼþºÍ»Øµ÷£¬´«Í³ÉÏÕâЩÄÚÈÝÊÇͨ¹ý¹Û²ìÕßģʽ£¨Observer pattern£©ÁªÏµÔÚÒ»ÆðµÄ¡£

ÀýÈçµ±ÎÒÃÇÐèҪͨ¹ýÊó±êÍÏ×§ÊÖÊÆ»æÖÆÒ»¸ö¾ØÐÎʱ£¬ÓëÊó±êʼþÓйصľä±úÓ¦¸ÃÊÇÕâÑùµÄ£º

function onMouseDown(event) {
rectangle = { from: event.position, to: event.position }
isMouseDown = true
}

function onMouseMove(event) {
if (isMouseDown) {
rectangle.to = event.position;
draw(rectangle);
}
}

function onMouseUp(event) {
isMouseDown = false
}

È»¶øÔÚ״̬¹ÜÀí·½ÃæÒÀÈ»ÁôÏÂÁËÒ»¸öºËÐÄÎÊÌ⣺

»Øµ÷Çý¶¯µÄ´úÂë»áÏԵóٶۣ¬ÒòΪʼþ¾ä±úÖ»ÄÜͨ¹ý״̬ÓëϵͳÖÐµÄÆäËû¶«Î÷ͨÐÅ£¬[Òò´ËÒ»°ãÀ´Ëµ]»áÓöµ½²¢·¢´íÎ󣬰üÀ¨¶ªÆúʼþ¡¢Êý¾ÝÕùÓÃÓëȱ·¦¡£

...Õâ»á¶Ô´úÂëÖÊÁ¿²úÉúÇÐʵµÄÓ°Ïì¡£Sean ParentÔÚ2007ÄêµÄÒ»·Ý±¨¸æÖÐÌáµ½£¬Adobe£º

×ÀÃæÓ¦ÓóÌÐòÖÐÓÐ1/3µÄ´úÂë±»ÓÃÓÚʼþ´¦ÀíÂß¼­¡£

¶ø²úÆ·ÉúÃüÖÜÆÚÄÚÉϱ¨µÄËùÓÐBugÖУ¬ÓÐ1/2λÓÚÕâЩ´úÂëÖС£

À´×ÔEPFLµÄIngo MaierºÍMartin OderskyÌṩÁËÒ»·Ý¸üÏêϸµÄÎÊÌâÇåµ¥£º

¸±×÷ÓÃ

·â×°

¿É×éºÏÐÔ£¨Composability£©

×ÊÔ´¹ÜÀí

¹Ø×¢µã·ÖÀ루Separation of Concern£©

Êý¾ÝÒ»ÖÂÐÔ

¾ùÔÈÐÔ

³éÏó

ÓïÒå¾àÀ루Semantic Distance£©

ËûÃǵóöµÄ½áÂÛÊÇ£º

Óû§½çÃæ±à³ÌÁìÓòµÄºÜ¶à·¶Àý[...]ºÜÄÑÓù۲ìÕߵķ½Ê½ÊµÏÖ£¬ÀýÈçÒ»×éÏîÄ¿µÄÑ¡Ôñ£¬ÔÚһϵÁжԻ°¿òÖ®¼äµÄ˳Ðò²Ù×÷£¬Îı¾µÄ±à¼­ºÍ±ê¼Ç ¨C »ù±¾ÉÏÕ⺭¸ÇÁËÓû§Ö´ÐÐһϵÁв½Öè¹ý³ÌÖеÄÿһ²½²Ù×÷¡£

º¯ÊýÏìӦʽ±à³Ì·½·¨ÈçºÎ½â¾öÕâÒ»ÎÊÌ⣿

´óÌå·½ÏòÊÇΪUI¹¹ÔìÓ¦ÓÃÒ»ÖÖ´¿´âµÄº¯ÊýÏìӦʽ·½·¨£¬ÆäÖУº

È»¶øÏÔ¶øÒ×¼ûµÄÊÇ£ºÔÚº¯ÊýÏìӦʽ±à³ÌģʽÖУ¬¸ÃÈçºÎÈÆ¹ý¸±×÷Óã¨ÀýÈç²éѯºÍ¸üУ©£¿ÖîÈçCycle.js¡¢Elm£¬ÒÔ¼°Ä³Ö̶ֳÈÉϵÄReduxµÈ¿ò¼ÜÖ÷ҪרעÓÚ½«×÷ÓÃÓëÒµÎñÂß¼­¸ôÀë¡£Richard Feldman½âÊÍÁË×÷ÓÃÊÇÈçºÎÒÔÊý¾ÝµÄ·½Ê½³ÊÏֵģ¬ÒÔ¼°´Ó¹¦ÄܲâÊԵĽǶÈÀ´¿´£¬ÕâÖÖ·½Ê½¿ÉÌṩµÄÊÕÒæ¡£SAMËäÈ»²¢²»Ç¿ÖÆÒªÇ󣬵«Ò²¿ÉÒÔÖ§³ÖÕâÑùµÄ·Ö¸ô¡£È»¶øµ¥Ôª²âÊÔ£¨Unit test£©µÄ¼ÛÖµ»¹Ô¶Î´µÃµ½Ö¤Êµ£¬¾ö¶¨Ê¹Óõ¥Ôª²âÊԵķ½·¨Ç°ÐèҪȨºâÀû±×²¢¿¼ÂÇ¿ÉÄÜÔì³ÉµÄ¿ªÏú¡£ÊÓͼÓëÄ£ÐÍÖ®¼äµÄº¯Êý¹ØÏµ£¨¼´º¯ÊýʽHTML£©ÔÚÕâ·½ÃæÊÇÈç´ËµÄÇ¿´ó£¬¿ÉÒԿ϶¨µÄÊÇ£¬MVCģʽÒѾ­Ê±ÈÕÎÞ¶àÁË¡£¼øÓÚÄ£°åºÍÊý¾Ý°ó¶¨£¨Data binding£©ÒѾ­³ÉΪеÄFlash£¬ÒµÄÚÁìÏȵĿò¼Ü½«ºÜ¿ì½ÓÊÜÕâÖÖȫз¶Ê½£¬×ÔÈ»¶øÈ»µØÊµÏÖÊÓͼÓëÎÞ״̬×é¼þµÄ½âñî¡£

´ó¼Ò±ØÐëÒâʶµ½£¬º¯ÊýÏìӦʽ¿ò¼ÜÒÀÈ»ÔÚ¿ª·¢¹ý³ÌÖУ¬Ëæ×ÅŬÁ¦·¢ÏÖ¸üÓÐЧµÄÒµÎñÂß¼­Òò×Ó£¬»¹¿ÉÄܽøÐнϴó¹æÄ£µÄÖØ¹¹¡£½ö¿¼ÂÇReduxÉçÇø±¾Éí£¬ËûÃÇΪÁ˽â¾öÌØ¶¨ÎÊÌâËù´´½¨µÄ¿âÊýÁ¿¾ÍÒÑ´ó·ùÔö¼Ó£ºredux-sagas¡¢redux-gen¡¢redux-loop¡¢redux-effects¡¢redux-side-effects¡¢redux-thunks¡¢rx-redux¡¢redux-rx... ¶øÕâÉõÖÁ²¢Î´ËãÉÏReact±¾Éí¡¢GraphQL»òRelay¡£

ÎÒÃÇ´ÓSAMÖÐѧµ½ÁËʲô¾­Ñ飿

1. SAM¿ÉÒÔͨ¹ýÄã×Ô¼º¹ßÓõĿò¼ÜÀ´ÊµÏÖ

SAMÕâÖÖģʽ±¾Éí¿ÉÒÔʹÓô󲿷ÖÁ÷ÐеÄǰ¶Ë¿ò¼ÜÀ´ÊµÏÖ£¬ÀýÈçAngularºÍReact¡£

David FallÌṩÁËÒ»ÖÖ׿ԽµÄË«¿Í»§¶ËReact/Redux¾®×֯壍Tic-Tac-Toe£©ÊµÏÖ£»¾ÍÖ°ÓÚOrangeµÄBruno Darrigues½«SAMÓëAngular 1.5ÅäºÏʹÓÃÌṩÁËÒ»ÖÖTypeScriptʵÏÖ£»Fred DaoudÌṩÁËÒ»ÖÖCycle.jsʵÏÖ£»Troy IngramÌṩÁËÒ»ÖÖKnockout.jsʵÏÖ£¬»¹ÓÐMichael SolovyovµÄÒ»ÖÖVue.jsʵÏÖ¡£

¸üÖØÒªµÄÊÇ£¬ÎÒÃÇ¿ÉÒÔÔÚVanilla JavaScriptµÄ»ù´¡ÉÏʵÏÖSAMģʽ¡£µ±È»£¬´ËʱÐèÒª¶Ô¿çÕ¾µã½Å±¾£¨XSS£©¸¶Öî¸ü¶à¹Ø×¢¡£È»¶ø¾ÍËãReactÕâÑùĬÈÏEscapeËùÓÐÖµµÄ¿ò¼ÜÒ²¿ÉÄÜÏԵúܴàÈõ¡£

2. ÓïÒåºÜÖØÒª

SAMÔÚÒâͼ£¨Intent£©ºÍʵ¼ÊµÄ¸Ä±ä£¨Mutation£©Ö®¼ä½øÐÐÁËÊ®·ÖÇåÎúµÄÇø·Ö¡£²Ù×÷£¨Action£©½«ÖµÌṩ¸øÄ£ÐÍ£¨Model£©£¬µ«²Ù×÷¾ø¶ÔÎÞ·¨¿ØÖÆÄ£ÐÍÊÇ·ñ²úÉú¸Ä±äÒÔ¼°ÈçºÎ¸Ä±ä£¬ÒòΪÕâÒªÇó²Ù×÷±ØÐë¶ÔÕû¸öϵͳ¾ß±¸È«ÃæÁ˽⡣

ÀýÈçÓû§µã»÷ÁËÒ»¸ö°´Å¥¡£µã»÷²Ù×÷½ö½ö´ú±íÁËÓû§Ï£Íû×öijʵÄÒâͼ¡£ÊÇ·ñÔÊÐíÖ´ÐиòÙ×÷£¬ÒÔ¼°Ö´Ðкó»á·¢ÉúʲôÊ£¬ÕâЩÒòËØÊÇÓÉÄ£Ð͸ºÔð¿¼Âǵġ£

Òò´ËSAMÍêÈ«·ûºÏÈí¼þ¼Ü¹¹µÄÖØÒªÉè¼ÆÔ­Ôò£º

¹Ø×¢µã·ÖÀ루Separation of concern£©£º½«Ó¦ÓóÌÐò²ð·ÖΪ²»Í¬µÄ¹¦ÄÜ£¬²¢È·±£²»Í¬²¿·ÖÔÚ¹¦ÄÜÉϵÄÖØµþ·¶Î§¾¡¿ÉÄÜС¡£´Ëʱ×îÖØÒªµÄÒòËØÔÚÓÚÈ·±£½»»¥µã£¨Interaction point£©ÊýÁ¿±£³Ö×îС£¬ÒÔʵÏÖ¸ßÄÚ¾ÛºÍÈõñîºÏ¡£

µ¥Ò»Ö°Ôð£¨Single Responsibility£©£ºÃ¿¸ö×é¼þ»òÄ£¿éÖ»Ó¦³Ðµ£Ä³Ò»Ìض¨¹¦ÄÜ»òÌØÐÔ£¬»òÄÚ¾Û¹¦Äܵľۺϡ£

×îÉÙ֪ʶ£¨Least Knowledge£©£ºÒ»¸ö×é¼þ»ò¶ÔÏó²»Ó¦Á˽âÆäËû×é¼þ»ò¶ÔÏóµÄÄÚ²¿Ï¸½Ú¡£

²»ÒªÖظ´×Ô¼º£¨Don¡¯t repeat yourself£¬DRY£©£ºÖ»ÐèÒªÔÚÒ»¸öλÖÃÖ¸¶¨Òâͼ¡£ÀýÈçÔÚÓ¦ÓóÌÐòÉè¼Æ¹ý³ÌÖУ¬Ò»¸ö¾ßÌåµÄ¹¦ÄÜÖ»ÒªÔÚÒ»¸ö×é¼þÖÐʵÏÖ¼´¿É£¬¸Ã¹¦Äܲ»Ó¦Öظ´³öÏÖÔÚÈÎºÎÆäËû×é¼þÖС£

µ±È»£¬¾ÍËã²»×ñÊØÕâЩ¹æÔòÒ²¿ÉÒÔд³öWebÓ¦Óã¬È»¶øÈç¹ûÄã×·ÇóµÄÄ¿±êÊÇ¿Éά»¤ÐÔ¡¢¿ÉÀ©Õ¹ÐÔ£¬ÒÔ¼°¿É¸´ÓÃÐÔ£¬´ËʱSAM½«»áÊÇÒ»Öַdz£ÓÐǰ¾°µÄ±¸Ñ¡·½°¸¡£

3. ʱ¼äÂÃÐÐ2.0

ReduxÒòÆäʱ¼äÂÃÐкÍʵʱ´úÂë±à¼­¹¦ÄܶøÖªÃû¡£ÆäʵSAMÒ²×ã¹»Áé»î£¬¿ÉÒÔʵÏÖÀàËÆµÄ¹¦ÄÜ£¬²¢ÔÚ´Ë»ù´¡ÉϽøÒ»²½Ìṩ¸ü¶à¹¦ÄÜ¡£

Ëæ×Ž«Ä£Ðͻָ´ÎªÔçÏȵÄʱµã£¬Æä״̬Ҳ»á×ö³öÏìÓ¦¡£Èç¹ûʹÓÃVirtualDOM¿â£¨ÈçReact£©£¬ÊÓͼҲ»á¶ÔеÄ״̬×ö³öÏìÓ¦¡£nap()º¯Êý»¹ÌṩÁ˶îÍâµÄ²ã¡£ÊäÈëеÄ״̬¼´¿É´¥·¢nap()º¯Êý²¢¿ÉÄÜÅ׳ö×Ô¼ºµÄ²Ù×÷¡£

Òò´ËÎÒÃÇ¿ÉÒÔʹÓÃʱ¼äÂÃÐй¦ÄܲâÊÔÄ£ÐÍ¡¢×´Ì¬ºÍnap()¡£SAM DevTools»¹ÌṩÁËÒ»ÖÖʵʱ¸ÅÄî֤ʵµÄ¹¦ÄÜ¡£ËäÈ»¿ÉÒÔ·µ»ØÖÁijһʱµã£¬µ«ÎÞ·¨Î¬³Öcounter == 10µÄ״̬£¬ÒòΪnap()»áÁ¢¿Ì´¥·¢Æô¶¯(hasLaunched = true)¡£

ʵʱ´úÂë±à¼­¿Éͨ¹ýwebpackʵÏÖ¡£Èç¹ûʹÓÃReact£¬Ò²¿ÉÒÔ½«Dan AbramovµÄreact-hot-loaderÓëSAMÅäºÏʹÓ᣸ù¤¾ß»¹ÌṩÁËÒ»¸ö·þÎñÆ÷¶ËµÄ°æ±¾£¬²¢ÒѰüº¬ÔÚSAMµÄSAFEÖмä¼þÖС£

4. ÊÓͼ¿ÉÓëÄ£ÐÍÈ«Ãæ½âñî

ÕâÒ²ÐíÊÇʹÓÃSAMËùÄÜ»ñµÃµÄ×î´ó¼ÛÖµ¡£SAMµÄÒ»¸ö¶ÀÌØÖ®´¦ÔÚÓÚ£¬²»Í¬ÓÚMVxģʽ£¬SAMģʽÖеÄÊÓͼÊÇÓëÄ£ÐÍÑϸñ¸ôÀëµÄ£¬¶øÕâÖÖ¸ôÀëͨ³£¿Éͨ¹ý²Ù×÷ºÍ״̬º¯ÊýʵÏÖ¡£

V = S(M)

ÔÚSAMÖУ¬×´Ì¬¾ÍÊÇÒ»ÖÖ´¿´âµÄº¯Êý¡£

Thomas J. Buhr½âÊÍ˵£º

×ã¹»ºÃµÄǰ¶Ë¼Ü¹¹Ó¦¸ÃÄÜÈÃÄãÓþ¡¿ÉÄܽâñîµÄ·½Ê½½«Ä£¿é»¯µÄº¯Êý¹Ì¶¨£¨Pin£©ÖÁUI×é¼þ¡£½è´Ë¼´¿É°´Ðè¸ü»»Îª×é¼þÌṩ֧³ÅµÄ¼¼Êõ£¬¶øÎÞÐëµ£ÐÄÓ°ÏìËùÓÐÒµÎñÂß¼­£¨ÔÚÒѾ­³Ùµ½µÄÏÂÒ»´ú¿ò¼ÜÖ§ÅäÏ£©

SAMµÄÄ£ÐÍͨ³£±»³ÆÖ®Îª¡°Ó¦ÓóÌÐò״̬¡±£¬ÔÚFlux/ReduxÖÐÔò½ö½ö±»³ÆÖ®Îª¡°×´Ì¬¡±£¬Ä£ÐÍͨ³£ÓÉÒ»×éÊôÐÔÖµ×é³É¡£×´Ì¬º¯Êý¸ºÔðͨ¹ýÄ£Ð͵ÄÊôÐÔÖµ¹¹½¨×´Ì¬µÄ¾ßÌå³ÊÏÖ£¨State Representation£©¡£Ó¦ÓóÌÐòµÄ¿ØÖÆ×´Ì¬Í¨³£Ò²Ô´×ÔÊôÐÔÖµ£¬µ«²¢²»ÐèÒª½«ÓëÊÓͼÓйصĸ÷ÀàÊôÐÔÒ²·ÅÈëÄ£ÐÍÖС£

David FallÔÚΪ×Ô¼ºµÄ¾®×֯壍Tic-Tac-Toe£©·¶ÀýʵÏÖ¡°Á½Íæ¼Ò¡±¶ÔÕ½µÄ¹ý³ÌÖнâÊÍÁËÕâÒ»ÎÊÌ⣺

¿ÉÒÔÈ¡Ïû¶Ô¡®showJoinSessionForm¡¯Ä£ÐÍÊôÐÔµÄÒÀÀµ£¬×ªÎª´Ó·â×°ÁË±íµ¥×é¼þµÄÈÝÆ÷×é¼þÖÐÍÆµ¼³ö¿É¼ûÐÔ¡£ÀýÈç¿ÉÒÔÓÃÒ»¸öÃûΪJoinSessionµÄ״̬£¬Èç¹ûgameType === 'Join Game'£¬²¢ÇÒsession === undefined£¬Ôò¸Ã״̬ΪTrue¡£×é³É״̬µÄÕâÁ½ÖÖÌõ¼þÒѾ­×ãÒÔÈ·¶¨ËùÒªÏÔʾµÄ±íµ¥×é¼þ¡£Ò»µ©Ä£ÐͽÓÊÜÁËÓÐЧµÄ¡®session¡¯¼ü£¬JoinSession״̬½«²»ÔÙΪTrue£¬Òò´Ë²»»áäÖȾ±íµ¥×é¼þ¡£

´ËÍâÊÓͼҲ¿É·Ö½âÖÁÎÞ״̬×é¼þÖУ¬ÕâЩÎÞ״̬×é¼þ¶ÔÓÚÒªÔÚÄÄÀïäÖȾ£¬ÒÔ¼°Ïà¹ØÊ¼þÈçºÎÁ¬½ÓÖÁÓ¦ÓóÌÐòµÄ²Ù×÷È«²»ÖªÇé¡£

SAMÖ§³Ö£¨µ«·ÇÇ¿ÖÆÒªÇó£©Ê¹ÓÃVirtual-dom¿â¡£Õâ¸ö¸ÅÄî×î³õÊÇÓÉReact·¢Ñï¹â´óµÄ£¬ËæºóÈËÃǾݴ˿ª·¢Á˺ܶà¿â£¬ÀýÈçvirtual-dom¡¢mithrilÒÔ¼°snabbdom¡£Jose Pedro Dias[1]ÌṩÁËÒ»ÖÖʹÓÃSabbdomµÄSAMʵÏÖ¡£

5. ͨÓÃJavaScriptÒà¿ÉºÁ²»·ÑÁ¦µØÊµÏÖ

SAMµÄʵÏÖ´Ó±¾ÖÊÉÏÀ´ËµÊÇͨÓõġ£¸ÃģʽµÄÈκÎÔªËØ¾ù¿É²¿ÊðÔÚ¿Í»§¶Ë»ò·þÎñÆ÷¶Ë£¬²¢¿É°´ÐèÇ¨ÒÆ£º

×÷ÓÿÉͨ¹ý²Ù×÷ºÍÄ£ÐͲúÉú¡£¡°²©¿Í¡±·¶ÀýչʾÁËÏàͬ´úÂ루²Ù×÷¡¢Ä£ÐÍ¡¢×´Ì¬£©ÈçºÎÒÔNode.jsÐÎʽ²¿Ê𵽿ͻ§¶Ë£¬ÉõÖÁÒÔÎÞ·þÎñÆ÷¼Ü¹¹ÐÎʽ²¿Êðµ½AWS Lambda¡£

¶ÔÓÚÖîÈçElm¡¢React/ReduxÒÔ¼°Cycle.js£¨Ò²Êܵ½ÁËElmËùÓ÷½·¨µÄÓ°Ï죩µÈ¿ò¼Ü£¬ÈËÃÇÔÚ¸±×÷Ó÷½Ãæ½øÐÐÁË´óÁ¿µÄÑо¿¡£¶ÔÓÚÕâЩÎÊÌ⣬redux-side-effectµÄ×÷ÕßGreg Weber½âÊÍ˵£º

ÐèҪעÒâµÄÊÇ£¬reduxÊܵ½ÁËElmµÄÆô·¢¡£ÔÚ×îаæElmÖУ¬Reducer¿É·µ»ØÐÂ״̬ÒÔ¼°×÷Óá£[redux-side-effect]¿â»áÔÚJavascriptºÍReduxµÄÔ¼ÊøÏ¾¡¿ÉÄÜÄ£ÄâElmÖеÄ×÷Óô¦Àí·½Ê½¡£

redux-effects¿âÕë¶ÔÏÂÁÐÀàÐ͵Ä×÷ÓÃÌṩÁËÇý¶¯£º

setTimeout/setInterval/requestAnimationFrame

HTTPÇëÇó

Cookie get/set

λÖã¨window.location£©°ó¶¨ºÍÉèÖÃ

Éú³ÉËæ»úÊý

Å׳ö²Ù×÷£¬×÷Ϊ¶Ôwindow/documentʼþ£¨Èç¹ö¶¯/µ÷Õû´óС/µ¯³ö״̬µÈ£©µÄ»ØÓ¦

localStorage×÷ÓÃÇý¶¯

Èç¹ûURLÓëijһģʽÏàÆ¥Å䣬×Ô¶¯Ê¹ÓÃ״̬Öд洢µÄƾ¾Ý¶ÔFetchÇëÇó½øÐв¹³ä¡£

ÁíÒ»·½Ã棬SAM²¢²»Ç¿ÖÆÒªÇó½øÐÐÈç´ËÇåÎúµÄ·Ö¸ô£¬¶øÊÇרעÓÚʵÏÖ¸ü¿É¿¿µÄÓ¦ÓóÌÐò״̬±ä»¯¡£SAMµÄÓïÒ壨¼Ì³Ð×ÔTLA+·ûºÏPaxosЭÒéµÄÒªÇó£º

²Ù×÷ÌṩµÄÖµÓÉÄ£ÐͽÓÊÜ£¨»ò¾Ü¾ø£©£¬×´Ì¬Ê¹µÃϵͳÁ˽âÕâЩ±ä»¯¡£

¶ÔÓÚSAMÀ´Ëµ£¬×´Ì¬µÄ±ä»¯½öÊܵ½Ä£Ð͵ĿØÖÆ£¬¶Ô²Ù×÷ºÍ״̬±¾ÉíÊDz»¿É¼ûµÄ¡£ÕâÒâζ×ÅÐèÒªÓɲÙ×÷¶ÔÔÊÐí·¢ÆðHTTPÇëÇóµÄÓû§Òâͼ½øÐгäʵ£¨Enrich£©ºÍÑéÖ¤£¬²¢½öÔÚ·µ»ØHTTPÇëÇóµÄÇé¿öϽ«½á¹û³ÊÏÖ¸øÄ£ÐÍ¡£Í¬Àí£¬²¢Ã»ÓÐÊ²Ã´ÌØ±ðµÄÀíÓÉÐèÒªÎÒÃǶÔÄ£ÐÍÖ®ÍâµÄ³Ö¾Ã²ã½øÐиüУ¨ÀýÈçͨ¹ýרÃŵÄElmÈÎÎñ£©£¬ÒòΪӦÓóÌÐò״̬ͨ³£È¡¾öÓÚ¸üнá¹ûÊÇ·ñ³É¹¦»òʧ°Ü£¬¶øÖмä״̬µÄÌåÏÖ£¨¡°¸üС±£©¿ÉÄܶÔÓû§ÊÇÎ޹صģ¬Óû§Ö»¹ØÐÄ×îÖÕ½á¹û¡£

µ±È»£¬ÔÚ´ËÀà´úÂëµÄ¿É²âÊÔÐÔ·½Ã滹ÓÐһЩÕùÒ飬µ«ÊÇ£¬¾ÙÀýÀ´Ëµ£¬ÎÒÃÇ¿ÉÒÔʹÓÃÖîÈçMounteBankµÈAPIÐéÄ⻯¹¤¾ß£¨¶ø·Ç¹¹½¨Stub£©´´½¨ÊܿصĿɲâÊÔ»·¾³¡£

ReduxÉçÇøÄ¿Ç°ÒѾ­È¡µÃÁËΨһµÄѹµ¹ÐÔÓÅÊÆ£¬½¨ÒéʹÓã¨ÓÐ״̬£©¡°Sagas¡±ÒÔ´¦Àí¸±×÷Óá£ÔÚijÖ̶ֳÈÉÏ£¬Õâ¸öÑ¡ÔñÈÃÈËÓÐЩ³Ô¾ª£¬±Ï¾¹Sagas²¢Î´×ñÊØReduxºÍÏÖ´ú»¯º¯ÊýÏìӦʽǰ¶Ë¼Ü¹¹µÄµÚÒ»¸ö»ù±¾Ô­Ôò£¬¼´²¢Ã»ÓлùÓÚµ¥Ò»×´Ì¬ÊéÊ÷¡£SAMµÄ¡°next-action-predicate£¨ÏÂÒ»²½²Ù×÷Ô¤²â£©¡±£¨nap()º¯Êý£©ÌṩÁËÀàËÆµÄÄÜÁ¦£¬¾¡¹ÜËüʹÓÃÁËÒ»ÖÖº¯Êýʽ£¨ÀýÈçÎÞ״̬£©µÄ·½·¨¡£»»¾ä»°Ëµ£¬nap()º¯ÊýÐèÒªÒÀÀµÓ¦ÓóÌÐòµÄµ±Ç°×´Ì¬£¨Ä£Ð͵ÄÊôÐÔÖµ£©À´¾ö¶¨ÊÇ·ñÐèÒª´¥·¢Ä³¸ö×Ô¶¯»¯²Ù×÷¡£Ëü²¢²»ÏñSagasÄÇÑù»áά³Ö×Ô¼ºµÄ״̬¡£µ±È»£¬¡°ÏÂÒ»²½²Ù×÷¡±¿ÉÄÜÐèÒªÔËÐнϳ¤Ê±¼ä£¬²¢ÓпÉÄܲúÉú¸±×÷Ó㬵«×îÖÕÒÀÈ»Äܽ«Êý¾ÝÌṩ¸øÄ£ÐÍ¡£

7. SAM¶ÀÒ»ÎÞ¶þµÄ¡°²½Ö衱¸ÅÄî

Lamport²©Ê¿Ôø½âÊÍ˵£º

±à³ÌÓïÑÔδÄܸø³ÌÐòµÄ²½ÖèÌṩ¾«È·¶¨ÒåµÄ¸ÅÄî¡£

ÓÉÓÚÒÔTLA+Ϊ»ù´¡£¬SAMÖ§³ÖÓÃÓÚ¶Ô״̬µÄ±ä»¯½øÐзâ×°ËùÓõġ°²½Ö裨Step£©¡±ÕâÒ»¸ÅÄî¡£SAMµÄ²½ÖèÁ÷ʼÖÕ°üº¬Èý¸ö½×¶Î£ºÌáÒ飨²Ù×÷£©¡¢½ÓÊÜ£¨Ä£ÐÍ£©£¬ÒÔ¼°Ñ§Ï°£¨×´Ì¬/ÊÓͼ£©¡£×÷Ϊ¶Ô±È£¬ÔÚElmµÄÈÎÎñ/ÃüÁî»òRedux SagasÖУ¬²¢²»¾ß±¸Óйء°²½Ö衱µÄ¸ÅÄÉõÖÁ¿ÉÔÚÓëÌØ¶¨×´Ì¬×ª»»£¨Èçij¸ö²Ù×÷£©Î޹صÄÇé¿öÏÂËæÒâ´¥·¢Ð§¹û¡£

²½ÖèÕâÒ»¸ÅÄîʹµÃSAM¿ÉÒÔÖ§³ÖÒ»°ãµÄ²Ù×÷ÊÚȨºÍÈ¡Ïû»úÖÆ¡£ÕâЩ¸ÅÄîÊÇͨ¹ýSAMµÄState Action Fabric Element£¨SAFE£©ÊµÏֵġ£

8. ½«RxJsÓÃ×÷Á¬½Ó»úÖÆµÄ×ö·¨±»¸ß¹ÀÁË

RxJSÊÇÒ»ÖÖÁ÷ÐеĿ⣬¿ÉÓÃÓÚΪJavaScriptʵÏÖÏìӦʽÀ©Õ¹¡£ÈËÃÇÏÖÔÚ/Ôø¾­¹ã·ºÈÏΪRxJsºÍʼþÁ÷ÊÇ¡°Á¬½Ó¡±ÖîÈçCycle.jsµÈ¿ò¼ÜÖв»Í¬ÔªËصÄÒ»ÖÖ·½·¨£º

Cycle.jsʵ¼ÊÉϾÍÊÇÒ»ÖÖ¹¹½¨ÏìӦʽWebÓ¦Óõļܹ¹£ºÌṩÁËһϵÁаïÄãʹÓÃRxJSÈ·¶¨Ó¦Óù¹ÔìµÄÏë·¨¡£

ÉõÖÁ¹È¸èµÄAngular TeamÒ²ÔÚʹÓá°ng-rx¡±£¬NetflixµÄBen Lesh×î½ü»¹·¢²¼ÁËÒ»¸öredux-observableÖмä¼þ¡£

RxJSµÄÎÊÌâÔÚÓÚ£¬Á¬½ÓÊÇͨ¹ý¶©ÔĵÄÐÎʽ½øÐеġ£µ±ÎÒÃÇ´´½¨Ò»¸ö¡°¿É¹Û²ì¡±µÄ±äÁ¿ºó£¬³ÌÐòÖеIJ¿·ÖÄÚÈÝÐèÒª½øÐж©ÔÄ£¬¶øÓж©ÔľͱØÈ»ÐèÒªÍ˶©¡£¸üÔãµÄÊÇ£¬Èç¹û¶Ôͬһ¸ö¿É¹Û²â±äÁ¿¶©ÔÄÁ½´Î£¬ÊµÀý»¯¹ý³ÌÖÐͨ³£½«ÐèÒªÁ½¸öÖ´ÐÐÏß³Ì

ÔÚ×î½üһƪÎÄÕÂÖУ¬Andr¨¦ MedeirosÌáµ½£º

ÔÚCycle.jsÖУ¬ÎÒÃÇÖ»ÔÊÐí[¸ºÔð´¦Àí×÷ÓõÄ]Çý¶¯ÄÚ²¿Ö´ÐÐsubscribe()¡£ÕâÒâζ×ÅÓ¦ÓóÌÐò[Âß¼­]¶Ô¶©ÔÄÍêÈ«²»ÖªÇé¡£µ±¿ª·¢Õß¼ÙÉèÀ´×ÔÇý¶¯µÄÿ¸ö¿É¹Û²ìÄ¿±êÖ»ÓÐÒ»¸öÖ´ÐÐʱ£¬Ó¦ÓóÌÐò½«±äµÃÄÑÒÔÀí½âºÍµ÷ÊÔ¡£

MobXµÄ´´½¨ÕßMichel Weststrate²¹³ä˵£º

ÔÚ¹ÜÀíÕâЩ¶©ÔÄʱ¿Ï¶¨»á³ö´í£¬¿ÉÄܶ©ÔĹýÁ¿£¨³ÖÐø¶©ÔÄ×é¼þÖв»ÔÙʹÓõÄÖµ»ò´æ´¢£©»ò¶©ÔIJ»×㣨Íü¼ÇÕìÌý¸üе¼Ö²úÉú²»Òײì¾õµÄÀϾÉBug£©¡£

¶ÔÓÚ»ùÓÚ¹Û²ìÕߵıà³ÌÄ£ÐÍ£¬×î³£¼ûµÄÎÊÌâÔÚÓÚÎÞ·¨ÀíËùµ±È»µØ²úÉúÓÃÓÚ½ÓÊÜËùÌáÒé±ä»¯µÄÁÙ½çÇø¶Î£¨Critical section£©¡£ËüÃÇÌ«¡°ÏìӦʽ¡±ÁË¡£ÕâʹµÃÎÒÃÇ¿ªÊ¼ÔÙ´ÎÃæ¶Ôǰ¶Ë¼Ü¹¹×î³õµÄÎÊÌ⣺ʼþ£¨ÏÖÔÚÒѾ­·âװΪ¿É¹Û²ìÄ¿±ê»òÁ÷£©Ö±½ÓÁ¬½ÓÖÁÐèҪͨ¹ýijÖÖ·½Ê½¶Ô²Ù×÷½øÐÐͬ²½µÄʼþ´¦Àí·½¡£

×÷Ϊ¶Ô±È£¬ÒÔTLA+Ϊ»ù´¡µÄSAMÌṩÁËһϵÁвàÖØÓÚ¾ö¶¨Ìض¨Ê±¼ä¡°ÔÊÐí¡±Ö´ÐÐÄÄЩ²Ù×÷µÄÓïÒå¡£SAMµÄÓïÒåÉõÖÁ¿ÉÒÔÔÚ¿É·¢ÆðµÄ²Ù×÷£¬ºÍÒѾ­·¢Æð¹ý²¢ÄÜÓÃÓÚÌṩÊý¾Ý£¨²Ù×÷µÄÈ¡Ïû£©µÄ²Ù×÷Ö®¼ä½øÐÐÃ÷È·µÄÇø·Ö¡£Õâ¸öÅжÏÍêÈ«»ùÓÚÓ¦ÓóÌÐòµÄµ±Ç°×´Ì¬£¨Ê¼ÓÚ×îºóÒ»¸ö²½Ö裩£¬¶øÎÞÐ뿼ÂÇÕâ¸ö״̬ÊÇͨ¹ýʲô·¾¶µ½´ïµÄ¡£SAMÓïÒå¿ÉÒÔ°ïÖúÎÒÃǸüÈÝÒ×µØÍÆÀí£¬ÒòΪÆäÓïÒå½ö»ùÓÚ¡°µ±Ï¡±£¬¶ø²»ÏñRx»òSagaÓïÒåÄÇÑùÐèÒªÁ˽â¹ýÈ¥£¨Ôø¶©ÔĵÄÄÚÈÝ£©¡£

½áÂÛ

ǰ¶Ë¼Ü¹¹ÕýÔÚ¿ìËÙÑÝ»¯£ºËƺõÿÖܶ¼»á³öÏÖеĿ⣬ÒÔ¼°ÏÖÓпâµÄ³£Á¿Öع¹¡£¶Ôº¯ÊýÏìӦʽ»ù´¡µÄ¹ã·º¹Ø×¢Ëƺõ»¹»á¼ÌÐø³ÖÐøÏÂÈ¥£¬²»¹ýÎÒÃÇ¿ÉÄÜÐèÒª¶ÔÕâÖÖ·½Ê½µÄÕæÕýº¬Òå×ö³ö¸ü¾«È·µÄ¶¨Òå¡£º¯ÊýʽHTML¡¢µ¥ÏòÊý¾ÝÁ÷£¬ÒÔ¼°µ¥Ò»×´Ì¬Ê÷µÈ¸ÅÄîÒѾ­´øÀ´Á˾޴óµÄ¼ÛÖµ£¬¶øÏìӦʽÀ©Õ¹£¨Á¬½Ó£©ÒÔ¼°×÷ÓõĴ¦ÀíËÆºõ»¹ÐèÒª½øÒ»²½Ñо¿¡£ÔÚÕâÒ»¹ý¶É¹ý³ÌÖУ¬Ä£°åºÍÊý¾Ý°ó¶¨Ëƺõ»¹Ã»ÓÐʲô½øÕ¹¡£

ºÍĿǰËùÓõķ½·¨Ïà±È£¬SAMÌṩÁËÈý¸ö¹Ø¼üµÄÓïÒå¡£Ê×ÏÈ£¬SAMÒªÇóÔÚÌáÒéºÍ½ÓÊÜÄ£Ð͵ı仯֮¼ä½øÐÐÇåÎúµÄ·Ö¸ô£¨½è´Ë¼ò»¯¸±×÷ÓõĹÜÀí£©¡£Æä´Î£¬SAM¹ÄÀø¿ª·¢Õß½«ÏµÍ³Ê¼þת»»Îª×¨ÃŵIJÙ×÷£¨´òÔìÄ£¿é»¯³Ì¶È¸ü¸ßµÄ´úÂ룩¡£×îºó£¬SAMÒýÈëÁË״̬º¯ÊýÕâÒ»¸ÅÄ¿Éͨ¹ý½âÊÍÄ£Ð͵ÄÊôÐÔÖµÍÆµ¼³ö״̬µÄ³ÊÏÖºÍÏÂÒ»²½²Ù×÷¡£×ܵÄÀ´Ëµ£¬ÕâЩÓïÒå¿ÉÒÔ°ïÖúÎÒÃÇ¿ØÖÆÄ£Ðͱ仯µÄ˳Ðò£¬¶ÔÓÚ°üº¬ÔÚ¸ü¹ã·ºµÄ¶¯Ì¬·Ö²¼Ê½ÏµÍ³ÖеÄGUI£¬ÕâÒ»µã·Ç³£ÖØÒª¡£

ÈôÏë½øÒ»²½Á˽âSAMģʽÇë·ÃÎÊÕâÀ²¢ÔÚÕâÀïÏÂÔØSAFEÖмä¼þ¡£´ËÍâ»¶Ó­¼ÓÈëÎÒÃÇÔÚGitterÉϵÄÌÖÂÛÇø¡£

 

   
6463 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕ Ïà¹ØÎĵµ Ïà¹Ø¿Î³Ì



Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹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[±±¾©]

AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Àí½âJavascript
·ÇµäÐÍajaxʵ¼ù
³¹µ×µÄAjax
javascript ʹÓÃCookies
ʹÓà jQuery ¼ò»¯ Ajax ¿ª·¢

Struts+Spring+Hibernate
»ùÓÚJ2EEµÄWeb 2.0Ó¦Óÿª·¢
J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Java EE 5ÆóÒµ¼¶¼Ü¹¹Éè¼Æ
Javaµ¥Ôª²âÊÔ·½·¨Óë¼¼Êõ
Java±à³Ì·½·¨Óë¼¼Êõ

ijº½¿Õ¹«Ë¾IT²¿ JavaScriptʵ¼ù
ijµçÊÓÈí¼þ HTML5ºÍJavaScript
Öк½ÐÅ JavaScript¸ß¼¶Ó¦Óÿª·¢
´óÇìÓÍÌï web½çÃæAjax¿ª·¢¼¼Êõ
ºÍÀûʱ ʹÓÃAJAX½øÐÐWEBÓ¦Óÿª·¢