Hello,算法:微博热搜的背后
2026年2月1日 23:34
每天一睁眼,新闻头条、微博热搜都能抓住很多人的目光,购物时也会有商品排行榜,它们无形中对我们的注意力和决策产生重要影响。 那么,生活中随处可见的排行榜,在程序里如何做到,算法又叫什么呢?
<script> 标签放到 <body> 的最底部吗?如果我把带 defer 的脚本放在 <head> 里,会有性能问题吗?不需要了。 使用 defer 属性后,把 <script> 放在 <head> 里不仅没有性能问题,反而是更优的做法。
原因:
defer 脚本会并行下载,不阻塞 HTML 解析DOMContentLoaded 事件之前<head> 里可以让浏览器更早发现并开始下载脚本传统 <script>(无 defer/async):
HTML 解析 ──▶ 遇到 script ──▶ 暂停解析 ──▶ 下载脚本 ──▶ 执行脚本 ──▶ 继续解析
defer 脚本:
HTML 解析 ────────────────────────────────────────────▶ DOM 解析完成 ──▶ 执行脚本
└──▶ 并行下载脚本 ──────────────────────────────────────────────────┘
<head> 里的 defer 更好?| 位置 | 发现脚本时机 | 开始下载时机 |
|---|---|---|
<head> |
解析开始时 | 立即 |
<body> 底部 |
解析接近完成时 | 较晚 |
放在 <head> 里,浏览器可以在解析 HTML 的同时下载脚本,充分利用网络带宽。
误区 1: "defer 脚本放 <head> 会阻塞渲染"
误区 2: "放 <body> 底部更保险"
误区 3: "defer 和放底部效果一样"
<head> 里可以更早开始下载 下载时机 执行时机 执行顺序
传统 script 阻塞解析 下载完立即执行 按文档顺序
async 并行下载 下载完立即执行 不保证顺序
defer 并行下载 DOM 解析完成后 按文档顺序
<!-- ✅ 推荐:defer 脚本放在 <head> -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>页面标题</title>
<!-- 浏览器立即发现并开始下载,但不阻塞解析 -->
<script defer src="vendor.js"></script>
<script defer src="app.js"></script>
<link rel="stylesheet" href="styles.css">
</head>
<body>
<!-- HTML 内容 -->
</body>
</html>
<!-- ❌ 过时做法:放在 body 底部 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>页面标题</title>
</head>
<body>
<!-- HTML 内容 -->
<!-- 要等 HTML 解析到这里才开始下载 -->
<script src="vendor.js"></script>
<script src="app.js"></script>
</body>
</html>
打开 Chrome DevTools → Network 面板,观察脚本的下载开始时间:
<head> 里的 defer 脚本:在 HTML 下载初期就开始<body> 底部的脚本:在 HTML 解析接近完成时才开始"defer 和 async 有什么区别?"
"多个 defer 脚本的执行顺序是怎样的?"
"defer 脚本和 DOMContentLoaded 的关系?"
"什么情况下还是要放 body 底部?"
"defer 放
<head>不仅没有性能问题,反而是更优的选择。因为浏览器的预加载扫描器(Preload Scanner)可以在解析 HTML 的早期就发现这些脚本并开始下载,充分利用网络带宽。而放在<body>底部的话,脚本的发现时机会延后,相当于浪费了并行下载的机会。"
defer 脚本放
<head>是现代最佳实践:更早发现、并行下载、不阻塞解析、按序执行。