`
whui0110
  • 浏览: 84239 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

ControlJS - 让脚本加载的更快

阅读更多
前端性能的提升大部分都是在脚本加载执行上,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是一种模块化脚本加载器,允许开发者以声明的方式加载依赖项。通过`&lt;script type="text/cjs"&gt;`标签定义资源路径,Controljs会自动异步加载这些资源,并确保按照正确的顺序执行。这种方式不仅提高了加载效率...

    Webapp Architecture

    - **ControlJS**:控制脚本的加载顺序。 - **JSL**:提供了一系列工具来优化脚本加载。 - **LazyLoad**:按需加载资源,提高页面性能。 - **curl.js**:用于异步加载脚本和样式表的工具。 - **DeferJS**:延迟...

    cognos中引入Jquery简化UI开发.pdf

    这些控件都可以通过类似的方式在Cognos中实现,只需要按照官方文档的指导,正确地引入相应的JS和CSS文件,并编写对应的初始化脚本即可。 #### 结语 通过本文介绍的方法,开发者不仅能够有效地提升Cognos应用程序的...

    tables-3.6.1-cp39-cp39-win_amd64.whl

    tables-3.6.1-cp39-cp39-win_amd64.whl

    基于springboot大学生心理咨询平台源码数据库文档.zip

    基于springboot大学生心理咨询平台源码数据库文档.zip

    Javaweb仓库管理系统项目源码.zip

    基于Java web 实现的仓库管理系统源码,适用于初学者了解Java web的开发过程以及仓库管理系统的实现。

    基于springboot智能推荐旅游平台源码数据库文档.zip

    基于springboot智能推荐旅游平台源码数据库文档.zip

    Ruby语言教程:从基础知识到高级特性的全面指南

    内容概要:本文是一份详尽的Ruby语言教程,首先介绍了Ruby语言的基本信息和发展背景。接着详细讲解了Ruby的基础语法,如变量、数据类型、运算符、控制流等,并深入探讨了面向对象编程的关键概念,包括类、对象、继承、封装和多态。随后介绍了Ruby的一些高级特性,如模块、异常处理、迭代器和文件I/O操作。最后,讨论了Ruby在Web开发中的应用,尤其是与Rails框架的结合。每个部分都配有相应的代码示例,帮助读者更好地理解和实践。 适合人群:适用于初学者和有一定基础的程序员,特别是对Ruby语言感兴趣的人。 使用场景及目标:学习和掌握Ruby语言的各项基础知识和高级特性,为进一步进行Web开发或其他相关编程打下坚实的基础。 其他说明:教程中的每一部分内容都有详细的解释和代码示例,非常适合自学和教学使用。

    L7_NDVI_sd.txt

    GEE训练教程——Landsat5、8和Sentinel-2、DEM和各2哦想指数下载

    基于springboot在线问诊系统源码数据库文档.zip

    基于springboot在线问诊系统源码数据库文档.zip

    基于springboot的流浪猫狗救助系统源码数据库文档.zip

    基于springboot的流浪猫狗救助系统源码数据库文档.zip

    value_at_a_point.ipynb

    GEE训练教程

    毕业设计&课设_利用 WiFi 实现室内定位,含定位 APP 与数据采集 APP.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    SQLite参考手册中文CHM版最新版本

    本教程帮助您了解什么是 SQLite,它与 SQL 之间的不同,为什么需要它,以及它的应用程序数据库处理方式。需要的朋友们可以参考看看! SQLite是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite是一个增长最快的数据库引擎,这是在普及方面的增长,与它的尺寸大小无关。SQLite 源代码不受版权限制。 什么是 SQLite? SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。 就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。 为什么要用 SQLite? 不需要一个单独的服务器进程或操作的系统(无服务器的)。 SQLite 不需要配置,这意味着不需要安装或管理。 一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。 SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250K

    基于springboot学生选课系统源码数据库文档.zip

    基于springboot学生选课系统源码数据库文档.zip

    【Android UI】SurfaceView中使用 Canvas 绘制可缩放大图

    【Android UI】SurfaceView中使用 Canvas 绘制可缩放大图 ( 拖动和缩放相关的变量 | Canvas 绘图函数 | 手势识别 多点触控流程 | 拖动图片 | 缩放图片 ) 博客链接:https://blog.csdn.net/shulianghan/article/details/143950948 一、需求分析 和 核心要点 说明 1、需求说明 2、核心要点 - 拖动和缩放相关的变量 3、核心要点 - Canvas 绘图函数 4、核心要点 - 手势识别 多点触控流程 5、核心要点 - 拖动图片 6、核心要点 - 缩放图片 二、完整代码示例 1、环境说明 2、SurfaceView 完整代码 3、运行结果

    基于springboot+web的二手闲置交易系统源码数据库文档.zip

    基于springboot+web的二手闲置交易系统源码数据库文档.zip

    band_computations.ipynb

    GEE训练教程

    毕业设计&课设_众筹平台系统,基于基础语言开发,含功能流程与运行步骤,适合新手学习借鉴.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

Global site tag (gtag.js) - Google Analytics