defer
属性defer
属性告诉浏览器立即下载脚本,但在文档解析完成后才执行。这种方式确保脚本按照它们在文档中的顺序执行。适用于需要等到 HTML 文档完全解析完毕后再执行的脚本。
示例:
<script src="script.js" defer></script>
特点:
async
属性async
属性告诉浏览器立即下载脚本,但下载完成后立即执行,而不等待其他脚本或 HTML 解析完成。适用于独立的脚本,例如分析工具或广告脚本。
示例:
<script src="script.js" async></script>
特点:
动态创建 <script>
标签可以将脚本的加载推迟到特定事件发生之后。这种方法可以在需要时加载脚本,例如用户交互后。
示例:
function loadScript(url) {
var script = document.createElement('script');
script.src = url;
document.body.appendChild(script);
}
// 调用函数延迟加载脚本
loadScript('script.js');
特点:
放置在页面底部:将 <script>
标签放在 HTML 文档的底部,确保脚本加载不会阻塞页面的初始渲染。这种方法虽然不完全是延迟加载,但能避免阻塞页面渲染。
<body>
<!-- 页面内容 -->
<script src="script.js"></script>
</body>
事件监听:使用事件监听在 DOMContentLoaded 事件之后加载脚本,确保脚本在 DOM 完全加载后执行。
document.addEventListener('DOMContentLoaded', function() {
var script = document.createElement('script');
script.src = 'script.js';
document.body.appendChild(script);
});
现代前端开发中,使用模块化加载工具如 Webpack、RequireJS 等,可以帮助按需加载 JavaScript 文件。这些工具可以实现更细粒度的控制,例如代码拆分、按需加载等。
示例(使用动态 import
):
import('module.js').then(module => {
// 使用模块
});
特点:
选择合适的延迟加载方式可以显著提高网页的性能和用户体验。对于关键脚本,可以考虑使用 defer
或 async
,对于非关键或按需加载的脚本,可以考虑动态创建 <script>
标签或使用模块化加载工具。了解每种方式的特点和适用场景,可以更好地优化网页的加载性能。