js,css等静态文件更新时如何处理浏览器缓存

js,css等静态文件更新时如何避免浏览器缓存
web网站上线后,经常需要更新js,css,img等静态文件,但浏览器又会缓存这些静态文件,如何在更新时让浏览器获取到最新的文件呢?
如果在每个静态文件后面加上一个版本号,

统一配置,那每次更新版本,所有的静态文件都会一起更新,有什么办法可以只更新这次有更新的文件,而其它没更新的不变
------解决思路----------------------
那除非你手写?1,?2,?3这种格式了……
------解决思路----------------------
除非你浏览器问题 不然不会出现这个问题

请求一个静态文件浏览器会发出对应的请求头

该文件HASH不存在浏览器缓存中,而服务器又有存在这个文件则 浏览器下载这个文件,这是返回代码是200

如果HASH存在,则请求头会发送一个文件创建有时间,而这个时间和服务器上这个文件创建时间一直, 则返回代码304,浏览器读取本地文件
------解决思路----------------------
在asp.net中,你可以这样创建一个 IncludeJs.asax
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="IncludeJs.ascx.cs" Inherits="IncludeJs" %>
using System;
using System.IO;
using System.Web.UI;

public partial class IncludeJs : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        var file = new FileInfo(MapPath(this.Path));
        ScriptManager.RegisterClientScriptInclude(this.Page,
            typeof(Page),
            file.FullName,
            ResolveUrl(this.Path) + "?v=" + file.LastWriteTime.Ticks);
    }

    public string Path { get; set; }
}


然后,首先编译它(按 Ctrl+Shift+B 键)。

然后你可以把它拖入任何页面,来取代你的js声明。例如拖入 Default.aspx成为(aspx自动添加必要的注册语句,并且自动感知 Path 属性的存在)
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<%@ Register Src="~/IncludeJs.ascx" TagPrefix="uc1" TagName="IncludeJs" %>


<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title></title>
    <uc1:IncludeJs runat="server" ID="IncludeJs" Path="~/jquery-1.8.2.js" />
</head>
<body>
    <form id="form1" runat="server">
        <div>
        </div>
    </form>
</body>
</html>


------解决思路----------------------
一般来说每个文件都有自己的版本号(自己按实际情况规定),例如jquery 文件:为 jquery.1.9.1 
那么,自己的 base.js  可以为 base.1.3.1 .js
而不是每个文件的版本号都是一样的 App.Version
另外,例如 base.1.3.1.js 被几十个页面用到,当修改为 base.1.4.js 时,就要去修改用到这个脚本的页面,
这种情况下可以用sp1234大哥的做法。
------解决思路----------------------
对于css,我以前写过一个,可以参考这里的 ascx   http://bbs.csdn.net/topics/390932110
------解决思路----------------------
地址加版本号吧
------解决思路----------------------
在js地址后面增加时间戳 *.js?t=xxxxxx
------解决思路----------------------
引用js后面加版本号参数就可以了。



后台lbVersion.Text赋值成当前版本号
lbVersion.Text = asm.GetName().Version.ToString();

部署是js不变也没有关系,引用的地方参数变了,浏览器只是会再次下载js文件而已。

相关内容推荐