JavaScript无阻赛加载最常用的就是xhr 注入和script dom element,《高性能JavaScript》一书中有提到,倘若我用script dom element技术,将script动态插入head中,文件的下载和运行都不会阻塞其他页面处理过程。这里百思不得其解,通过动态插入head中,JavaScript文件下载不会阻塞其他页面处理过程,但运行肯定会吧?浏览器不是单进程的么,一旦下载成功后立即执行,其他一切操作肯定会等该JavaScript代码执行完后,才进行啊。那为什么还说无阻塞呢。
我的观点:只能说加载无阻赛,但运行肯定会使其他操作挂起,等待完成后再处理。
疑问:JavaScript无阻赛技术为什么可以毫无顾忌地将JavaScript放到head中,且运行时不会阻塞其他页面处理过程?像这样,页面渲染时,在遇到<body>前执行JavaScript,不同样会出现短时间的白屏么?除开下载改善了外,与将<script>标签放到<head>中有什么区别?
你把它想复杂了,事实上它很简单,动态加载js无非是利用了流量器的多线程技术实现了无阻塞加载,加载成功后,运行效果是一样的。
是针对加载而言?就是说加载后,执行时,还是会阻塞哈?但书上和其他博客上,怎么都说利用无阻赛技术可以放到head中,且运行时不会阻塞其他操作呢?这点让我很费解
@猴子猿: 运行是指加载js的js代码,而不是加载后的js代码,加载后的js代码运行一样会阻塞其他操作
@上帝之城: 那这样‘无阻赛’就不能将动态创建的script元素添加到head中咯,比如利用script dom element技术实现无阻赛,当加载成功后,这种方式加载的代码会立刻执行的。那文件的下载和执行过程不就会阻塞页面其他进程了嘛?
@猴子猿: 下载过程中不会阻塞页面其他js代码的执行
@上帝之城: 麻烦问下执行呢?
@猴子猿: 执行过程会阻塞
@上帝之城:
@上帝之城: 你好,这是《高性能JavaScript》中说的,利用script dom element技术,不仅下载不会阻塞,执行也不会阻塞。让人费解
就是告诉浏览器,这个js文件先下载着,不用执行,等页面都加载好了在执行
利用script dom element技术实现无阻赛,当加载成功后,这种方式加载的代码会立刻执行的。但文件的下载和执行过程不会阻塞页面其他进程。怎么理解?
@猴子猿: 也就是说这个js在下载和执行的时候,其他的资源可以同步下载
js执行是单线程,html渲染也是这个单线程,但是请求资源可以多个线程一起下载,只不过有些浏览器在同一个域名下只能最多5个一起下载
@刘宏玺: 恩恩,同步下载是可以的,但是下载完了立即执行,这个立即执行,难道不会影响进程?
@猴子猿: 只要是执行,都会占用这个线程
如果当前线程正在渲染html那么就会停止渲染,然后执行js,等js执行完毕再去渲染html
@刘宏玺: 对的,那通过利用script dom element技术实现无阻赛,执行时,为什么会不影响其他进程呢?
@刘宏玺:
@刘宏玺: 这是《JavaScript高性能》出处
@猴子猿: 这个只是实现了请求资源无阻赛
个人理解,无论JS放哪里,浏览器在加载完页面资源后总是先对页面渲染,渲染完后再执行的js.