的三种模式的对比

来源:http://www.smjxgs.com 作者:4887王中王鉄算盘奖结果 人气:158 发布时间:2019-08-08
摘要:何谓安需装载?     脚本程序一般都是下载后执行,当脚本库非常庞大时,一次性下载起来非常费时,传统的解决方式是,按功能模块把脚本写在不同的文件中,页面上手动加入 s

何谓安需装载?
    脚本程序一般都是下载后执行,当脚本库非常庞大时,一次性下载起来非常费时,传统的解决方式是,按功能模块把脚本写在不同的文件中,页面上手动加入 script标签装载指定内容,但是这有一些缺点,类库的使用者需要知道没个脚本之间的关系,顺序要求等等,而不可能要求每个类库使用者都对其非常熟悉,出错的可能性很大。于是很多框架开始支持导入指令,想使用什么一个导入函数就完了,不必一堆堆的script文件,不用小心翼翼的关注着他们的依赖关系。

1.children和childNodes的区别

安需装载的困境:
      早期安需装载(即时同步按需装载)有一个致命的弱点,浏览器阻塞问题。当按需装载某些类库时,通常通过XMLHttpRequest同步装载脚本文件实现,这种情况下,在资源下载完成之前,浏览器将停止响应用户事件、停止页面重画操作。如果网速很慢,这段时间将非常让人讨厌,就像是死机似的。

childNodes是标准的,它返回的包括所有子节点,包括元素节点,属性节点,文本节点等,childNodes(i)在IE6/7/8/SF/Op/Chrome下支持,在IE9/FF下不支持。如果想取第一个HTML子节点,这里不能用firstChild,要用nodeType判断筛选下。

      以前的解决办法是,将常用类库资源直接打包到框架文件中,而按需导入就成了一个宣传的幌子,没有太多实际的价值。

children是非标准的,它返回的是子元素集合,同样在FF下不支持children(i)取元素,想取第一个HTML子节点,可以用children[0]。

安需装载可分如下三种模式:

2.script标签放在body和head的区别

l 即时同步按需装载 (阻塞,JSI、JSVM、dojo)。

一般放在head里是当页面加载前就运行JS代码,被调用时执行,而且可以保证脚本在任何调用之前已经被加载。

最简单的按需装载实现,通过XMLHttpRequest同步装载脚本文件实现。问题是,浏览器使用这种方式同步获取资源时将导致浏览器阻塞:停止响应用户事件、停止页面重画操作。所以,虽然编程最为简单,但是用户体验最差。

一般放在body里是当页面加载后才运行JS代码,加载时被执行,它通常被用来生成页面的内容。

 

把引入的js文件放在head里,加载head里代码时就同时载入了js代码,这样在body区调用时就不需要载入代码了,速度就提高了,这种区别在小程序看不明显,在复杂的大程序里就显著了。

2 异步按需装载(无阻塞,JSI2.0 )。

无论JS代码是内嵌还是在外链的文件中,页面的下载和渲染都必须停下来等待脚本执行完成。

异步导入,不必多做解释,用户体验好,但是因为其异步特征,处理起来比较麻烦。

引入外部文件的好处:易维护,易扩展,方便管理和重复利用。

 

浏览器在执行JS代码时,不能同时做其他的事情,即script标签每次出现都会让页面等待脚本的解析和执行,JS代码执行完后才能继续渲染页面,这便是JS的阻塞的特点。

3 延迟同步按需装载(无阻塞,JSI2.0 )。

3.按需装载

JSI通过动态预装载功能实现的一种同步获取资源的方法,虽然也是同步,但没有阻塞,可以算时兼顾易用性和用户体验的解决方按。缺点时有一定延迟,当前脚本标签中不可用。

按需装载,脚本程序一般是下载后执行,如果脚本库非常庞大,一次性下载起来非常费时,传统解决方法是,按功能模块把脚本写在不同的文件中,页面上手动加入script标签装载指定内容,但有个缺点,类库的使用者需要知道每个脚本程序之间的关系,顺序等,但不是所有类库使用者都能把这些记清楚,容易出错。于是很多框架开始支持导入指令,想使用什么一个导入函数就完了,不必用一堆堆script文件,也不用关注他们之间的依赖关系。

       

按需装载可分三种模式:

 

即时同步按需装载(阻塞,JSI,JSVM,dojo)。最简单的按需装载实现,通过XMLHttpRequest同步装载脚本文件实现。但问题是浏览器使用这种方式同步获取资源时会导致浏览器阻塞:停止响应用户事件,停止页面重画操作。所以,这种虽然编程最为简单,但用户体验最差。

使用方法(JSI示例)
    以一个代码语法着色程序为例:

异步按需装载(无阻塞,JSI2.0 )。异步导入,用户体验好,但因为异步的特征处理起来比较麻烦。

类库位置:org/xidea/example/code/code.js

延迟同步按需装载(无阻塞,JSI2.0 )。JSI通过动态预装载功能实现的一种同步获取资源的方法,虽然也是同步,但没有阻塞,可以算是兼顾易用性和用户体验方案。缺点是有一定延迟,当前脚本标签中不可用。

页面位置:example/xxx.html

 

即时同步按需装载

import("org.xidea.example.code.Code"); 

var code1 = new Code(); 

code1.id = "libCode"; 

code1.decorate();

 

异步按需装载

$import("org.xidea.example.code.Code",function(Code){        

var code1 = new Code();        

code1.id = "libCode";        

code1.decorate();  

})    

延迟同步按需装载(无阻塞,JSI2.0 )。

<script>"../scripts/boot.js"></script>    

<script>    

$import("org.xidea.example.code.Code",true);    

</script>    

    

<script>    

var code1 = new Code();    

code1.id = "pageCode";    

code1.decorate();    

</script>    

测试示例: 
地址:

 

    示例都是jsi的默认示例,可以下载到本地运行,下载后最好能放到一个能受到网速限制的服务器上,只有这样才能看到阻塞的问题。

参考:
JSI 导入函数: function $import(path, callbackOrLazyLoad, target ) 

 

JSI2 预览版下载:

本文由4887王中王鉄算盘奖结果发布于4887王中王鉄算盘奖结果,转载请注明出处:的三种模式的对比

关键词:

最火资讯