管理浏览器中的JavaScript代码是个棘手的问题,因为代码执行过程会阻塞浏览器的其他进程,比如用户界面绘制。每次遇到<script>
标签,页面都必须停下来等待代码下载(如果是外链文件)并执行,然后继续处理其他部分。尽管如此,还是有几种方法能减少JavaScript对性能的影响。
几种优化加载、执行性能的方法
-
<body>
标签闭合之前,将所有的<script>
标签放到页面底部。这能确保在脚本执行前页面已经完成了渲染。 - 合并脚本。页面中的
<script>
标签越少,加载也就越快,响应也更迅速。无论外链文件还是内嵌脚本都是如此。 - 有几种无阻塞下载JavaScript的方法:
1)使用<script>
标签的defer属性。任何带有defer属性的<script>
元素在DOM完成加载前都不会被执行,无论内嵌还是外链。带有defer属性的<script>
元素在onload事件处理其执行之前被调用。
2)使用动态创建的<script>
元素来下载并执行代码。也就是跟创建其他DOM元素一样,创建script元素,设置src值,同时script元素有onload事件监听,来跟踪脚本下载状态。注意:通常来讲,把新的<script>
标签添加到<head>
标签里比添加到<body>
里更保险。
3)使用XHR对象下载JavaScript代码并注入页面中。即通过XMLHttpRequest对象,读取js脚本的内容,然后将返回结果设置到script.text上。优点是:代码是在<script>
标签之外返回的,下载后不会立即执行,而且兼容性好。缺点是:文件必须与所请求的页面处于相同域,这意味着不能从CDN下载脚本。
推荐的无阻塞模式
如果要向页面中添加大量的JavaScript,推荐做法分两步:
- 先添加动态加载所需代码,比如只包含loadScript()函数的代码
- 使用动态加载代码来加载剩余的JavaScript
loadScript()可以外链,也可以直接内嵌在页面中。