Nodejs环境下浏览器三种刷新的区别

Nodejs环境下浏览器三种刷新的区别

本文是新手扫盲,高手勿喷哦~

我们一直在用着浏览器刷新,其实刷新也是有一些小学问的哦,我们常见的三种刷新:

1、url+enter或者a标签的超链接点击

2、F5刷新

3、ctrl+F5刷新

这三种刷新究竟有何不同呢?举三个简单的例子大家就明白了。

条件:此url路径您已经使用浏览器最近访问过,并没有超过缓存的时间,比如您在前1分钟刚刚访问过此url路径。

1、url+enter或者a标签的超链接点击

enter image description here

哇!一张我梦想座驾三菱EVO X的图片出现了。

我们发现用firebug查看网络请求是灰色的,后面说明此请求来自于缓存,其实此请求并没有发送到后端node.js,而是浏览器直接读取的缓存的数据。这里只需要在 response.setHeader(‘Cache-Control’, ‘public, max-age=3600’); //缓存一小时

2、F5刷新

还是那个url地址,只不过这次我轻轻的按了下F5哦~

enter image description here

EVO X还是那么帅啊,哈哈。

我们仔细看响应状态码,变成304了,这里浏览器是去请求了后端node.js服务器,同时它带上了2个重要的参数:

1、If-Modified-Since:对应的node.js响应头 Last-Modified

2、If-None-Match:对应的node.js响应头 Etag

当node.js服务器收到这样的http请求后,则去判断是否需要更新客户端的缓存,至于使用 Last-Modified 还是 Etag 来判断缓存是否更新就要看您的node.js服务器代码是怎么写的了。

expressjs是优先判断Etag,至于Etag的值如何获取,也要看您使用的web服务器是怎么获取的,可以是修改时间+文件大小的md5值或者其他。

如果node.js服务器判断 Last-Modified 还是 Etag 后认为此请求资源还在缓存,然后返回 304状态码,和最新的 Last-Modified和Etag。

并且响应头没有“Content-Length”属性,说明响应的body是空的,

浏览器收到304状态码以后,认为资源未被修改,所以就去取缓存响应给用户了。

3、ctrl+F5刷新

强制刷新!

enter image description here

EVO X还是那么霸气!虽然已经停产了!

我们可以仔细看下请求头,没有了第2种情况的2个缓存头,和第一次来访问此url地址是一样的,所以node.js服务器就直接将图片响应给浏览器了,所以这里的151.1KB是这张图片的大小,不使用任何浏览器缓存。

总结发言:

三种刷新的情况相信您已经全看明白了,百分之90%的用户是使用第一或者第二种的,所以缓存技术至关重要。对于一些不经常修改的页面完全可以使用 Cache-Control 让请求都不用发了,节约服务器资源,快速响应。对于一些静态图片等一定要加上 Last-Modified 或者 Etag,因为一般此类资源体积都比较大,缓存做好的话可以提高不少效率。

当然不论是静态文件还是json数据或者是html数据都可以充分的利用浏览器缓存,只要你遵循http协议。

最后广告时间:

大家有时间多关注下node.js的高性能restful框架rrestjs哦。

文章地址:http://club.cnodejs.org/topic/4f16442ccae1f4aa27001039

github:https://github.com/DoubleSpout/rrestjs

新手入门:http://www.rrestjs.com/study


9 回复

Nodejs环境下浏览器三种刷新的区别

本文是新手扫盲,高手勿喷哦~

我们一直在用着浏览器刷新,其实刷新也是有一些小学问的哦,我们常见的三种刷新:

  1. url+enter或者a标签的超链接点击
  2. F5刷新
  3. ctrl+F5刷新

这三种刷新究竟有何不同呢?举三个简单的例子大家就明白了。

条件

此url路径您已经使用浏览器最近访问过,并没有超过缓存的时间,比如您在前1分钟刚刚访问过此url路径。

1、url+enter或者a标签的超链接点击

当我们通过输入URL并按下回车键或点击一个超链接时,浏览器会检查本地缓存中是否有该资源。如果有,且缓存未过期,浏览器会直接从缓存中读取资源。

// 示例:设置缓存控制
app.get('/image', (req, res) => {
    res.setHeader('Cache-Control', 'public, max-age=3600'); // 缓存一小时
    res.sendFile(__dirname + '/path/to/image.jpg');
});

2、F5刷新

当我们按下F5键进行刷新时,浏览器会向服务器发送请求,但同时会带上缓存相关的头信息(如If-Modified-SinceIf-None-Match),以便服务器判断资源是否需要更新。

// 示例:处理缓存验证
app.get('/image', (req, res) => {
    const lastModified = new Date(fs.statSync(__dirname + '/path/to/image.jpg').mtime).toUTCString();
    const etag = crypto.createHash('md5').update(fs.readFileSync(__dirname + '/path/to/image.jpg')).digest('hex');

    if (req.headers['if-modified-since'] === lastModified || req.headers['if-none-match'] === etag) {
        res.status(304);
        return;
    }

    res.set('Last-Modified', lastModified);
    res.set('ETag', etag);
    res.sendFile(__dirname + '/path/to/image.jpg');
});

3、ctrl+F5刷新

当我们按下Ctrl+F5键进行强制刷新时,浏览器会忽略所有缓存信息,直接向服务器请求资源。

// 示例:处理强制刷新
app.get('/image', (req, res) => {
    res.removeHeader('Cache-Control');
    res.removeHeader('ETag');
    res.removeHeader('Last-Modified');
    res.sendFile(__dirname + '/path/to/image.jpg');
});

总结发言

三种刷新的情况相信您已经全看明白了,百分之90%的用户是使用第一或者第二种的,所以缓存技术至关重要。对于一些不经常修改的页面完全可以使用 Cache-Control 让请求都不用发了,节约服务器资源,快速响应。对于一些静态图片等一定要加上 Last-Modified 或者 ETag,因为一般此类资源体积都比较大,缓存做好的话可以提高不少效率。

当然不论是静态文件还是JSON数据或者是HTML数据都可以充分的利用浏览器缓存,只要你遵循HTTP协议。

最后广告时间

大家有时间多关注下Node.js的高性能RESTful框架rrestjs哦。

文章地址:http://club.cnodejs.org/topic/4f16442ccae1f4aa27001039

GitHub:https://github.com/DoubleSpout/rrestjs

新手入门:http://www.rrestjs.com/study


只是firefox这样?chromium和ie呢?

这个贴不让我回复~ ,囧

浏览器表现不一样

现在才晓得…

今天上午试了下,IE和FF相同,chrome有点小区别,就是第一种情况和第二种情况都是304,总体实现差不多。

试了IE和CHROME,总体和FF表现相同

我习惯都是ctrl+F5的

楼主卖萌很拿手啊。

在Node.js环境中,浏览器的三种刷新方式会对缓存机制产生不同的影响。以下是三种刷新方式及其工作原理:

1. URL + Enter 或 a标签的超链接点击

这种刷新方式会直接从浏览器的缓存中读取资源,不会向服务器发起新的请求。

示例代码

// 在Express.js中设置缓存
app.use((req, res, next) => {
    res.setHeader('Cache-Control', 'public, max-age=3600'); // 缓存一小时
    next();
});

2. F5刷新

这种刷新方式会向服务器发起请求,并检查资源是否有更新。服务器通过 Last-ModifiedEtag 头来判断资源是否需要更新。

示例代码

// 在Express.js中处理缓存
app.use((req, res, next) => {
    const lastModified = new Date().toUTCString();
    const etag = `${lastModified}-${req.url}`; // 示例Etag生成方式

    res.setHeader('Last-Modified', lastModified);
    res.setHeader('ETag', etag);

    if (req.headers['if-modified-since'] === lastModified || req.headers['if-none-match'] === etag) {
        res.status(304).send(); // 资源未更新
    } else {
        res.status(200).send('Your resource data');
    }
    next();
});

3. Ctrl + F5刷新

这种刷新方式会忽略所有缓存,直接向服务器请求最新的资源。

示例代码

// 在Express.js中处理资源请求
app.get('/image.png', (req, res) => {
    res.sendFile(__dirname + '/image.png'); // 直接发送文件
});

总结

  • URL + Entera标签点击:直接读取缓存。
  • F5刷新:检查缓存并更新。
  • Ctrl + F5刷新:忽略缓存,请求最新资源。

合理配置缓存策略能够显著提升用户体验和服务器性能。

回到顶部