ControlJS - 让脚本加载的更快

ControlJS通过异步加载和延迟执行脚本等技术优化前端性能,解决了页面加载脚本的性能问题。它能够异步下载所有脚本,同时处理内嵌与外链脚本,并在页面渲染完成后执行脚本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端性能的提升大部分都是在脚本加载执行上,ControlJS的出现让我们感觉提高性能如此容易。急不可耐的想把这段时间的研究成果分享出来,希望能给前端俊才们些帮助,同样换回你们的批评指教。非常感谢拔赤师兄的有情支助,让我感觉前端真是个很有乐趣的领域,因为你知道什么是有意义。

Steve Souders在2010年12月份发布了ControlJS项目,该项目是让开发者更好的去控制javascript文件的下载和执行,是一个可以让脚本加载更快的组件.从而解决了页面加载脚本的性能问题.

Steve提出了一个非常具有创造性的思想,就是预先异步下载javascript文件而不执行.这一点得到了很多人的关注与验证。Nicholas Zaka也因ControlJS引发了很多思考,并分析了ControlJS和LABjs 的区别所在,详细内容可以阅读Thoughts on script loaders和Separating JavaScript download and execution。Zakas不赞成使用额外的脚本加载库,因为Script loader对浏览器检测的依赖,将是高成本的维护,同时浏览器的发展趋势会为我们解决此类问题。

但是对于中国互联网的特殊性来分析,脚本加载库的应用还是非常有必要的。很多ControlJS的思想让我们合理的应用,提升页面脚本加载性能将是非常显著。Steve专门整理了ControlJS专题,包括一些实例,验证了ControlJS的成功,并使用3篇博闻详细介绍了ControlJS:异步加载、延迟执行、重写document.write。

1、异步加载

原理其实很简单:将script的标签type属性值更改为浏览器无法识别的类型,这样浏览器不会认为这是一个脚本,便不会去下载文件。在页面加载时开始读取所有type="text/cjs"的script标签(包括内嵌脚本),如果存在"DATA-CJSSRC"属性将创建IMAGE或者OBJECT对象(依赖浏览器而选择),去异步下载脚本文件并缓存文件,否则便是内嵌脚本需要预存直到需要时使用eval执行,外链需要插入script元素,解析并执行js内容。
a>增加ControlJS脚本
var cjsscript = document.createElement('script');
cjsscript.src = "control.js";
var cjssib = document.getElementsByTagName('script')[0];
cjssib.parentNode.insertBefore(cjsscript, cjssib);
b>更改页面脚本标签属性
<script type="text/cjs" data-cjssrc="main.js"><script>
<script type="text/cjs">
var name = getName();
<script>
c>预加载脚本的过程源码内容如下:
// Download a script as an image.
// This puts it in the browser's cache, but doesn't execute it.
CJS.downloadScriptImage = function(url) {
var img = new Image();
img.src = url;
};


// Download a script as an object.
// This puts it in the browser's cache, but doesn't execute it.
// Based on http://www.phpied.com/preload-cssjavascript-without-execution/
CJS.downloadScriptObject = function(url) {
var obj = document.createElement('object');
obj.data = url;
document.body.appendChild(obj);
};


2、延迟执行

预加载javascript文件后,在真正出发交互时在进行脚本的执行操作。

3、重写document.write

ControlJS是异步加载所有脚本的,在默认情况下这些异步脚本都是在window.onload解析并执行的,如果此时脚本调用window.write方法,将导致一个不希望发生的问题,就是整个页面被window.write的输出内容替换,所有页面内容将被删除。问题是由于在docuemnt被加载完后调用docuemnt.write方法时将会自动去触发document.open,写入任何处于打开状态的doucment都将会会替换整个页面的内容,这是无可厚非的。

对于现在被开发者深恶痛绝的广告,一般都是使用document.write方法来呈现内容的,然而无法将这些内容异步处理是开发者非常头疼的问题。

ControlJS的解决方法便是重写docuemnt.write,执行客户端自定义的方法,便是创建一个dom元素(span),将其插入正在被解析执行的script标签之前,并且设置SPAN的innerHTML的值为docuemnt.write的内容。由于插入innerHTML里存在script标签时,浏览器将不会很好的识别,因此ControlJS的做法是查找并提取出url,并在页面动态创建script对象来执行脚本内容。

但是ControlJS存在一个bug就是没有考虑到如果document.write中的script脚本中再次出现document.write的时候,将无法正确定位到最初的异步script,导致广告内容输出的位子错位。

以上便是ControlJS的相关内容,在实际项目的应用中肯定还会存在一些问题,就像Steve说的ControlJS虽然有些处理上牵强些,但它仍然是很有价值的,我们怎样能将别人的思想融入到我们自己的项目中才是最重要的,光靠拿来主义理论是没有任何意义的。

最后总结ControlJS为我们做了什么事:
1、异步下载所有脚本
2、同时处理内嵌与外链脚本
3、延迟脚本的执行直到页面被渲染完
4、允许脚本只下载不执行
5、不改变脚本代码,只是简单改变HTML标签属性
6、解决了异步脚本中存在docuement.write的问题
7、ControlJS本身是异步加载
内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核和精密轨到轨输出放大器。该器件不仅体积小巧、功耗低,而且具有广泛的输入电压范围和快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项和误差源分析,旨在帮助工程师更好地理解和应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师和技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式数字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间和转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收和泄漏电流等因素对测量准确性的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值