±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜǰ¶Ë½¥½øÔöÇ¿µÄÒ³ÃæäÖȾ·½°¸£¬¼´¡°Â·ÓÉ·ÖÀë+Ô¤¾²Ì¬»¯+WebViewÔ¤´´½¨¡±·½°¸£¬À´Ìæ´úÄ£°åͬ²½äÖȾ·½°¸£¬²¢²ÉÓù¤³Ì»¯µÄ·½Ê½½«ÄÜÁ¦´ò°üϳÁ¸³ÄܲúÆ·Ïß¡£
±¾ÎÄÀ´×ÔÓÚ°Ù¶ÈÖ±²¥Ñз¢²¿ ,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼ÍƼö¡£ |
|
µ¼¶Á£º´Ó´Ö²Úµ½¾«Ö£¬´Ó¼òµ¥µ½¸´ÔÓ£¬È«Çò»¥ÁªÍøWeb App£¨ÍøÒ³Ó¦Óã©Æ½¾ùÌå»ýÒÑÔöѹµ½1.6Mb£¬Ëæ×ÅÒôÊÓÆµµÈ¸»Ã½ÌåÄÚÈݵÄÁ÷Á¿³ØÅòÕÍ£¬ÖÕ¶ËÉ豸ÉϵÄÓû§¶ÔÍøÒ³×°ÔØËÙ¶ÈÓÈÆäÃô¸Ð¡£Ò³Ãæ²»ÄÜ×öµ½Ã뿪£¬¾Í»áÓдóÁ¿Óû§Ñ¡ÔñÀ뿪¡£ÖØÊÓ²¢¸ÄÉÆÍøÕ¾ÐÔÄÜ£¬ÓÅ»¯¼´Ê±ÍøÒ³×°ÔØÊ±¼ä£¬¼ÓËÙ¼´Ê±ÍøÒ³ÔÚä¯ÀÀÆ÷ƽ̨ÖÕ¶Ë״̬չÏÖ£¬½ø¶ø¿ÉÒÔ´øÀ´ÍøÕ¾Á÷Á¿Ôö³¤¡£
Ò»¡¢±³¾°
ÔÚÖ±²¥ÒµÎñÂ䵨µÄ³¡¾°ÖУ¬¹¹½¨´òÉÍ·þÎñ¾«Éñ£¬´´Ôì·ç¸ñ¶àÑù£¬ÁîÈËÄÑÍüµÄÔËÓª»î¶¯ÐÎʽ£¬ÒÔÂú×ãÄ¿±êÓû§ÐèÇó¡£½øÐÐÓÐЧµÄ·þÎñ´´Ð£¬±£ÕÏH5·þÎñÆ·ÖÊ£¬¿ØÖÆ·ÃÎÊÐÔÄÜ£¬¼°Ê±»¯½â½ðÖ÷ÇéÐ÷ΪÉÌÒµ¼ÛÖµ£¬ÖÆÔìÌØÐ§¾ªÏ²£¬Á÷³©µÄÓû§ÌåÑ飬ÓÐÀûÓÚÓ®µÃÓû§¶Ôƽ̨µÄ×ðÖØ£¬ÌáÉýÆ½Ì¨Æ·ÅÆÆøÖÊ£º
1. ÓÅ»¯·ÃÎÊÌåÑ飺ÓÅ»¯H5ÊׯÁÐÔÄÜ£¬Î§ÈÆÌáÉýÓû§·þÎñ¸ÐÊܺÍÌáÉý¿ª·¢Õß¹¤×÷ЧÂʽøÐд´Ð£¬Ì½Ë÷Web×·¸ÏÔÉúµÄÌåÑ鴴У»
2. ¼ÓËÙÐèÇó±Õ»·£º½â¾öH5Ò³ÃæÂ·ÓÉÓëÊý¾Ý½Ó¿ÚñîºÏµÄÎÊÌ⣬ʵÏÖH5·þÎñ×ÔÖΣ¬ÊÍ·ÅÒµÎñ¶ÔWeb²úÆ·ÐÎ̬µÄÍúÊ¢ÐèÇó£»
3. »ù´¡ÉèÊ©½¨É裺ʹÓù¤³Ì»¯ÊֶγÁµí¹«¹²Í¨ÓõÄǰ¶Ë»ù´¡ÉèÊ©£¬ÈÃǰ¶Ë×éÖ¯¸üÃô½ÝµÄÖ§³Ö¿çÒµÎñµÄÈËÁ¦µ÷Å䣬¼¼Êõ¸³Äܸü¶à²úÆ·Ïߣ»
Î§ÈÆÒÔÓû§ÎªÖÐÐĵŦÄÜÍêÉÆµÄÌåÑ飬ÒÔ¿Í»§ÎªÖÐÐĵÄÉÌÒµ¼ÛÖµµÄת»¯¡£ÌáÉýH5·þÎñÆ·ÖÊ£¬·¢»ÓÏÖ´úä¯ÀÀÆ÷DZÄÜ£¬¸³ÄÜ´«Í³WebеĽâ¾ö·½°¸¡£
ÀúÊ·¼Ü¹¹µÄÔÒò£¬H5Ò³ÃæµÄ¼ÓÔØ¹ý³ÌÊÇServerÏòSmartyÄ£°å×¢Èëjson_encodeºóµÄ½Ó¿ÚÖ÷Êý¾Ý£¬ÏìÓ¦¸øä¯ÀÀÆ÷´øÓÐÒ³ÃæÍêÈ«JSONÊý¾ÝµÄÒ³Ãæ£¬È»ºóÔÚä¯ÀÀÆ÷¶ËÖ´ÐÐJavaScript£¬×îÖÕPaint¸øÓû§£¬Á÷³ÌÈçÏÂͼ£º

¡÷H5ÓÅ»¯Ç°µÄ¼ÓÔØÓëäÖȾÁ÷³Ì

¡÷H5ÊׯÁ¹Ø¼ü·¾¶ºÄʱ²ð½â
Á½¸öÓ°ÏìH5ÊׯÁÄÚÈÝ£¨FCP£¬First Contentful Paint£¬Ê×´ÎÄÚÈÝ»æÖÆ£©µÄ¹Ø¼ü·¾¶Îª£º
1. ÍøÂçºÄʱ£ºÒÀÀµServer¶ËÊý¾Ý²éѯ¼°Ä£°å±àÒ룬µ±Êý¾Ý²éѯÂýʱÑÓ³ÙÁËÊ××Ö½Úµ½´ï£¨TTFB£¬Time
To First Byte£¬Ê××Ö½Úʱ¼ä£©¡£
2. ÄÚºËäÖȾºÄʱ£ºÒÀÀµJavaScriptÖ´ÐжÁÈ¡Ò³ÃæÖ÷Êý¾Ý²¢Éú³ÉÍêÈ«µÄDOM½á¹¹¡£
Òò´Ë£¬ÎÒÃÇÕë¶ÔÐÔµØÉè¼Æ²¢ÊµÊ©ÁË¡°Â·ÓÉ·ÖÀë+Ô¤¾²Ì¬»¯+WebViewÔ¤´´½¨¡±µÄ·½°¸£¬¸Ä½øºóµÄÒ³Ãæ¼ÓÔØÓëäÖȾÁ÷³ÌÈçÏÂͼ£º

¡÷H5ÓÅ»¯ºóµÄ¼ÓÔØÓëäÖȾÁ÷³Ì
¶þ¡¢Â·ÓÉ·ÖÀë
·ÓÉ·ÖÀë֮ǰH5Ò³ÃæµÄURLÓÉServer·ÖÅ䣬ǰ¶Ë¸ºÔð±àдTPLÄ£°å²úÎTPLÓë×îÖÕURLµÄ¶ÔÓ¦¹ØÏµÔÚServerͨ¹ýÅäÖÃÎļþ×öÓ³É䣬ÈÕÒæ±©Â¶³öÆô¶¯¿ª·¢Âý£¬Ò³ÃæºóÆÚά»¤½»½Ó¹µÍ¨³É±¾¸ßµÄÎÊÌâ¡£
ËùÒÔÎÒÃÇÏ£ÍûÒ³ÃæÂ·Óɹ淶»¯£¬ÈÃǰ¶Ë¿ª·¢Õß×ÔÖ÷¿ØÖÆÒ³ÃæÈë¿Ú¸ñʽ£¬Èúó¶Ë¿ª·¢Õ߸üרעÓÚAPI½Ó¿ÚÊý¾ÝÂß¼¡£Òò´Ë£¬ÎÒÃÇÉè¼ÆÁËǰ¶Ë·ÓÉ·ÖÀë·½°¸£¬Ô¼¶¨ÁËÒ³ÃæURLÓëÒ³ÃæÔ´´úÂëĿ¼ӳÉä¹ØÏµ£¬¹æÔòÈçÏÂͼ£º

¡÷Ô¤¶¨Ê½URL·Óɹ淶
NGINXÖ±½ÓÏìÓ¦Ô¤¾²Ì¬»¯µÄHTMLÎļþ£¬Ê××Ö½Úµ½´ï²»ÒÀÀµÊý¾Ý²éѯÓëÄ£°æ±àÒë¡£
Èý¡¢Ô¤¾²Ì¬»¯
ǰ¶Ë·ÓÉ·ÖÀëÖ±½ÓÔÚNGINX´úÀí²ã·µ»ØHTMLÎļþ£¬µ«Ã»ÓÐÒ³ÃæÍêÈ«äÖȾÐèÒªµÄÊý¾Ý£¬ÔÚÖ´ÐÐAJAXÇëÇóûÓзµ»ØÖ®Ç°£¬ÐèÒª¹æ±ÜÒ³ÃæÒ»Ö±´¦ÓÚ°×ÆÁ»òÈ«¾Öloading״̬£¬ÌáǰFCPµÄʱ¼ä¡£
ÎÒÃDzÉÓÃÁËÔ¤¾²Ì¬»¯Ò³ÃæµÄ·½°¸¡£Ô¤¾²Ì¬»¯²»Ïñ·þÎñÆ÷äÖȾÄÇÑù¼´Ê±±àÒë²ú³öÍêÈ«¾²Ì¬»¯µÄ
HTML£¬ËüÖ»ÔÚ¹¹½¨Ê±ÎªÁËÌØ¶¨µÄ·ÓÉÉú³ÉÌØ¶¨µÄ¼¸¸ö¾²Ì¬Ò³Ã棬ÎÒÃÇ¿ÉÒÔͨ¹ý webpack²å¼þ½«Ò»Ð©Ìض¨Ò³ÃæÔÚ±àÒëʱ¾Í×¢ÈëDOM½á¹¹£¬ÕâÑù×öÓм¸¸öºÃ´¦£ºµÚÒ»Ëõ¶ÌÒ³Ãæ°×ÆÁʱ¼ä£¬µÚ¶þÏà¶ÔÓÚ·þÎñÆ÷¶ËäÖȾ½ÚÊ¡ÔÆ»ù´¡ÉèÊ©×ÊÔ´³É±¾£¬µÚÈýÊä³ö¸øËÑË÷ÒýÇæÅÀÈ¡Ò³ÃæÍ¨ÓÃÄÚÈÝ¡£
½áºÏʵ¼ÊÓ¦Óó¡¾°ºÍÊÐÃæÉÏÖ÷Á÷µÄÔ¤¾²Ì¬»¯·½Ê½£¬×îÖÕÎÒÃÇ¿ª·¢ÁË»ùÓÚReactDomServerÔÉúµÄ·þÎñ¶ËäÖȾÄÜÁ¦µÄwebpack²å¼þ£¬ÌáÉýÔ¤¾²Ì¬»¯ÐÔÄܺÍЧÂÊ¡£
ͨ¹ýwebpack²å¼þϵͳ»ñȡÿ´Î¹¹½¨µÄcompilationÉÏÏÂÎÄ£¬Í¨¹ýhtml-webpack-pluginµÄbefore
AssetTagGeneration hook»ñÈ¡µ±Ç°Ò³Ãæbundle£¬afterTemplateExecution
hook»ñÈ¡µ±Ç°Ò³Ãæ±àÒëºóµÄÄ£°åHTML£¬Í¨¹ýevalÖ´ÐÐbundleµ¼³öµÄÕû¸öÒ³ÃæAPPÄ£¿é£¬Í¨¹ýReactDomServer¶Ôµ¥Ò³Ó¦ÓõÄÿ¸ö·Óɲú³öAPP
HTMLÓëÄ£°åHTMLºÏ²¢ºóÂäÅÌΪԤ¾²Ì¬»¯µÄHTML¡£
H5Ô¤¾²Ì¬»¯µ÷ÓÃÐòÁÐÈçÏ£º

¡÷H5Ô¤¾²Ì¬»¯µ÷ÓÃÐòÁÐ
Ò³ÃæÈë¿Úexport APP£º
module.exports
= (locals) =>
Promise.resolve(locals.preRender({id: containerId,
main: App})); |
»ùÓÚNode.js»·¾³£¬´´½¨JSDOMʵÀýÌṩä¯ÀÀÆ÷ËÞÖ÷»·¾³£¬Ê¹ÓÃReactDOMServer½«×é¼þäÖȾΪ¾²Ì¬HTML±ê¼Ç¡£Ê¹ÓÃ×ÔÑеÄÔ¤¾²Ì¬»¯webpack²å¼þÌæ»»html-webpack-plugin£¬²¢²»Ôö¼ÓеıàÒë½×¶Î¡£
Webpack²å¼þÓëÊÐÃæÉÏÖ÷Á÷µÄÔ¤¾²Ì¬»¯·½·¨×ö¸ö¶Ô±È£¬Èç»ùÓÚÎÞÍ·ä¯ÀÀÆ÷µÄ¡¢»ùÓÚ±¾µØÆô¶¯HTTP Server¡¢Í¨Óõľ²Ì¬Õ¾µãÉú³É¹¤¾ßµÈ¡£½á¹ûÈçÏ£º

½á¹ûÈçÏ£º
×ۺ϶Աȣ¬ÎÒÃǵÄÔ¤¾²Ì¬»¯ËÙ¶È×îÓÅ£¬¿ÉÔÚ¿ª·¢½×¶Îʵʱ¿´µ½Ô¤¾²Ì¬»¯½á¹û£¬Ëù¼û¼´ËùµÃ£¬·½±ãÑз¢µ÷ÊÔ£¬²»ÐèÒªÔö¼ÓеıàÒë½×¶Î¡£
×ñѾ¡¿ÉÄÜÈÃÒ³Ãæ¹Ç¼ÜÄÚÈÝÏÔʾ×îÖÕÄÚÈݵÄÔÔò£¬²ú³öÔ¤¾²Ì¬»¯µÄHTMLÎļþ£¬¶ÔÓÚչʾÓû§¸öÐÔ»¯ÄÚÈݵĶ¯Ì¬×é¼þ£¬ÈÔÐèÒªµÈ´ýÒ»¸öAJAXÇëÇóµÄʱ¼ä£¬Õⲿ·Ö×é¼þÔÚÖ´ÐÐAJAXÇëÇóûÓзµ»ØÖ®Ç°£¬ÎÒÃDzÉÓÃÁË×é¼þ¼¶±ðµÄSkeleton·½°¸£¬ÒÔ±£Ö¤ÊׯÁʹÓÃͨÓÃÄÚÈÝ+¶¯Ì¬×é¼þ¹Ç¼ÜÌî³ä£º
1. ¾²Ì¬×é¼þ¿ª·¢Ê±¶¨Ò幫¹²²¿·Östate£¬Ìî³äÒ³Ãæ¹«¹²²¿·ÖÄÚÈÝ£¬´úÂëʾÀý£º
this.state =
{
// Ô¤¾²Ì¬»¯»·¾³µÄ±ê¼Ç£¨±àÒë½×¶ÎÔ¤¾²Ì¬»¯²å¼þ×¢È룩
isPreRender: window.isPreRender,
// Ò³Ãæ¹«¹²ÄÚÈÝ
rights: [ // È¨Òæ
{
dataIndex: 'cameraAction',
icon: require('../../../../assets/cashVideoActivity /ricon_1.png'),
button: require('../../../../assets/ cashVideoActivity/do_shoot.png'),
text: <span className='dt-text'>ÒÚÍò½±½ð£¬<br
/>È«Íø×î¸ß£¡</span>,
action: {} // ͨ¹ý dataIndex ÔÚ½Ó¿ÚÊý¾ÝÀï»ñÈ¡
}, {
dataIndex: 'renzhengAction',
icon: require('../../../../assets/cashVideoActivity/ ricon_2.png'),
button: require('../../../.. /assets/cashVideoActivity/ do_auth.png'),
text: <span className='dt-text' >¼ÓVÈÏÖ¤£¬<br
/>Ê®±¶ÊÕÒæ£¡</span>,
action: {}
}
]
}; |
2. ¶¯Ì¬×é¼þ¸ù¾Ýwindow.isPrerender±ê¼Ç×öÔ¤¾²Ì¬»¯»·¾³Óëä¯ÀÀÆ÷äÖȾ»·¾³Á½ÖÖ»·¾³ÏµÄÏìÓ¦£¬´úÂëʾÀý£º
// ×é¼þ¹Ç¼Ü¿ÉʹÓà http://danilowoz.com/ create-content-loader/
ÔÚÏßÉú³É
import ContentLoader from 'react-content-loader';
const GrowthCardLoader = props => ( <ContentLoader
uniquekey="growth-card-loader"
animate
height={68}
width={320}
speed={1}
primaryColor="#333"
secondaryColor="#333"
{...props} > <rect x="0"
y="0" rx="10" ry="10"
width="320" height="68" />
</ContentLoader>
);
// ×é¼þ»·¾³ÏìÓ¦ºËÐÄÂß¼
{
window.isPreRender
? ( <GrowthCardLoader
className="growth-card-swiper-slide-loader"/>
)
: ( <Õýʽ×é¼þ ...
)
} |

¡÷¶¯Ì¬×é¼þÔÚÁ½ÖÖ»·¾³ÏµÄÏìÓ¦Á÷³Ì
¾¹ýÔ¤¾²Ì¬»¯ºóµÄÒ³ÃæÊׯÁÄÚÈÝ£¨FCP£©²»ÒÀÀµJSÖ´ÐÐÍê±Ï£¬Í¨¹ýÒ»´ÎÊ×´ÎäÖȾ£¨FP£¬First Paint£¬Ê״λæÖÆ£©¼´¿ÉÏòÓû§Õ¹Ê¾³öÒ³Ãæ¹«¹²ÄÚÈÝ£¬´ýAJAX·µ»ØºóÌæ»»³ÉÍêÈ«äÖȾµÄÒ³Ãæ¡£
ËÄ¡¢WebViewÔ¤´´½¨
ÔÚAPPÆô¶¯Ê±Á¢¼´³õʼ»¯ºÃWebView×é³ÉµÄ»º´æ³Ø£¬±£Ö¤¼ÓÔØÃ¿¸öURLʱʡȥÁËWebView³õʼ»¯µÄʱ¼ä£¬²¢ÀûÓÃÉÏÔ¤¾²Ì¬»¯µÄHTML»º´æ£¬×îÖÕÊ¹Ò³ÃæÎÞ°×ÆÁ¼ÓÔØÌ¬¡£
Îå¡¢ÕûÌåÊÕÒæ


ÓÅ»¯Ð§¹û¿É¸ÐÖª¶Ô±È£¨×óÐÂÓҾɣ©
äÖȾÁ÷³Ì¸Ä½øÇ°ºó¶Ô±È£º

¡÷äÖȾÁ÷³Ì¸Ä½øÇ°ºó¶Ô±È
Ö±½ÓÊÕÒæ£º

¡÷H5ÐÔÄÜÓÅ»¯Ö±½ÓÊÕÒæ
Ô¤¾²Ì¬»¯ÊÕÒæ£º
1. ·¢²¼Ç°¶ËͨÓøßÐÔÄÜÔ¤¾²Ì¬»¯²å¼þ£»
2. ÌṩÁ˹¤³Ì»¯ÒýÈë¹Ç¼ÜÆÁ£¨Skeleton£©µÄ·½Ê½¡£
·ÓÉ·ÖÀëÊÕÒæ£º
1. Ô¼¶¨Ê½µÄÒ³ÃæURL·¾¶£¬¼õСά»¤³É±¾£¬¼õÉÙǰºó¶Ë¹µÍ¨³É±¾£»
2. BrowserRouterÖ§³Ö£¬Õë¶ÔSPA£¨Single Page Application£©Ò³Ã泡¾°£¬Ö§³ÖÁË»ùÓÚhistory
APIµÄBrowserRouter·ÃÎÊ·½Ê½£»
3. ɾ³ýÄ£°æÅäÖùÜÀí²½Ö裬¶ÔÓÚºó¶Ëͬѧ¿ÉÒÔ¸ü¼ÓרעÓÚÊý¾ÝÂß¼¡£
Áù¡¢¹¤³Ì»¯
ǰ¶Ë×éÖ¯´ÓС×÷·»·¢Õ¹µ½ÁË´óǰ¶Ëʱ´ú£¬Ç°¶Ë¹¤³Ì¿ª·¢Ä£Ê½Êܵ½ÁËеÄÌôÕ½ÈçÄ£¿é»¯¡¢×é¼þ»¯¡¢¹æ·¶»¯¡¢×Ô¶¯»¯µÈ¡£
ǰ¶Ë¹¤³Ì±¾ÖÊÉÏÊÇÈí¼þ¹¤³ÌµÄÒ»ÖÖ¡£Èí¼þ¹¤³Ì»¯¹Ø×¢µÄÊÇÐÔÄÜ¡¢Îȶ¨ÐÔ¡¢¿ÉÓÃÐÔ¡¢¿Éά»¤ÐԵȷ½Ãæ£¬×¢ÖØ»ù±¾µÄ¿ª·¢Ð§ÂÊ¡¢ÔËÐÐЧÂʵÄͬʱ£¬Ë¼¿¼Î¬»¤Ð§ÂÊ¡£²ÉÓù¤³Ì»¯µÄ˼Ïë¹ÜÀíǰ¶Ë¹¤³Ì·¶³ëµÄ¸÷»·½Ú£¬×ª»¯ÌôսΪ»úÓö£¬´´½¨Ö§³Ö¶àÍŶÓÐ×÷µÄ¿ª·¢Á÷£¬½¨Á¢¼áʵµÄ¹¤ÒµÇ°¶Ë»ù´¡ÉèÊ©¡£
Æß¡¢×ܽá
Web H5ÐÔÄÜÓÅ»¯²»ÔÙÊÇÖ»×·ÇóÒ»Á½¸öÒ³Ãæ×°ÔØËÙ¶ÈÖ¸±êµÄÌáÉý£¬¸ü¿¼ÑéÒ»¸öǰ¶ËÍŶӵÄ×ÛºÏÄÜÁ¦£º
1. ¶¥²ãÉè¼ÆÄÜÁ¦
ÔÚÉè¼ÆÊ±Ìáǰ²¼¾Ö£¬Ñ°ÕÒÍ´µãÒ»»÷¼´ÖУ¬²¢¸ù¾Ýʵ¼ÊÇé¿ö²»¶Ïά»¤¡¢½øÐе÷Õû¡¢ÓÅ»¯¡¢±£Ö¤¹æ·¶ÓÐЧÐÔ£»
2. ¹¤³Ì¹ÜÀíÄÜÁ¦
ÓøüÓÐЧµÄ¹¤×÷·½·¨ºÍÊÖ¶Îʹȫ¾Öʵ¼ù×îÓÅ£¬½ÚÔ¼³É±¾²¢ÌáÉýÑз¢Ð§ÂÊ£»
3. ÎÄ»¯´´ÐÂÄÜÁ¦
³ÖÐøÑ§Ï°ÊÇ×îºÃµÄ´´Ð°취£¬Ê¼ÖÕ±£³Ö×ÅÓëʱ¾ã½øµÄ»ù±¾¼ÛÖµ¹Û£¬Ã¿Ò»´ÎÆõ»ú¶¼¿ÉÄÜ»á´Ù³ÉÒ»´Î³É¹¦µÄ´´Ð£¬´´Ôì¶ÀÌØ¼ÛÖµ¡£
WebÉú̬¼¼ÊõÈÕÐÂÔÂÒ죬ÐÔÄÜÊÇÈÕÇ÷¹æ·¶»¯µÄÁìÓò£¬ÈçPWA/¿ìÓ¦ÓÃ/С³ÌÐò£¬±ê×¼»¯Êdz¹µ×½â¾öƵ·¢ÎÊÌâ¡¢¸ÄÉÆ¹¤×÷ÖÊÁ¿µÄºÃ°ì·¨¡£
|