SlideShare a Scribd company logo
以下人群 请勿 阅读此系列 PPT 输入地址, 3 秒之后窗口仍然空白一片,但没有感觉 任何不适 不相信 优化 网站性能会带来更多的 效益 不认为页面速度 提升 能够带来客户 满意度 提升 压根就不认为优化网站性能可以 改变命运
Section II Dynamic JS Loader Ctrip  前端开发  feifeipan Email : feifeipan59@gmail.com Section I  请参看   高性能网站建设
思考…… 我们真的认为性能 很重要 吗?
发现…… 亚马逊发现,网站每慢 0.1 秒等于丢失 600 万美元 的销售额。 Google 则发现,网页载入慢 0.5 秒会导致 20% 的用户 流失。 Ctrip 发现了吗 ?
思考…… 我们怎么 引用 JS 文件?
曾经(或现在)
总是认为… 随便 找个地儿放一下 JS , 只要页面 不报错 就行啦!
结果总是…… 曾经的痛
结果总是…… 为啥总是空白呢? 空白还是空白 !!
因为…… 浏览器在解析到 <body> 之前,不会 渲染页面 任何部分。 无论是内嵌还是外链,页面的下载和渲染都必须停下来 等待脚本执行完成 。
解决方案 将脚本放在底部 减少脚本文件的大小 限制 HTTP 请求数
思考…… JS 真的需要在页面渲染的时候 一起加载 吗? JS 可以在 需要的时候 才加载吗? JS 可以先 缓存 好,等需要的时候再 执行 吗?
无阻塞脚本 在页面加载完成之后才加载 Javascript 代码
无阻塞的脚本之  延迟脚本 延迟的脚本  <script src=‘file.js’  defer ></script> defer 表明该脚本不会修改 DOM,  因此能 安全地延迟 执行。
无阻塞的脚本之  延迟脚本 延迟的脚本  {  测试结果   }  注 : firefox3.6 不支持 defer 属性 只有 IE6.0+ 和 Firefox3.5 支持,其余浏览器均不支持
动态脚本元素 无阻塞的脚本之 动态脚本元素 在页面中 创建脚本节点 ,并添加到 DOM 中
动态脚本元素 无阻塞的脚本之 动态脚本元素 可以 实时监听 到加载结束,添加 回调函数
动态脚本元素  {  测试结果   } 无阻塞的脚本之 动态脚本元素 无论何时启动下载,文件的下载和执行过程 不会阻塞 页面其他进程 。 注:加在 head 中比在 body 中要可靠,防止 IE 抛出“操作已中止”的错误
XMLHttpRequest 脚本注入 无阻塞的脚本之 XMLHttpRequest
XMLHttpRequest 脚本注入 {  测试结果   } 无阻塞的脚本之 XMLHttpRequest 兼容所有浏览器 下载 JS 代码但是不立刻执行 不能跨域!
似乎…… “ 动态脚本元素 ”是一剂良药 简单的情况 下可以轻松的解决问题
可是…… 现实往往比预期 要 复杂 、 更有 挑战性
再思考…… 有两台服务器,其中一台备用。如何让客户能 最快 加载到 JS 文件? 如何既能并发请求到 JS 文件,又能让他们按照 正确的顺序执行 ?
Ctrip 的实际情况 有两台服务器,速度和稳定性能如下 域名 c-ctrip.com ctrip.com (备用) 速度 {speed} 稳定性 {stability}
Ctrip 的前端初步策略 加载 c-ctrip 站点的文件 fileN.js 1000ms 后检测是否加载到 继续加载后续 fileN.js 加载备用 ctrip 站点的文件 fileN_bak.js 是否页面 JS 全部加载完毕 否 是 否
Ctrip 实现方案 方案一 先用”动态脚本加载”从 c-ctrip 加载 file.js 。 如果超时没有加载到,则从备用服务器 ctrip 上获取 file_bak.js 。
Ctrip 实现方案 方案一  { 测试结果 } try   { 在请求 file_bak.js 的同时, file.js 也请求到了。 } catch (error){ throw ( 额外 的 http 请求 执行 两遍 JS 函数 ) }
Ctrip 实现方案 方案二 先用”动态脚本加载”从 c-ctrip 加载 file.js 。 如果超时没有加载到, 则删除这个 DOM,  从备用服务器 ctrip 上获取 file_bak.js 。
Ctrip 实现方案 方案二  { 测试结果 } try   { if( 浏览器是 Firefox){   即使删除脚本,浏览器 不会停止请求 } } catch (error){ throw ( 额外 的 http 请求 执行 两遍 JS 函数 ) }
Ctrip 实现方案 方案三 优化方案二中的 Firefox 。在 JS 文件头部先判断是否已经被加载 ; 如果加载过,则抛出一个错误,不再执行。
Ctrip 实现方案 方案三  { 测试结果 } try   { 多个文件同时加载 } catch (error){ throw ( 额外 的 http 请求 不能保证 JS 的执行顺序 ) }
方案四 使用  prefetch  预加载 文件 不阻塞任何下载,并支持并行下载。 <link  rel=“prefetch”  href=“file.js” onload =“registerScript()”> Ctrip 实现方案
Ctrip 实现方案 方案四  { 测试结果 } try   { 使用 prefetch 预加载 } catch (error){ throw (   目前只支持 html5 ,未来可用。 ) }
方案 5  ( V5 ) 原则: 将下载和执行分离 并行下载,不阻塞其他元素下载。 不阻塞页面渲染,在需要的时候才执行脚本。 Ctrip 实现方案
方案五 new Image or object  进行预加载 Ctrip 实现方案
方案五 判断前一个依赖文件是否执行,以此来控制当前 JS 的执行时间。 Ctrip 实现方案
方案五  { 测试结果 } 目前为止, 业内完美 的解决方案 Ctrip 实现方案
让我们跟数据说说话
以下数据由 webpagetest.org 测试得来 环境
发送请求截图 并行发送 js 文件的请求,将文件先缓存下来 根据需要的 js 执行顺序,确保执行顺序 第一次加载 第二次加载
第一屏显示对比
页面加载对比 Before After
Before
After
结论 “ JS 下载和执行分离 ”带来了明显的变化 页面开始渲染时间从 7.4s 降低到 1.3s 页面加载完成时间从 8.8s 降低到 4.3s
参考资料 velocity- efws.ppt  by Steve Souders “ High Performance Javascript” by  Nicbolas C. Zakas Labjs  by Kyle Simpson Webpagetest.org
感谢…… Steve Souders 的优化思想 @nyanhan , @ 流光奕羽提供的思路和方案 @ctrip 前端开发 JS 组 @ 水漫三楼  @Jackie
 

More Related Content

PDF
twMVC#19 | opserver監控服務的解決
PPTX
初探 Elastic Observability 的實踐方法
KEY
Beyond rails server
PPTX
如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)
PDF
前端爆肝之旅+React上山前的小專案心得分享
PDF
架構這件事 - Azure 可以幫助什麼 - 如何選擇使用什麼 Azure 服務
PPTX
Getting started with test automation
PDF
twMVC#29 -Learning Machine Learning with Movie Recommendation
twMVC#19 | opserver監控服務的解決
初探 Elastic Observability 的實踐方法
Beyond rails server
如何利用 www.webpagetest.org 進行網頁效能分析與改進建議 (真實案例)
前端爆肝之旅+React上山前的小專案心得分享
架構這件事 - Azure 可以幫助什麼 - 如何選擇使用什麼 Azure 服務
Getting started with test automation
twMVC#29 -Learning Machine Learning with Movie Recommendation

What's hot (20)

PDF
SignalR實戰技巧 twmvc#17
PDF
twMVC#21 | 以實例說明ASP.NET Web API 服務的開發與測試過程
PPTX
Node.js中间件 connect模块深入浅出
PDF
twMVC#21 | 你所不知道的 Visual Studio
PDF
Non-MVC Web Framework
PDF
專案分層架構 twMVC#18
PDF
twMVC#26 | Redis資料型別與場景的連結
PDF
W3CTech美团react专场-Thinking in React
PDF
Asp.net mvc 從無到有 -twMVC#2
PPTX
ReactMaker start kit intro
PPTX
twMVC#31網站上線了然後呢
PPTX
HTML5 規格最新發展現況 (HTML5 趨勢發展與技術應用論壇)
PPTX
React基礎教學
PDF
twMVC#29 | 當.Net Core 遇到AWS Lambda
PDF
twMVC#23 | 快速上手 Azure Functions
PDF
Gulp.js 自動化前端任務流程
PPTX
twMVC#31沒有 hdd 的網站重構 webform to mvc
PPTX
React js入門
PDF
Javascript template & react js 初探
PPTX
與大師對談: 轉移到微服務架構必經之路 ~ 系統與資料庫重構
SignalR實戰技巧 twmvc#17
twMVC#21 | 以實例說明ASP.NET Web API 服務的開發與測試過程
Node.js中间件 connect模块深入浅出
twMVC#21 | 你所不知道的 Visual Studio
Non-MVC Web Framework
專案分層架構 twMVC#18
twMVC#26 | Redis資料型別與場景的連結
W3CTech美团react专场-Thinking in React
Asp.net mvc 從無到有 -twMVC#2
ReactMaker start kit intro
twMVC#31網站上線了然後呢
HTML5 規格最新發展現況 (HTML5 趨勢發展與技術應用論壇)
React基礎教學
twMVC#29 | 當.Net Core 遇到AWS Lambda
twMVC#23 | 快速上手 Azure Functions
Gulp.js 自動化前端任務流程
twMVC#31沒有 hdd 的網站重構 webform to mvc
React js入門
Javascript template & react js 初探
與大師對談: 轉移到微服務架構必經之路 ~ 系統與資料庫重構
Ad

Viewers also liked (19)

PPTX
Questionnaire Results
PPT
Cd Covers Design
PPT
Research music magazines
PPTX
Music Presentation
PPTX
Ideas
PPTX
music magazine ideas
PPTX
CD COVERS: DIGIPAK DESIGNS
PPTX
CD Cover Digipak Designs
PPTX
Music industry
PPT
First draft magazine
PPTX
Album cover: Photoshop Experimentation
PPT
First draft magazine
PPTX
CD Covers: Digipak Design
PPT
高性能网站建设
PPTX
Survey Monkey Results
PPT
Researching music magazines
PPTX
Final Storyboard
PDF
AstriCon 2016 - Using Asterisk and XMPP to provide greater tools to your cust...
PPTX
Having a Niche Audience
Questionnaire Results
Cd Covers Design
Research music magazines
Music Presentation
Ideas
music magazine ideas
CD COVERS: DIGIPAK DESIGNS
CD Cover Digipak Designs
Music industry
First draft magazine
Album cover: Photoshop Experimentation
First draft magazine
CD Covers: Digipak Design
高性能网站建设
Survey Monkey Results
Researching music magazines
Final Storyboard
AstriCon 2016 - Using Asterisk and XMPP to provide greater tools to your cust...
Having a Niche Audience
Ad

Similar to Dynamic JS Loader (20)

PDF
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
PPT
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
PDF
為瞬間巨量做好準備 20180726
PPTX
OPOA in Action -- 使用MagixJS简化WebAPP开发
PPTX
张所勇:前端开发工具推荐
PPT
高性能网站最佳实践
PDF
Top100summit automan x之框架介绍 王超
PPTX
如何使用 Xhprof 分析網站效能 (真實案例)
PPT
Web爬虫那点事
PDF
Berserk js
PPT
富文本编辑器在互联网上的应用
PDF
Asp.net mvc網站的從無到有
PPTX
TBAD F2E 2010 review
PPT
前端杂谈
PDF
美团前端架构简介
PPTX
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
PDF
前端性能优化和自动化
PPT
腾讯大讲堂18 让我们戴上有色眼镜--qzone前台架构的优化分享
PDF
110329 luopeng-sysopt-openkavass
PDF
Top100summit 游戏中的自动化测试 - 金山 - 白银祖
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
為瞬間巨量做好準備 20180726
OPOA in Action -- 使用MagixJS简化WebAPP开发
张所勇:前端开发工具推荐
高性能网站最佳实践
Top100summit automan x之框架介绍 王超
如何使用 Xhprof 分析網站效能 (真實案例)
Web爬虫那点事
Berserk js
富文本编辑器在互联网上的应用
Asp.net mvc網站的從無到有
TBAD F2E 2010 review
前端杂谈
美团前端架构简介
从无阻塞并行脚本加载(Lab.js)到浏览器消息模型
前端性能优化和自动化
腾讯大讲堂18 让我们戴上有色眼镜--qzone前台架构的优化分享
110329 luopeng-sysopt-openkavass
Top100summit 游戏中的自动化测试 - 金山 - 白银祖

Dynamic JS Loader