Steve Souders 最近做了这么一个东西—— ControllJs。 主要为了是解决网页加载中Js文件的性能问题。这里做一个简单的转述。
众所周知,资源文件在浏览器加载直至用户可用是有两个阶段的:加载,执行。JavaScript的加载会阻滞其他资源的加载,而由于浏览器渲染是单线程的,JS执行的同时浏览器实际是假死状态的,页面渲染会停止,浏览器也不会下载新的文件。这样也会造成很大的性能问题, 所以Steve提出了三个方法:异步加载;延迟执行;覆写document.write。
1. 异步加载
核心思想还是很简单:让页面中的js片段对浏览器不可识别。jquery的template也是用了类似的方法。
外链脚本:由
<script type="text/javascript" src="main.js"><script>
改写成
<script type="text/cjs" src="main.js"><script>
内联脚本:由
<script type="text/javascript">sth...<script>
改写成
<script type="text/cjs">sth...<script>
这样子的type声明,浏览器是识别不了的,也不会去加载,更不会执行非ie浏览器不会加载,ie浏览器会加载这个文件,但所有都不会执行内部脚本。
接下来,对于外链的脚本,取出所有的src属性,通过Image或Object元素加载进页面(可参考css,javascript的预加载)。 这样加载的文件不会执行,节省了js的执行时间。
Gmail团队使用了另外一种方法,内联的js全部都放在/*...*/的注释中。也是可以参考的一种方法。
对于没有其他处理的脚本,ControlJS将在window.onload之后执行。对于外链重新创建一个正常的script运行,对于内联则直接eval。如果需要延迟,则需要采取下面的防范。
2. 延迟执行
正如前面说的,JS的执行也会带来大量性能问题。而据统计,一个页面只有29%的脚本是对于页面渲染,逻辑执行等有关系的,其余71%都是在页面加载之后执行,很多用户甚至都不会有机会执行他们。如果将这71%的脚本放在用户触发行为产生时才执行,将是对页面初期渲染性能多大的提升啊。
在ControlJs中,只需要简单做下面一步:
<script cjsexec=false type="text/cjs" cjssrc="jquery.min.js"></script>
声明一个cjsexec为false即可。到需要执行的时候,调用:
CJS.execScript("fg.menu.js", createExamplesMenu);
即可。
3. 重写document.write
由于ControlJs会将所有脚本在window.onload之后执行。如果此时页面中有内联脚本执行document.write(广告等),将会自动执行window.open,所有的document.write的内容将取代现有页面的内容,这是不可接受的。
于是Steve重写了document.write,当调用时,会在script节点前自动创建一个span 标签,并把document.write的输出放到span里面去。这个能解决部分问题。
ControlJS 包括了下面一些其他脚本加载程序没有的特点:
- 异步下载脚本
- 能同时处理外链和内联脚本
- 让脚本在页面加载完成之后才执行
- 支持脚本单纯下载但不执行
- 使用原生HTML
- 解决了部分document.write的问题
- control.js自身加载是异步的
参考文档:
http://www.stevesouders.com/blog/2010/12/15/controljs-part-1/
http://www.stevesouders.com/blog/2010/12/15/controljs-part-3/
http://googlecode.blogspot.com/2009/09/gmail-for-mobile-html5-series-reducing.html
分享到:
相关推荐
ControlJS 是一个优化脚本加载速度的库,它旨在提高网页性能,特别是在处理大量外部脚本时。在现代Web开发中,脚本加载是影响页面加载速度的关键因素之一。ControlJS 提供了一种智能的方式来管理和控制脚本的加载,...
本文将对几款常用的JavaScript(JS)延迟加载框架进行对比测试,包括Controljs、LABjs、Sea.js、In.js以及Do.js。 #### Controljs Controljs是一种模块化脚本加载器,允许开发者以声明的方式加载依赖项。通过`...
本文将详细介绍如何在Cognos中引入jQuery及其UI组件来实现这一目标,并提供具体的步骤和示例代码。 #### Cognos与jQuery的融合背景 Cognos是一款强大的商业智能工具,广泛应用于数据分析、报表制作等领域。然而,...
- **ControlJS**:控制脚本的加载顺序。 - **JSL**:提供了一系列工具来优化脚本加载。 - **LazyLoad**:按需加载资源,提高页面性能。 - **curl.js**:用于异步加载脚本和样式表的工具。 - **DeferJS**:延迟...
基于springboot大学生就业信息管理系统源码数据库文档.zip
基于java的驾校收支管理可视化平台的开题报告
时间序列 原木 间隔5秒钟 20241120
毕业设计&课设_基于 Vue 的电影在线预订与管理系统:后台 Java(SSM)代码,为毕业设计项目.zip
基于springboot课件通中小学教学课件共享平台源码数据库文档.zip
基于java的网上购物商城的开题报告
Delphi人脸检测与识别Demo1fdef-main.zip
基于java的咖啡在线销售系统的开题报告
基于java的自助医疗服务系统的开题报告.docx
内容概要:本文档全面介绍了Visual Basic(VB)编程语言的基础知识和高级应用。首先概述了VB的基本特性和开发环境,随后详细讲述了VB的数据类型、变量、运算符、控制结构、数组、过程与函数、变量作用域等内容。接着介绍了窗体设计、控件使用、菜单与工具栏的设计,文件操作、数据库访问等关键知识点。最后讨论了VB的学习方法、发展历史及其在桌面应用、Web应用、数据库应用、游戏开发和自动化脚本编写等领域的广泛应用前景。 适合人群:初学者和中级程序员,尤其是希望快速掌握Windows桌面应用开发的人群。 使用场景及目标:①掌握VB的基础语法和开发环境;②学会使用VB创建复杂的用户界面和功能完整的应用程序;③理解数据库操作、文件管理和网络编程等高级主题。 其他说明:Visual Basic是一种简单易学且功能强大的编程语言,尤其适合用于开发Windows桌面应用。文中不仅覆盖了基础知识,还包括了大量的实用案例和技术细节,帮助读者快速提升编程技能。
基于java的疫情期间高校防控系统开题报告.docx
基于springboot+vue社区老年人帮扶系统源码数据库文档.zip
基于java的超市商品管理系统的开题报告.docx
基于SpringBoot房屋买卖平台源码数据库文档.zip
xdu限通院23微处理器系统与应用大作业(两只老虎),适应于汇编语言keil软件,
<项目介绍> - 新闻类网站系统,基于SSM(Spring、Spring MVC、MyBatis)+MySQL开发,高分成品毕业设计,附带往届论文 - 不懂运行,下载完可以私聊问,可远程教学 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 --------