ControlJS介绍
cookqq ›博客列表 ›html

ControlJS介绍

2012-03-19 22:38:06.0|分类: html|浏览量: 2161

摘要: Steve Souders 最近做了这么一个东西—— ControllJs。 主要为了是解决网页加载中Js文件的性能问题。这里做一个简单的转述。   众所周知,资源...


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自身加载是异步的 

 

 

 

一键分享文章

分类列表

  • • struts源码分析
  • • flink
  • • struts
  • • redis
  • • kafka
  • • ubuntu
  • • zookeeper
  • • hadoop
  • • activiti
  • • linux
  • • 成长
  • • NIO
  • • 关键词提取
  • • mysql
  • • android studio
  • • zabbix
  • • 云计算
  • • mahout
  • • jmeter
  • • hive
  • • ActiveMQ
  • • lucene
  • • MongoDB
  • • netty
  • • flume
  • • 我遇到的问题
  • • GRUB
  • • nginx
  • • 大家好的文章
  • • android
  • • tomcat
  • • Python
  • • luke
  • • android源码编译
  • • 安全
  • • MPAndroidChart
  • • swing
  • • POI
  • • powerdesigner
  • • jquery
  • • html
  • • java
  • • eclipse
  • • shell
  • • jvm
  • • highcharts
  • • 设计模式
  • • 列式数据库
  • • spring cloud
  • • docker+node.js+zookeeper构建微服务
版权所有 cookqq 感谢访问 支持开源 京ICP备15030920号
CopyRight 2015-2018 cookqq.com All Right Reserved.