緩存流程:
1.第一次S->C:"Last-Modified::xxxx"
2.第二次C->S:"If-Modified-Since:xxxx"
3.第二次S->C: 200 || 304
注意測(cè)試前先把瀏覽器f12工具設(shè)置里的Disable cache關(guān)掉
不帶緩存機(jī)制
const http = require('http')
const fs = require('fs')
const url = require('url')
http.createServer((req,res)=>{
let {pathname} = url.parse(req.url)
//獲取文件日期
fs.stat(`www${pathname}`,(err,stat)=>{
if(err){
res.writeHeader(404)
res.write('Not Found')
res.end()
}else{
let rs = fs.createReadStream(`www${pathname}`)
//stat.mtime可以獲取到文件的最后修改時(shí)間晦雨,是個(gè)Date對(duì)象
//toUTCString()用于將Date對(duì)象轉(zhuǎn)化為標(biāo)準(zhǔn)GMT時(shí)間
res.setHeader('Last-Modified',stat.mtime.toUTCString())
//輸出
rs.pipe(res)
rs.on('error',err=>{
res.writeHeader(404)
res.write('Not Found')
res.end()
})
}
})
}).listen(5000)
第一次請(qǐng)求:在響應(yīng)頭里出現(xiàn)了Last-Modified
第二次請(qǐng)求:在請(qǐng)求頭里出現(xiàn)了If-Modified-Since
帶緩存機(jī)制
const http = require('http')
const fs = require('fs')
const url = require('url')
http.createServer((req,res)=>{
let {pathname} = url.parse(req.url)
//獲取文件日期
fs.stat(`www${pathname}`,(err,stat)=>{
if(err){
res.writeHeader(404)
res.write('Not Found')
res.end()
}else{
if(req.headers['if-modified-since']){
let client_date = Math.floor(new Date(req.headers['if-modified-since']).getTime() / 1000);
let server_date = Math.floor(stat.mtime.getTime() / 1000);//以秒為單位
if(client_date < server_date){//服務(wù)器文件的時(shí)間靠后
sendFileToClient()
}else{
res.writeHeader(304)
res.write('Not Modified')
res.end()
}
}else{
sendFileToClient()
}
function sendFileToClient(){//封裝響應(yīng)函數(shù)
let rs = fs.createReadStream(`www${pathname}`)
//stat.mtime可以獲取到文件的最后修改時(shí)間,是個(gè)Date對(duì)象
//toUTCString()用于將Date對(duì)象轉(zhuǎn)化為標(biāo)準(zhǔn)GMT時(shí)間
res.setHeader('Last-Modified',stat.mtime.toUTCString())
//輸出
rs.pipe(res)
rs.on('error',err=>{
res.writeHeader(404)
res.write('Not Found')
res.end()
})
}
}
})
}).listen(5000)
兩次請(qǐng)求后:
修改一下請(qǐng)求的html文件昆烁,然后重新請(qǐng)求涮拗,文件大小為615B:
刷新瀏覽器突照,第二次請(qǐng)求默穴,文件大小90B:
緩存可以節(jié)約帶寬流量