前端性能的提升大部分都是在脚本加载执行上,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本身是异步加载
分享到:
相关推荐
Controljs是一种模块化脚本加载器,允许开发者以声明的方式加载依赖项。通过`<script type="text/cjs">`标签定义资源路径,Controljs会自动异步加载这些资源,并确保按照正确的顺序执行。这种方式不仅提高了加载效率...
- **ControlJS**:控制脚本的加载顺序。 - **JSL**:提供了一系列工具来优化脚本加载。 - **LazyLoad**:按需加载资源,提高页面性能。 - **curl.js**:用于异步加载脚本和样式表的工具。 - **DeferJS**:延迟...
这些控件都可以通过类似的方式在Cognos中实现,只需要按照官方文档的指导,正确地引入相应的JS和CSS文件,并编写对应的初始化脚本即可。 #### 结语 通过本文介绍的方法,开发者不仅能够有效地提升Cognos应用程序的...
中国电子商务平台,打造中国最具影响力的企业电子商务平台,商机信息,产品资料,企业名录,行业展览会,商务新闻。
经典文学作品阅读体验
python-30.判断 2 的幂——反正你没它快.py
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
2004-2020年各省货运量数据 1、时间:2004-2020年 2、来源:国家统计j、统计nj 3、指标:行政区划代码、地区、年份、货运量(万吨) 4、范围:31省
ADC推理软件AI程序
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
java-springboot+vue景区民宿预约系统实现源码(完整前后端+mysql+说明文档+LunW+PPT).zip
漫画作品与增强现实体验
漫画作品改编舞台剧经验
,,ABC_DQ:基于MATLAB Simulink的三相静止坐标系到两相静止坐标系(Clark变)到两相旋转坐标系变(Park变)的仿真模型。 仿真条件:MATLAB Simulink R2015b ,MATLAB Simulink;三相静止坐标系;两相静止坐标系;Clark变换;Park变换;仿真模型;R2015b,MATLAB Simulink中的Clark-Park变换仿真模型研究
在智慧城市建设的大潮中,智慧园区作为其中的璀璨明珠,正以其独特的魅力引领着产业园区的新一轮变革。想象一下,一个集绿色、高端、智能、创新于一体的未来园区,它不仅融合了科技研发、商业居住、办公文创等多种功能,更通过深度应用信息技术,实现了从传统到智慧的华丽转身。 智慧园区通过“四化”建设——即园区运营精细化、园区体验智能化、园区服务专业化和园区设施信息化,彻底颠覆了传统园区的管理模式。在这里,基础设施的数据收集与分析让管理变得更加主动和高效,从温湿度监控到烟雾报警,从消防水箱液位监测到消防栓防盗水装置,每一处细节都彰显着智能的力量。而远程抄表、空调和变配电的智能化管控,更是在节能降耗的同时,极大地提升了园区的运维效率。更令人兴奋的是,通过智慧监控、人流统计和自动访客系统等高科技手段,园区的安全防范能力得到了质的飞跃,让每一位入驻企业和个人都能享受到“拎包入住”般的便捷与安心。 更令人瞩目的是,智慧园区还构建了集信息服务、企业服务、物业服务于一体的综合服务体系。无论是通过园区门户进行信息查询、投诉反馈,还是享受便捷的电商服务、法律咨询和融资支持,亦或是利用云ERP和云OA系统提升企业的管理水平和运营效率,智慧园区都以其全面、专业、高效的服务,为企业的发展插上了腾飞的翅膀。而这一切的背后,是大数据、云计算、人工智能等前沿技术的深度融合与应用,它们如同智慧的大脑,让园区的管理和服务变得更加聪明、更加贴心。走进智慧园区,就像踏入了一个充满无限可能的未来世界,这里不仅有科技的魅力,更有生活的温度,让人不禁对未来充满了无限的憧憬与期待。
自驾游中行程时间灵活调整
,,基于蒙特卡洛法的概率潮流 以IEEE33节点的电网为研究对象 建立了光伏和风电的概率出力模型 采用蒙特卡洛法进行随机抽样 之后基于抽样序列进行概率潮流计算 最后得到电网的电压概率出力曲线 程序有基于matpower和非matpower(效果好一点) ,核心关键词:蒙特卡洛法; 概率潮流; IEEE33节点电网; 光伏风电概率出力模型; 随机抽样; 电压概率出力曲线; matpower; 非matpower方法。,基于蒙特卡洛法的电网概率潮流分析:IEEE33节点光伏风电模型构建与验证
内容概要:本文详细介绍了基于视觉检测的机械臂药品自动分类与搬运仿真的实现方法。首先通过搭建环境和加载相关模型,接着利用 OpenCV 对摄像头捕获的画面进行药瓶识别,再通过 PyBullet 实现机械臂路径规划及其动作控制,最后通过主循环不断地完成对药物的分类抓取操作。为增强系统性能和稳定性进行了多项改进:采用先进的YOLOv8模型实现更精准的物体检测、增加更细致的夹爪开合逻辑提高物品抓取的成功率,同时加入碰撞检测机制保障运动过程的安全性。该仿真是用Python编程语言开发,并涉及多领域的技术集成。 适用人群:适用于自动化设备研究开发的技术专家或从事机器人相关专业学习的研究人员。 使用场景及目标:可用于研究自动化药房、医院仓库管理等医疗物资自动处理流程的设计;帮助理解并实践如何构建一个完整的机器人视觉引导下的机械手作业体系,以及针对具体应用场景提出有效的改进建议和技术路线图。 其他说明:为了使系统更接近真实环境,开发者还可以继续探索更多先进的机器视觉算法,并深入探讨机械臂硬件层面的选择,以期打造出更加智能化的产品应用于各行各业。