MST
星途 面试题库

面试题:Node.js 与 CDN 集成时的缓存策略设计

假设你正在开发一个基于 Node.js 的大型 Web 应用,需要集成 CDN 来提升静态资源加载速度。阐述如何设计 CDN 缓存策略,以确保在资源更新时用户能及时获取到最新版本,同时在未更新时充分利用缓存提高加载效率,并且说明 Node.js 端如何配合实现这种策略。
18.6万 热度难度
前端开发Node.js

知识考点

AI 面试

面试题答案

一键面试

1. CDN 缓存策略设计

  • 版本控制
    • 在静态资源文件名中嵌入版本号,例如 styles.css?v=1.0script.js?v=2.1。每次资源更新时,手动更新版本号。CDN 会将不同版本号的资源视为不同的文件进行缓存。这样,当资源有更新时,由于版本号变化,用户浏览器会向 CDN 请求新的资源,而旧版本的资源在 CDN 中依然可以被缓存,未更新的用户仍能快速加载旧版本资源。
    • 使用哈希值作为版本号,例如通过构建工具(如 Webpack)在打包时计算文件内容的哈希值,将其嵌入文件名,如 styles.123abc.cssscript.456def.js。这种方式更精确,只要文件内容不变,哈希值就不变,CDN 可长期缓存;文件内容改变,哈希值改变,CDN 会缓存新资源,用户获取新内容。
  • 缓存时间设置
    • 对于不常更新的静态资源,如一些基础样式库、通用脚本库等,设置较长的缓存时间(如一年或数年)。可以通过在 CDN 配置中设置 HTTP 缓存头 Cache - Control: max - age = 31536000(一年的秒数)或 Expires 头来实现。这样在这段时间内,用户再次请求该资源时,CDN 直接从缓存中返回,大大提高加载效率。
    • 对于可能频繁更新的资源,如用户自定义样式、特定业务脚本等,设置较短的缓存时间(如数小时或一天)。例如设置 Cache - Control: max - age = 3600(一小时的秒数)。当缓存时间过期后,用户再次请求,CDN 会检查源站资源是否有更新,若有更新则返回新资源并更新缓存,若无更新则继续使用缓存资源。

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 缓存策略,保证用户能及时获取更新资源,同时充分利用缓存提高加载效率。