diff --git a/src/helpers.php b/src/helpers.php index 5ec64e0..04b3637 100644 --- a/src/helpers.php +++ b/src/helpers.php @@ -25,6 +25,29 @@ function url(string $route, array $params = []): string return '/index.php?' . http_build_query($params); } +/** + * 静态资源地址 + 内容版本号(cache busting)。 + * + * 为什么必须有:CSS/JS 的响应没有 Cache-Control/Expires,浏览器会退回到自己的 + * 「启发式缓存」——在它自行估算的新鲜期内**根本不发请求**。文件换了它也不知道, + * 因为地址一直没变。表现就是「服务端明明更新了,用户看到的还是旧样式」。 + * 拼上随文件变化的版本号后,文件一改地址就变,浏览器只能重新拉。 + * + * 版本号用 mtime + 文件大小:只用 mtime 时,同一秒内改两次会漏; + * 补上大小能挡住绝大多数「内容变了但 mtime 没变」的情况。 + * 取不到文件信息就不加版本号,退化成原来的行为 —— 不影响可用性。 + */ +function asset(string $path): string +{ + $path = '/' . ltrim($path, '/'); + $file = dirname(__DIR__) . $path; + $mtime = @filemtime($file); + if ($mtime === false) { + return $path; + } + return $path . '?v=' . $mtime . '-' . (int)@filesize($file); +} + function redirect(string $route, array $params = [], string $anchor = ''): void { $location = url($route, $params); diff --git a/templates/layout.php b/templates/layout.php index 74d837f..1eed277 100644 --- a/templates/layout.php +++ b/templates/layout.php @@ -15,9 +15,10 @@ $__initial = $__name !== '' ? mb_substr($__name, 0, 1) : '·';