88457112 2019-02-01
先思考两个问题?
缓存头Cache-Control的一些特性
可缓存性
到期
重新验证
其它
示例
<html> <head> <meta charset="utf-8" /> <title>cache-control</title> </head> <body> <script src="/script.js"></script> </body> </html>
浏览器输入http://localhost:3010/ 加载cache-control.html文件,该文件会请求http://localhost:3010/script.js,在url等于/script.js设置cache-control的max-age进行浏览器缓存
const http = require('http'); const fs = require('fs'); const port = 3010; http.createServer((request, response) => { console.log('request url: ', request.url); if (request.url === '/') { const html = fs.readFileSync('./example/cache/cache-control.html', 'utf-8'); response.writeHead(200, { 'Content-Type': 'text/html', }); response.end(html); } else if (request.url === '/script.js') { response.writeHead(200, { 'Content-Type': 'text/javascript', 'Cache-Control': 'max-age=200' }); response.end("console.log('script load')"); } }).listen(port); console.log('server listening on port ', port);
浏览器运行结果,没有什么问题,正常响应
控制台运行结果
... response.writeHead(200, { 'Content-Type': 'text/javascript', 'Cache-Control': 'max-age=200' }); response.end("console.log('script load !!!')"); ...
浏览器运营结果
第二次运行,从memory cahce读取,浏览器控制台并没有打印修改过的内容
控制台运营结果
指请求了/ 并没有请求 /script.js
以上结果浏览器并没有返回给我们服务端修改的结果,这是为什么呢?是因为我们请求的url/script.js没有变,那么浏览器就不会经过服务端的验证,会直接从客户端缓存去读,就会导致一个问题,我们的js静态资源更新之后,不会立即更新到我们的客户端,这也是前端开发中常见的一个问题,我们是希望浏览器去缓存我们的静态资源文件(js、css、img等)我们也不希望服务端内容更新了之后客户端还是请求的缓存的资源, 解决办法也就是我们在做js构建流程时,把打包完成的js文件名上根据它内容hash值加上一串hash码,这样你的js文件或者css文件等内容不变,这样生成的hash码就不会变,反映到页面上就是你的url没有变,如果你的文件内容有变化那么嵌入到页面的文件url就会发生变化,这样就可以达到一个更新缓存的目的,这也是目前前端来说比较常见的一个静态资源方案。
作者:五月君
链接:https://www.imooc.com/article/72190