±à¼ÍƼö: |
±¾ÎÄÀ´×Ôjuejin.im£¬
±¾ÎĽ²½âÁËǰ¶ËÍøÕ¾¼Ü¹¹µÄÒ»µã·ÖÎöºÍÀí½â,Ï£Íû±¾ÎĶԴó¼ÒÓаïÖú¡£ |
|
Ðò
×ʼ½Ó´¥Ç°¶ËµÄʱºò£¬ÊÇ´Ó¼òµ¥µÄhtml¡¢css¡¢js¿ªÊ¼µÄ£¬µ±Ê±Ê¢ÐеÄWEBÀíÄîÊǽṹÑùʽÐÐΪÏà·ÖÀ룬¼´html¡¢css¡¢js·ÖÀ룬¶ÀÁ¢¿ª·¢£¬»¥ÏàÖ®¼äͨ¹ýlinkºÍscriptÀ´»¥Ïàµ÷Óá£
×ʼÎÒËù½Ó´¥µ½µÄСÏîÄ¿£¬¶¼ÊÇÖ±½Ó½«html¡¢css¡¢jsµÈ¾²Ì¬×ÊÔ´Ö±½Ó²¿Êðµ½·þÎñÆ÷ÉÏ£¬È»ºó¸ù¾ÝÇëÇó·ÓÉÏìÓ¦²»Í¬µÄhtmlÎļþ¼´¿É¡£

¼´Ê¹Ñ§Ï°ÁËwebpackÖ®ºó£¬ÎÒÒÀÈ»ÈÏΪwebpackµÄ×÷ÓÃÖ»ÊÇѹËõjsºÍcssÎļþ£¬Ìá¸ß·þÎñÆ÷ÏìÓ¦ËÙ¶È£¬ÓÅ»¯Óû§ÌåÑ飬¶ø²¿Êðµ½·þÎñÆ÷ÉϵÄÒÀÈ»ÊÇѹËõºóµÄmin.cssºÍmin.jsÎļþ¡£
ºóÀ´½øÈëA¹«Ë¾ÊµÏ°Ö®ºó£¬È·ÊµÒ²ÊÇÕâÖÖ¿ª·¢Ä£Ê½£¬µ±Ê±ÎÒÃÇ¿ª·¢h5Ò³Ãæ£¬¶¼ÊÇÖ±½ÓÊéдhtml¡¢css¡¢jsÎļþ£¬È»ºó²¿Êðµ½·þÎñÆ÷ÉÏ£¬Ö±½Ó·ÃÎÊhtml¼´¿É¡£
ºóÀ´½øÈëB¹«Ë¾¹¤×÷Ö®ºó£¬²ÅÂýÂý½Ó´¥µ½ÕæÕýµÄǰ¶Ë¹¤³ÌÊÇʲôÑù×ӵġ£
ǰºó¶Ë·ÖÀë
²¿·Ö´«Í³´óÐÍPCÍøÕ¾µÄÒµÎñǰ¶Ë²¿·Ö¶¼ÊDzÉÓõÄMVC¼Ü¹¹·½Ê½£¬Ò²¾ÍÊÇÿ´ÎÁ¢ÏîÖ®ºó£¬Ç°ºó¶ËÔ¼¶¨ºÃ½Ó¿Ú£¬·Ö±ð¿ª·¢£¬¿ª·¢Íê±ÏÖ®ºó£¬Ç°¶Ë½«¿ª·¢ºÃµÄÒ³Ãæ½»¸øºó¶Ë£¨Ò»°ãÊÇJava»òÕßPHP£©£¬È»ºóÓɺó¶ËÏìÓ¦¿Í»§¶ËÇëÇ󣬷µ»Ø¾ßÌåµÄhtmlÒ³Ãæ¡£
ÕâÖÖ¿ª·¢Ä£Ê½µÄȱµãÔÚÓÚ·Ñʱ·ÑÁ¦£¬¹µÍ¨³É±¾ºÍÁªµ÷Õý±¾·Ç³£¸ß£¬Ç°¶ËÓÐÒ»µãСµÄ¸Ä¶¯¶¼ÐèҪǰºó¶ËÒ»ÆðÁªµ÷¸Ä¶¯ÉÏÏߣ¬´ó´óÔö¼ÓÁË×ܹ¤×÷Á¿¡£
Òò´Ë£¬ÏÖ´ú´óÐÍPCÍøÕ¾Ò»°ã¶¼²ÉÓÃÁËǰºó¶Ë·ÖÀëµÄ¼Ü¹¹·½Ê½£¬Ç°¶ËºÍºó¶ËµÄÒµÎñ¹¦Äܸ÷×ÔÊÕÁ²£¬¿ÉÒԷֱ𿪷¢ÉÏÏߣ¬»¥²»Ó°Ï죬¿ÉÒÔ¼«´óÌá¸ß¹¤×÷ЧÂÊ¡£
ǰºó¶Ë·ÖÀëÒ»°ã·ÖΪÁ½ÖÖ£º
ûÓÐÖмä²ãµÄǰºó¶Ë·ÖÀ룻
ÓÐÖмä²ãµÄǰºó¶Ë·ÖÀë¡£
ÕâÀïÒÔĿǰ×î»ðµÄÈý´ó¿ò¼ÜÖ®Ò»µÄreactΪÖ÷½øÐнéÉÜ¡£
ÎÞÖмä²ã
ûÓÐwebÖмä²ãµÄǰºó¶Ë·ÖÀëÊôÓڱȽϼòµ¥µÄÀàÐÍ£¬ÎÒÃǽ«Ò»¸öͳһµÄhtml/pugÄ£°åºÍÆäËûµÄcss¡¢jsµÈ¾²Ì¬×ÊÔ´·ÅÖõ½cdnÉÏ£¬Ã¿´Î·ÃÎÊÒ³ÃæµÄʱºò£¬Ö±½Ó½«Ä£°å·µ»Ø¸øÓû§£¬È»ºóÀïÃæËùÓеÄdom½ÚµãºÍÆäËûÊý¾Ý¶¼ÊÇÓÉjsÀ´Ö´ÐÐÉú³ÉµÄ¡£

È»¶øÕâÖÖûÓÐÖмä²ãµÄǰºó¶Ë·ÖÀëµÄÓÖÓкܶàÁÓÊÆ£º
ÊׯÁäÖȾʱ¼ä¹ý³¤£»
¶Ôseo²»ÓѺá£
ÓÐÖмä²ã
ÓÐÖмä²ãµÄǰºó¶Ë·ÖÀëÊÇÒ»°ã´óÐÍÏîÄ¿²ÉÓõÄǰºó¶Ë·ÖÀ뷽ʽ¡£
×Ô´Ó2009Äênodeºá¿Õ³öÊÀÖ®ºó£¬Ç°¶ËÒ²Ö𽥳е£ÁËһЩºó¶ËµÄÒµÎñ£¬µ«ÊÇnodeÓÉÓÚ×ÔÉí½¡×³ÐÔµÄÏÞÖÆ£¬ÓÖ²»ÊʺÏ×÷Ϊ´óÐÍÏîÄ¿µÄºó¶Ë·þÎñÆ÷£¬ËùÒÔnodeÈȹýÒ»ÕóÖ®ºó£¬Öð½¥³ÉΪÁËÁ¬½Ó´«Í³Ç°¶ËºÍºó¶ËµÄÖмä²ã£¬ÎÒÃÇÒ²³ÆÕâÖÖǰ¶Ë+nodeµÄ¼Ü¹¹Îª¡°´óǰ¶Ë¡±¡£
·µ»ØÄ£°å
ÔÚnode²ãÖУ¬ÎÒÃÇ¿ÉÒÔ×öµÄÊÂÇé¾ÍÓкܶàÁË£¬ÆäÖÐ×î»ù´¡µÄ¾ÍÊÇ·µ»Ø²»Í¬µÄǰ¶ËÄ£°å¡£
ʹÓùý¼¸¿îǰ¶ËÄ£°å£¬ÆäÖиøÎҸоõ×îºÃµÄ¾ÍÊÇpugÄ£°åÁË(ÒÔǰ½Ð×öjade)¡£
pugÖеÄÓï·¨¶¼ÊÇjsÓï·¨£¬¶Ôǰ¶Ë¹¤³Ìʦʮ·ÖÓѺ㬶øÇÒpug¹¦ÄܺÜÇ¿´ó£¬¿ÉÒÔ×÷Ϊhtml-middleware£¬±»nodeÍêÃÀÖ§³Ö£¬ÕâÀィÒéѧϰʹÓÃ
Get Started¡£
Êý¾ÝÆ´½Ó
Æä´Î£¬µ±ÍøÕ¾·¢Õ¹µØÔ½À´Ô½´ó£¬Êý¾ÝÁ¿Ô½À´Ô½¶à£¬¶Ô·þÎñ²ã½øÐзָîµÄʱºò£¬»á²úÉúºÜ¶àµÄ·þÎñÄ£¿é£¬»òÕßÎÒÃǵÄÊý¾Ý·ÖÉ¢ÔÚ²»Í¬µÄÊý¾Ý¿â·þÎñÆ÷ÉϵÄʱºò£¬»òÕßÎÒÃǵÄǰ¶ËÒ³ÃæÖÐҪǶÈëµÚÈý·½¹ã¸æµÄһЩapiµÄʱºò£¬node¾Í¿ÉÒÔ°ïÎÒÃÇÍê³ÉÊý¾ÝÆ´½ÓµÄ¹¤×÷¡£
ÒòΪ·þÎñÆ÷·ÃÎʽӿڵÄËÙ¶ÈÒª±Èä¯ÀÀÆ÷¿ìºÜ¶à¸öÊýÁ¿¼¶£¬Òò´ËÔÚnodeÖзÃÎʶà¸ö½Ó¿Ú²¢ÇÒÆ´½ÓÆðÀ´ÊǷdz£¸ßЧµÄ£¬Æ´½ÓºóµÄÊý¾ÝÎÒÃǾͿÉÒÔÖ±½Ó´«ÈëÄ£°åÖУ¬¹©jsʹÓÃÁË¡£
µ«ÊÇͨ³£ÒâÒåÉÏÀ´Ëµ£¬·ÃÎÊ»ù´¡·þÎñ»òÕß´ÓÊý¾Ý·þÎñÆ÷·ÃÎÊÊý¾Ý·ÅÔÚºó¶ËÀ´×ö±È½ÏºÏÊÊ£¬µ«·²ÊÂ×ÜÓÐÀýÍ⣬ÔÚÍò²»µÃÒѵÄÇé¿öÏ£¬ÎÒÃÇ¿ÉÒÔÔÚnodeÖмä²ãÖнøÐÐÊý¾ÝÆ´½Ó¡£

ÕâÖÖģʽһ°ã²»ÌᳫʹÓã¬ÒòΪ¿Éά»¤ÐÔÌ«²î£¬¶øÇÒ°²È«ÐÔÒ²ºÜµÍ£¬Ò»°ãÇé¿ö϶¼ÊǺó¶ËÓÐÒ»¸öרÃŵÄÊý¾ÝÄ£¿éÈ¥·ÃÎÊÊý¾Ý¿âºÍ·þÎñ£¬È»ºó½«Êý¾ÝÆ´½ÓÆðÀ´£¬ÎÒÃÇÖ»ÐèÒªÔÚnodeÖе÷Óúó¶ËµÄÒ»¸öAPI£¬¾Í¿ÉÒÔÄõ½ÎÒÃÇÏëÒªµÄÊý¾ÝÁË¡£
¼à¿Ø·þÎñ
node²ã¿ÉÒÔ²¶×½Ò»Ð©Òì³£ÇëÇó»òÕßʼþ£¬Éϱ¨µ½ÎÒÃǵĵÚÈý·½¼à¿ØÆ½Ì¨,ÈçSentryµÈ£¬Í¬Ê±node»¹¿ÉÒԳе£Ò»²¿·ÖµÄÊý¾Ýͳ¼ÆµÄ¹¤×÷£¬½«Ò»Ð©Óû§Ó¦Îª´òµ½µÚÈý·½Êý¾Ýͳ¼ÆÆ½Ì¨£¬¹©pmºÍÊý¾Ý·ÖÎöʦ²é¿´¡£
node»¹¿ÉÒԳе£¶ÔÕû¸öʵÀý½øÐÐ¼à¿ØµÄÖ°Ô𣬵±³öÏÖÒì³£µ¼ÖÂcpuʹÓÃÂÊ»òÕßÄÚ´æÊ¹ÓÃÂʳ¬¹ýãÐÖµÖ®ºó¾Í¿ÉÒÔ¼°Ê±´¥·¢±¨¾¯»úÖÆ¡£
µ«ÊÇͬÑù£¬¼ÓÉÏnode²ã¾ÍÒâζÕâÍøÕ¾ÓÖ¶àÁËÒ»²ãºó¶ËÐèÒª¼à¿ØºÍoncall£¬¹¤×÷µÄ¸´ÔÓ¶È»áÉÏÉýºÜ¶à¡£
·þÎñÆ÷¶ËäÖȾ
SSR(server-side-render)¿ÉÒÔ˵ÊǷdz£ÖØÒªµÄ¹¦ÄÜÖ®Ò»ÁË£¬Ëü¿ÉÒÔ°ïÖúÎÒÃǽâ¾ö֮ǰÌáµ½µÄÊׯÁäÖȾʱ¼ä¹ý³¤ºÍ¶ÔseoÖ§³Ö½ÏµÍµÄÎÊÌâ¡£
ÏÖ´úseoÅÀ³æÒ»°ã·ÖΪÁ½ÖÖ£º
Ö§³Ö½âÎöjsµÄÅÀ³æ£¬ÕâÀàÊýÁ¿½ÏÉÙ£¬ÒÔGoogleΪ´ú±í£»
²»Ö§³Ö½âÎöjsµÄÅÀ³æ£¬´ó²¿·Ö¶¼ÊÇÕâÀ࣬»ù±¾É϶¼ÊÇ·ÇGoogleµÄËÑË÷ÒýÇæµÄÅÀ³æÁË¡£
¶ÔÓÚGoogleµÄÅÀ³æÀ´Ëµ£¬ÊÇ·ñʹÓÃSSRÔÚseo·½ÃæÎ޹ؽôÒª£¬ÒòΪ×îÖÕ¶¼¿ÉÒÔÅÀÈ¡µ½Õý³£µÄÒ³Ãæ¡£
¶ø¶ÔÓÚ·ÇGoogleµÄËÑË÷ÒýÇæÀ´Ëµ£¬ÎÒÃǾÍÐèÒªÀûÓÃSSR£¬ÏȽ«¾ßÌåµÄdom½ÚµãäÖȾ³öÀ´£¬¹©ÅÀ³æÅÀÈ¡¡£
¶øÇÒÕâÑùͬʱ»¹ÓÐÒ»¸öÓŵ㣺Óû§ÔÚÍøÒ³loadingµÄ¹ý³Ì¾ÍÖпÉÒÔ¿´µ½Ò³ÃæÄÚÈÝÁË£¬¶ø²»ÊÇÒ»¸ö¿Õ°×Ò³Ãæ¡£Èç¹û²»Ê¹ÓÃSSRµÄ»°£¬ÔÚÍøÒ³loading×ÊÔ´µÄ¹ý³ÌÖУ¬Ò»Ö±³ÊÏÖ¸øÓû§Ò»Æ¬¿Õ°×£¬Õâ¾ÍÓпÉÄÜÔì³ÉÓû§µÄÁ÷ʧ¡£

ÕâÕÅͼÊÇÎÒÔÚ50kb/sµÄÍøËÙÏ£¬·ÃÎÊbÕ¾µÚÒ»ÃëÖÓ¿´µ½µÄÄÚÈÝ£¬ÈôÊÇbÕ¾²»Ê¹ÓÃSSR¼¼ÊõµÄ»°£¬¿ÉÄܵȵ½Óû§Äܹ»¿´µ½ÊׯÁÄÚÈÝÖ®ºó£¬Ê±¼ä¶¼¹ýÈ¥ÁËÎåÁùÃë¡£
ÕâÀïÊÇÒ»¸ö¼òµ¥µÄʹÓÃSSRµÄNode²ã´úÂ룺
// ´úÂëÖÐʹÓÃÁËes6Óï·¨£¬²»¶®µÄ¿ÉÒÔÏÈѧϰһÏÂÈîÒ»·åÀÏʦµÄ¡¶ES6ÈëÃÅ¡·
// Õâ¸öµØ·½nodeÈç¹ûûÓÐʹÓÃbabelµÄ»°£¬import»á±¨´í£¬¿ÉÒÔÖ±½ÓʹÓÃrequire·½·¨Ìæ»»
import { renderToString } from 'react-dom/server';
import DemoContainer from 'containers/demo';
// ÒÔkoa2¿ò¼ÜΪÀý
module.exports = (ctx) => {
const props = {...};
// ÕâÀïµÄhtml¾Í´æ·Å×ÅÎÒÃÇ×é¼þrenderÍêÖ®ºóµÄdom½Úµã¡£
const html = renderToString(<Demo >);
// ÕâÀïÒÔ·µ»ØpugÄ£°åΪÀý£¬µÚ¶þ¸ö²ÎÊýÊÇÒª´«ÈëpugÄ£°åÖеÄÊý¾Ý
ctx.render('demo.pug', {
__props: JSON.stringify(props)£¬
html
});
};
|
ÕâÀïÊÇpugµÄ´úÂëÆ¬¶Î£º
// pug´úÂëÆ¬¶Î
body
#root
!{ html }
script.
window.__props = '!{ __props }' |
¸´ÖÆ´úÂëʹÓÃSSRµÄʱºòÒªÇмDZ£Ö¤Ç°¶ËºÍ·þÎñÆ÷¶ËµÄ×é¼þprops±£³ÖÒ»Ö£¬Òò´ËÕâÀïÎÒµÄϰ¹ßÊÇÔÚnode²ã½«propsÖ±½Ó´«Èëwindow¶ÔÏóÉÏ£¬È»ºóǰ¶ËµÄ×é¼þÖ±½Ó´Ówindow¶ÔÏó»ñÈ¡props¼´¿É¡£
SSRµÄʱºò£¬React×é¼þÖ»»áÖ´ÐÐcomponentWillMountºÍrenderÁ½¸öÉúÃüÖÜÆÚÓÃÀ´Éú³Édom½á¹¹£¬ÆäËûµÄÉúÃüÖÜÆÚÒÔ¼°·½·¨¹ÒÔØ¶¼ÊÇÔÚǰ¶ËÍê³ÉµÄ¡£
node²ãµÄ¹¦Äܲ»Ö¹ÒÔÉÏÕâЩ£¬ÕâÀï¾Í²»¹ý¶àÕ¹¿ª½éÉÜÁË¡£
ËäÈ»SSRµÄÓеãºÜ¶à£¬µ«ÊÇ»¹ÊÇÓÐ×ÔÉíµÄ±×¶ËµÄ¡£Ê¹ÓÃSSR¾ÍÒâζ×ÅÄãÓÃ×Ô¼º·þÎñÆ÷´úÌæÁËÒ»²¿·ÖÔ±¾ÊôÓÚÓû§¿Í»§¶ËµÄ¹¦ÄÜ£¬Òò´Ë»áÔì³É·þÎñÆ÷ÐÔÄܽµµÍ£¬³É±¾Ôö¸ßµÄ¿ÉÄÜ£¬Ïà¶ÔÓÚСÍŶӻòÕß×ʽð²»Ëã³äÔ£µÄÍŶӣ¬Òª½÷É÷Ñ¡ÔñÊÇ·ñʹÓÃSSR¡£
ǰºó¶Ëͬ¹¹
˵ÆðSSR£¬¾Í²»µÃ²»ÌáÒ»ÏÂǰºó¶Ëͬ¹¹ÎÊÌâ¡£
ͬ¹¹µÄÒâ˼Ϊǰ¶ËºÍnodeÓÃÖ´ÐÐͬһÌ×´úÂ룬ÊׯÁʹÓ÷þÎñ¶ËäÖȾ£¬½«äÖȾºÃµÄhtmlÖ±½Ó½»¸øä¯ÀÀÆ÷È¥äÖȾ£¬¿Í»§¶Ë¸ºÔð¼ÓÔØjs£¬Ö´ÐÐ×é¼þÊ£ÓàÉúÃüÖÜÆÚ£¬²¢¹ÒÔØ×Ô¶¨ÒåʼþµÈ¡£
Ò»Ì׺õÄǰºó¶Ëͬ¹¹´úÂë¿ÉÒÔ´ó·ù¼õÉÙÎÒÃÇά»¤´úÂëµÄ¹¤×÷Á¿£¬²¢ÇÒÓÐÊ®·Ö¸ßЧµÄÖ´ÐÐЧÂÊ£¬ÈçºÎÓÅÑŵØÊéдǰºó¶Ëͬ¹¹µÄ´úÂëÒ²ÊÇÒ»Ïî¼¼Êõ»î£¬ÐèÒªÎÒÃÇÌáǰ¹æ»®ºÃÒ»Ì×ǰ¶Ë¼Ü¹¹¡£
ÀýÈ磺
import React, { Component } from "react";
import { Provider } from "react-redux";
import ReactDOM from "react-dom";
import Loadable from "react-loadable";
import { BrowserRouter, StaticRouter } from "react-router-dom";
// server side render
const SSR = App =>
class SSR extends Component<{
store: any;
url: string;
}> {
render() {
const context = {};
return ( <Provider store={this.props.store}
context={context}> <StaticRouter location={this.props.url}>
<App /> </StaticRouter> </Provider>
);
}
};
// client side render
const CLIENT = configureState => Component
=> {
const initStates = window.__INIT_STATES__;
const store = configureState(initStates);
Loadable.preloadReady().then(() => {
ReactDOM.hydrate( <Provider store={store}>
<BrowserRouter> <Component />
</BrowserRouter> </Provider>,
document.getElementById("root")
);
});
};
export default function entry(configureState)
{
return IS_NODE ? SSR : CLIENT(configureState);
}
|
²¢ÇÒÔÚͬ¹¹·½Ã棬°¢ÀïÓÐÒ»Ì×½µ¼¶²ßÂÔ¡£µ±·þÎñÆ÷ѹÁ¦Õý³£Ê±£¬ÓÉ·þÎñÆ÷½øÐÐSSR£¬Ìá¸ßÓû§ÌåÑ飬µ±Óû§·ÃÎÊÁ¿¼¤Ôö£¬Èç˫ʮһʱ£¬·þÎñÆ÷»á×Ô¶¯½øÐнµ¼¶´¦Àí£¬node²»½øÐÐSSR£¬È«²¿×ª»»³É¿Í»§¶ËäÖȾ£¬¼õÇá·þÎñÆ÷µÄѹÁ¦¡£
Ñ¡Ôñ¿ò¼Ü
Á˽âÁËǰºó¶Ë·ÖÀëÖ®ºó£¬ÎÒÃǾÍÒª¶Ônode²ã½øÐпò¼ÜÑ¡ÔñÁË¡£
Ŀǰ±È½ÏÖ÷Á÷µÄ¿ò¼ÜÓÐÈý¿î£ºExpress¡¢koa1.0¡¢koa2.0¡£
¶ÔÓÚ³õѧÕßÀ´Ëµ£¬½¨ÒéÖ±½ÓʹÓÃkoa2.0½øÐÐÖмä²ãµÄѧϰºÍ¿ª·¢¡£
expressµÄȱµãÔÚÓÚ£ºÌ«ÖØ£¬ÓкܶàÄ£¿éÎÒÃÇ¿ÉÄܶ¼²»»áÓõ½£»
»Øµ÷µØÓü£¬¼´Ê¹Ê¹ÓÃPromiseÒ²Ö»ÄÜ»º½â¡£
koa1.0µÄȱµãÔÚÓÚ£º±ØÐëÅäºÏco¿âºÍgeneratorÀ´Ê¹Óã¬ÅäÖ÷±Ëö¡£
¶ø×Ô´ÓnodeÉý¼¶µ½7.6°æ±¾ÒÔÉÏ£¬Ôö¼ÓÁËasync/awaitÓï·¨ÌÇÖ®ºó£¬ÎÒÃǾͿÉÒÔ²»ÐèÒªÈκÎÈý·½¿â£¬Ö±½ÓÔÚÔÉúnodeÖÐʹÓÃkoa2µÄÓï·¨¡£koa2ÊÇexpressµÄÉý¼¶°æ¿ò¼Ü£¬ÀïÃæºÜ¶àÄ£¿éÊÇÖ±½Ó´ÓexpressÖÐÇ¨ÒÆ¹ýÀ´µÄ£¬µ«ÊÇÓÖ½«ÒÔǰ²»¾³£Óõ½µÄÄ£¿éɾ³ý£¬Ö»Óпª·¢ÕßÔÚÐèҪʹÓõÄʱºò²ÉÈ¡ÒýÈëÄÇôģ¿é¡£
²¢ÇÒkoa2ʹÓÃasync/awaitÓï·¨ÌÇÖ®ºó£¬´úÂë¿´ËÆ±ä³ÉÁËͬ²½Ö´ÐУ¬·Ç³£ÊʺÏǰ¶Ë¹¤³ÌʦµÄÂ߼˼ά¡£
ÕâÀïÊÇexpress¡¢promise¡¢koa2µÄÑùÀý´úÂ룺
// express°æ±¾
module.exports = (req, res) => {
const data1 = request.get('/api/demo1', (err,
res) => {
const data2 = request.get('/api/demo2', (err,
res) => {
const data3 = request.get('/api/demo3', (err,
res) => {
res.send(data1 + data2 + data3);
})
})
})
}
// promise°æ±¾
module.exports = (req, res) => {
new Promise((resolve, reject) => {
request.get('/api/demo1', (err, res) => {
resolve(res);
}).then(res => {
request.get('/api/demo2', (err, res2) => res
+ res2 );
}).then(res2 => {
request.get('/api/demo3', (err, res3) => res2
+ res3)
}).then((data) => {
res.send(data);
});
})
}
|
¿´ÆðÀ´ËäÈ»ÕûÆëÁËһЩ£¬µ«ÊÇÒÀȻʮ·Ö·±Ëö¡£
// koa1ºÍkoa2ÔÚд·¨ÉÏ»ù±¾Ïàͬ£¬Çø±ðÔÚÓÚkoa1ÔÚʹÓÃ֮ǰҪ¶Ôco¿âºÍgenerator½øÐз±ËöµÄÅäÖá£
// ÿһ¸öawaitµÄʱºò×îºÃ¼ÓÉÏtry-catch£¬·ÀÖ¹ÒòΪһ¸öÒì²½ÇëÇóʧ°Ü¶øµ¼ÖÂnode½ø³Ì±ÀÀ££¬ÕâÀï¼ò»¯ÁËд·¨¡£
module.exports = async (ctx) => {
const data1 = await request.get('/api/demo1');
const data2 = await request.get('/api/demo2');
const data3 = await request.get('api/demo3');
ctx.body = {
data: data1 + data2 + data3
};
}
|
koa2ÓÃÆðÀ´·Ç³£µÄÊæ·þ£¬ºÜÊʺÏǰ¶Ë¹¤³ÌʦµÄ˼άÂß¼¡£
ËäÈ»koa2µÄ´úÂë¿´ÆðÀ´Ïñͬ²½Ö´ÐУ¬µ«ÆäʵÔÚ±àÒëÖ®ºóÖ»ÊDZä³ÉÁËpromiseº¯Êý£¬awaitºóÃæËùÓеĴúÂë¶¼·Åµ½ÁËpromiseµÄ»Øµ÷ÖÐÖ´ÐÐÁË¡£
¿ª·¢½á¹¹
Ñ¡ÔñºÃÁË¿ò¼ÜÖ®ºó£¬Ê£ÏµľÍÖ»Óпª·¢ÁË£¬Ò»°ãµÄnode²ã¶¼×ñÑһϵÄĿ¼½á¹¹:
node
lib // ´æ·ÅµÚÈý·½²å¼þ
util // ´æ·Å×Ô¼º±àдµÄ¹¤¾ßº¯Êý
middleware // ´æ·ÅÖмä¼þ
routes // ´æ·Å·ÓÉ
controller // ´æ·Å·ÓÉ´¦Àíº¯Êý
app.js // node²ãÈë¿ÚÎļþ
»ù±¾µÄnode²ã¼Ü¹¹ÕâÀï¾Í½éÉܲ¶àÁË£¬Ê£ÏµÄǰ¶Ë²¿·ÖÒ²Ò»°ãÊÇ´ó¼ÒÊìϤµÄ¶«Î÷¡£
ǰ¶ËĿ¼½á¹¹:
public
static
src
js
components
containers
routes
stores
actions
reducers
pages
css/scss/less
static
ÕâÀï°´ÕÕÕý³£µÄReact¿ª·¢Â߼ȥ×ß¼´¿É¡£
×îºó»¹ÓÐһЩÆäËûµÄÎļþ¼Ð¿ÉÒÔ×ÔÓÉ·¢»Ó£¬±ÈÈçtemplate´æ·ÅÄ£°å£¬scripts´æ·ÅƽʱдµÄ½Å±¾µÈ¡£
ÅäÖÃ
Ò»¸öÏßÉÏÏîĿҪӵÓÐÁ½Ì×ģʽ¡ª¡ªÉú²úģʽºÍ¿ª·¢Ä£Ê½¡£
Éú²úģʽ¼´ÎÒÃÇÏßÉÏÔËÐл·¾³¡£
¿ª·¢Ä£Ê½¼´ÎÒÃÇÆ½Ê±±¾µØ¿ª·¢»·¾³¡£
Èç¹ûÓÐÐèÒªµÄ»°ÉõÖÁ¿ÉÒÔÅäÖøü¶àµÄ»·¾³¡£
ÕâÁ½ÖÖ»·¾³µÄÒªÇó²»Ò»Ñù£¬Òò´ËÎÒÃÇ»áÓÐÁ½Ì×ÅäÖÃÎļþ£¬½«²»Í¬µÄÅäÖÃÎļþ´«ÈënodeºÍwebpackÖУ¬¾Í¿ÉÒÔ¸ù¾ÝÅäÖõIJ»Í¬Æô¶¯²»Í¬»·¾³ÁË¡£
×Ô¶¯»¯²âÊÔ
×Ô¶¯»¯²âÊÔÔÚÒ»¸ö³ÉÊìµÄ´óÐÍÍøÕ¾Öбز»¿ÉÉÙ¡£
ËäȻĿǰÒòΪǰ¶ËÁìÓòµÄ¿ìËÙÔö³¤£¬ÒµÎñ²ãµÄ×Ô¶¯»¯²âÊÔÒ²ÒòΪҵÎñµÄ¿ìËÙµü´ú¶ø±äµÃ²»Îȶ¨£¬µ«ÊÇһЩ»ù´¡µÄ²âÊÔ»¹ÊǺÜÓбØÒª×öµÄ¡£
ƽʱ¿ª·¢µÄʱºòÒª×öºÃÀà¿âµ¥Ôª²âÊÔµÄ×Ô¶¯»¯ÒÔ¼°UI×é¼þµÄµ¥Ôª²âÊÔµÄ×Ô¶¯»¯¡£
ÕâЩ²âÊÔÎļþ×îºÃ´æ·ÅÔÚµ¥¶ÀµÄtestĿ¼Ï£¬»òÕßÔÚÿһ¸ö»ù´¡UI×é¼þĿ¼Ï¼ÓÉÏcomponent.test.jsÎļþ£¬ÕâÑùÆô¶¯²âÊÔµÄʱºò»á×Ô¶¯ÕÒµ½.testÎļþ½øÐвâÊÔ¡£
ÿ´ÎÏîÄ¿ÉÏÏß֮ǰ¶¼Òª½øÐÐÒ»´Î¼¯³É²âÊÔ£¬²âÊÔ·ÓÉÊÇ·ñÕý³££¬webpack´ò°üºÍnodeÄ£¿é°²×°ÊÇ·ñÕý³££¬Ä£ÄâÓû§µÇ¼·ÃÎʵȲÙ×÷ÊÇ·ñÕý³£¡£
ż¶ûÎÒÃÇ»¹ÐèÒª×öѹÁ¦²âÊÔºÍÈÝÔÖ²âÊԵȡ£
¶ÔÓÚ³õѧÕßÀ´Ëµ£¬²âÊÔÊÇÒ»¸öºÜÖØÒªµÄ¸ÅÄîºÍϰ¹ß£¬Æ½Ê±Òª¶àдһдµ¥Ôª²âÊÔ¡£
|