面试题答案
一键面试1. CDN 缓存策略设计
- 版本控制:
- 在静态资源文件名中嵌入版本号,例如
styles.css?v=1.0
或script.js?v=2.1
。每次资源更新时,手动更新版本号。CDN 会将不同版本号的资源视为不同的文件进行缓存。这样,当资源有更新时,由于版本号变化,用户浏览器会向 CDN 请求新的资源,而旧版本的资源在 CDN 中依然可以被缓存,未更新的用户仍能快速加载旧版本资源。 - 使用哈希值作为版本号,例如通过构建工具(如 Webpack)在打包时计算文件内容的哈希值,将其嵌入文件名,如
styles.123abc.css
或script.456def.js
。这种方式更精确,只要文件内容不变,哈希值就不变,CDN 可长期缓存;文件内容改变,哈希值改变,CDN 会缓存新资源,用户获取新内容。
- 在静态资源文件名中嵌入版本号,例如
- 缓存时间设置:
- 对于不常更新的静态资源,如一些基础样式库、通用脚本库等,设置较长的缓存时间(如一年或数年)。可以通过在 CDN 配置中设置 HTTP 缓存头
Cache - Control: max - age = 31536000
(一年的秒数)或Expires
头来实现。这样在这段时间内,用户再次请求该资源时,CDN 直接从缓存中返回,大大提高加载效率。 - 对于可能频繁更新的资源,如用户自定义样式、特定业务脚本等,设置较短的缓存时间(如数小时或一天)。例如设置
Cache - Control: max - age = 3600
(一小时的秒数)。当缓存时间过期后,用户再次请求,CDN 会检查源站资源是否有更新,若有更新则返回新资源并更新缓存,若无更新则继续使用缓存资源。
- 对于不常更新的静态资源,如一些基础样式库、通用脚本库等,设置较长的缓存时间(如一年或数年)。可以通过在 CDN 配置中设置 HTTP 缓存头
2. Node.js 端配合实现策略
- 构建过程:
- 如果使用手动版本号,在构建脚本(如
npm script
)中,当静态资源更新时,通过脚本自动更新资源引用路径中的版本号。例如,使用 Node.js 的文件操作模块(fs
)读取 HTML、模板文件等,将资源引用路径中的版本号更新。 - 若采用哈希值作为版本号,借助构建工具(如 Webpack 配合
html - webpack - plugin
等插件)。Webpack 在打包时会自动计算文件哈希值并嵌入文件名,同时html - webpack - plugin
会自动更新 HTML 文件中静态资源的引用路径,确保 Node.js 生成的页面中引用的是正确版本的静态资源。
- 如果使用手动版本号,在构建脚本(如
- HTTP 头设置:
- 在 Node.js 应用中,当向 CDN 上传静态资源时,通过设置合适的 HTTP 头来告知 CDN 缓存策略。例如,使用 Express 框架时:
const express = require('express');
const app = express();
const fs = require('fs');
const path = require('path');
// 上传静态资源到 CDN 示例(这里省略实际 CDN 上传逻辑)
app.get('/uploadStatic', (req, res) => {
const filePath = path.join(__dirname,'static', 'example.js');
const fileContent = fs.readFileSync(filePath);
// 设置合适的缓存头
res.set('Cache - Control','max - age = 31536000'); // 假设为不常更新资源
// 实际将 fileContent 上传到 CDN
res.send('Resource uploaded with cache headers set');
});
- 在 Node.js 应用返回给客户端的 HTML 页面中,确保正确引用带有版本号的静态资源。例如,在 Express 中渲染 EJS 模板时:
app.get('/', (req, res) => {
res.render('index', {
stylesVersion: '1.0', // 假设手动设置的版本号
scriptVersion: '2.1'
});
});
在 EJS 模板中:
<link rel="stylesheet" href="/styles.css?v=<%= stylesVersion %>">
<script src="/script.js?v=<%= scriptVersion %>"></script>
这样,Node.js 端在构建和返回页面过程中,配合 CDN 缓存策略,保证用户能及时获取更新资源,同时充分利用缓存提高加载效率。