极致 PCWeb 性能 图说舌尖上的脚本 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yesvods
V2EX    前端开发

极致 PCWeb 性能 图说舌尖上的脚本

  •  
  •   yesvods
    yesvods 2017-06-18 17:59:36 +08:00 1771 次点击
    这是一个创建于 3119 天前的主题,其中的信息可能已经有所发展或是发生改变。

    作者Jogis

    原文链接: https://github.com/yesvods/Blog/issues/11

    转载请注明原文链接以及作者信息

    我们通过分析主流浏览器 Chrome,来了解一个脚本从无到有再到运行作用,到底经历了什么。以下将会用lodash为作为例子,浏览器的脚本生命周期。

    HTML 解析

    在浏览器中,在 HTML 解析过程中,当解析到带有srcscript标签,便会即刻调度网络模块队列,网络模块在有空余请求线程时,会即刻执行队列的请求。

    举个栗子:

    <script> console.log("Hello Tmall") </script> <script src="lodash.js"></script> 

    浏览器会优先发起lodash.js的请求,而后执行console.log脚本。

    接收脚本数据

    了解 TCP/IP 协议的童鞋都知道,网络服务器存在慢启动机制,数据包会以递增方式发送至客户端(浏览器),一个 500KB 左右的lodash.js会被以十多个包送达:

    也许有童鞋已经发现,为了极致的性能,Chrome 在接收到首个数据包时,已经开始脚本的解析工作。

    解析&编译&执行

    随后,脚本的一系列连贯的生命周期,最后会发出一个 load事件,表明脚本已就绪。

    小结

    总体看起来,脚本的确会阻塞后续 HTML 解析,一个完整生命周期大概是酱紫的。

    MultiScript

    那么,当多个脚本并行加载,时间序列是怎样的呢:脚本下载会并行发起,接收数据交替进行。而解析、编译、执行,会根据 HTML 声明顺序,串行进行

    react react-dom lodash并行加载为例,整个时序是酱紫的:

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     798 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 20:21 PVG 04:21 LAX 12:21 JFK 15:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86