`
huangyuanmu
  • 浏览: 289770 次
  • 性别: Icon_minigender_1
  • 来自: 龙城
社区版块
存档分类
最新评论

js页面缓存的一个解决办法

阅读更多

      由于效率的缘故,浏览器通常会缓存js文件,这就给我们带了一个问题:当服务器端部署的项目中的js文件进行了修改后,如果再客户端不手动去刷新一次页面,js的修改效果就不会起作用,因为浏览器还是用的缓存在本地的js文件。

 

       为了解决这个问题,我们采用了这个方案,每当发布新的版本部署到服务器上的时候,我们给html页面中引用的js增加一个新的后缀,形如版本号的东西。

 

<script language="javascript" src="view/shell/login.js?version=20081112050245"></script>

 

      为了自动完成这一功能,我们使用了ant,写了一个ant task来完成该项功能。

 

/**
 * 该任务遍历web目录,找出所有的模板文件,给js和css的引用加上版本号
 *
 * @version 1.0 2008-07-02
 * @author huangyuanmu 
 * @since JDK 1.5.0_8
 */
public class AddJsAndCssVersionToVm extends Task {

	private String path;

	public void execute() throws BuildException {
		Date date = new Date();
		SimpleDateFormat df = new SimpleDateFormat("yyyyMMddhhmmss");
		String version = df.format(date);
		addVersionToVm(path, version);
	}

	/**
	 * 遍历web目录中的vm文件,给js和css的引用加上版本号
	 *
	 * @author huangyuanmu 2008-07-02
	 * @param path
	 */
	private void addVersionToVm(String path, String version) {
		File dir = new File(path);
		File[] files = dir.listFiles();
		if (files == null)
			return;
		for (int i = 0; i < files.length; i++) {
			if (files[i].isDirectory()) {
				addVersionToVm(files[i].getAbsolutePath(), version);
			} else {
				String strFileName = files[i].getAbsolutePath().toLowerCase();
				// 如果是符合条件的文件,则添加版本信息
				if (strFileName.endsWith(".vm")
						|| strFileName.endsWith(".html")
						|| strFileName.endsWith(".jsp")) {
					// RandomAccessFile raf = null;
					InputStream is = null;
					OutputStream os = null;
					List<String> contentList = new ArrayList<String>();

					// 读文件
					try {
						is = new FileInputStream(files[i]);
						Reader r = new InputStreamReader(is);
						BufferedReader br = new BufferedReader(r);
						String line = null;
						while ((line = br.readLine()) != null) {
							String modLine = getModLine(line, version);
							if (modLine != null) {
								line = modLine;
							}
							line = line + "\r\n";
							contentList.add(line);
						}
						// 关闭流
						br.close();
						r.close();
					} catch (Exception e) {
						System.out.println("读文件失败");
						e.printStackTrace();
					} finally {
						if (null != is) {
							try {
								is.close();
							} catch (Exception e) {
								e.printStackTrace();
							}
						}

					}

					// 写文件
					try {
						os = new FileOutputStream(files[i]);
						Writer w = new OutputStreamWriter(os);
						BufferedWriter bw = new BufferedWriter(w);
						for (Iterator<String> it = contentList.iterator(); it
								.hasNext();) {
							String line = it.next();
							bw.write(line);
						}
						// 更新到文件
						bw.flush();
						// 关闭流
						bw.close();
						w.close();
					} catch (Exception e) {
						System.out.println("写文件失败");
						e.printStackTrace();
					} finally {
						if (null != os) {
							try {
								os.close();
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
					}
				}
			}
		}
	}

	/**
	 * 查找行中是否有js或css的引用,如果有,则加上版本号
	 *
	 * @author huangyuanmu 2008-07-03
	 * @param line
	 */
	private String getModLine(String line, String version) {
		// 增加js版本
		line.trim();
		if (line.startsWith("<script") && line.endsWith("</script>")) {
			int pos = line.indexOf(".js");
			String modLine = line.substring(0, pos) + ".js?version="
					+ version + "\"></script>";
			return modLine;
		} else if (line.startsWith("<link")
				&& line.endsWith("rel=\"stylesheet\" type=\"text/css\">")) {
			int pos = line.indexOf(".css");
			String modLine = line.substring(0, pos) + ".css?version="
					+ version
					+ "\" rel=\"stylesheet\" type=\"text/css\">";
			return modLine;
		} else {
			return null;
		}
	}

	public void setPath(String path) {
		this.path = path;
	}
}

 

      当然,这个程序的实现还有一些缺点。首先,模板文件中对js和css的引用必须规范,符合程序代码中描述的格式。另外,不管文件内容有没有改变,都加上了新的版本号,这会用户访问时不必要的网络流量,可能会对页面展现的速度产生一些影响。

 

      ant的build脚本文件在另外一篇中(http://huangyuanmu.iteye.com/admin/blogs/493144)。

 

分享到:
评论
1 楼 u012907473 2016-01-21  
水电费是否是否

相关推荐

    IE总是出现网页错误的解决办法

    清理浏览器的缓存和Cookies也是解决网页错误的有效方式之一。缓存中的过期文件或Cookies可能与当前网页版本不匹配,导致加载错误。定期清理这些数据可以避免此类问题的发生。 ### 五、更新DirectX DirectX是微软...

    IE缓存.e.rar

    3. 在某些情况下,如果遇到网页显示不正常的问题,清理缓存可能是解决办法之一,因为这能确保浏览器重新获取最新的网页数据。 在“压缩包子文件的文件名称列表”中看到的"IE缓存.e"可能是解压后会得到的一个文件夹...

    大数据架构师教你如何设计缓存架构_光环it学院培训机构.pdf

    解决办法是对静态内容和无登录需求的页面启用代理缓存,而对需要验证的页面则避免使用。地域问题则涉及多语言支持,通过设置`Accept-Language`头信息,确保不同语言版本的正确缓存。 服务器端的缓存,如内核缓存,...

    上半年福建省银行招聘计算机学知识点网络浏览器故障及解决办法试题.docx

    解决办法:刷新页面,清除浏览器缓存,检查浏览器的兼容性设置,或尝试其他浏览器查看是否同样问题。 4. 打不开特定网站 解决办法:检查是否被防火墙或安全软件阻止,尝试更改DNS设置,或者联系网站管理员确认...

    JSP 开发之Servlet解决网页缓存问题

    本文将详细讲解如何利用Servlet来解决网页缓存问题。 首先,我们需要理解浏览器缓存的工作原理。浏览器为了提高用户体验,会自动缓存访问过的网页内容,包括HTML、CSS、JavaScript文件以及图片等资源。当用户再次...

    大数据时代性能与缓存的优化

    解决办法包括设置合理的缓存过期时间,使用互斥锁,以及提供冗余缓存。 - 缓存击穿:针对热点数据的请求,导致数据库压力过大。可采用预热策略,即在缓存失效前先更新缓存。 综上所述,大数据时代的性能与缓存优化...

    Angularjs在360兼容模式下取数据缓存问题的解决办法

    Angularjs是一款用于构建Web应用程序的开源JavaScript框架,它是Google的一个项目,并由一个活跃的社区支持。360安全浏览器是一款由中国公司奇虎360开发的浏览器,支持多种模式浏览,包括兼容模式,用于模拟旧版...

    IE8下Ajax缓存问题及解决办法

    AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术。接下来通过本文给大家介绍IE8下Ajax缓存问题及解决办法,一起看下吧

    网页输入框不能输入解决办法

    ### 网页输入框不能输入解决办法 在日常使用浏览器的过程中,我们经常会遇到网页上的输入框无法正常使用的状况,具体表现为输入框始终呈现灰白色的状态,无法聚焦光标进行文字输入。这种情况不仅影响用户体验,同时...

    websphere常见问题及解决办法

    WebSphere 常见问题及解决办法详解 在本文中,我们将详细探讨 WebSphere 中的一些常见问题及其解决方法。WebSphere 是一个基于 Java 的应用服务器,广泛应用于企业级应用开发中。然而,在实际开发和部署过程中,...

    jquery .ajax 局部刷新之后 js无法调用问题解决

    解决办法是在`.ajax`的success回调中重新绑定事件: ```javascript $.ajax({ url: 'your-url', type: 'GET', success: function(data) { // 更新DOM $('#target').html(data); // 重新绑定事件 $('#new...

    IE6无法打开INTERNET站点的解决办法

    ### IE6无法打开INTERNET站点的解决办法 #### 背景与问题描述 在早期的互联网发展阶段,Internet Explorer 6(简称IE6)作为微软的一款浏览器,在很长一段时间内占据了非常重要的位置。然而,随着时间的发展和技术...

    2016年广东省银行招聘计算机学知识点:网络浏览器故障及解决办法试题.docx

    2. **JavaScript错误**:某些网页依赖JavaScript运行,如果出现JavaScript错误,可能导致页面功能失效。解决方法是更新浏览器至最新版本,或者开启JavaScript支持。 3. **兼容性问题**:不同浏览器对网页标准的实现...

    关于网页中区域名错误的解决办法

    网页中的区域名错误通常指的是由于各种原因导致网页无法正常加载或执行JavaScript代码时出现的问题。这类问题可能影响用户的浏览体验,甚至可能导致某些功能无法正常使用。本文将详细介绍如何解决这类问题。 首先,...

    IE浏览器卡死提示是否停止运行此脚本的解决办法.docx

    IE 浏览器卡死提示是否停止运行此脚本的解决办法 在使用 IE 浏览器时,经常会出现卡死的情况,提示是否停止运行此脚本,这不仅影响用户体验还会导致浏览器崩溃。这个问题的解决方法可以归结为禁用脚本功能选项的...

    清除css、javascript及背景图在浏览器中缓存的简单方法

    当需要更新CSS、JavaScript或背景图时,传统的解决办法是更改文件名,迫使浏览器认为这是一个全新的文件,从而加载新的版本。虽然有效,但这需要手动操作,且不易于维护。 更为优雅的解决方案是通过添加版本号或...

    struts 1.2 跳转后css或js 无效解决方法

    - 清理浏览器缓存是一个简单有效的办法,可以确保加载最新的CSS或JS文件。 - 在部署新版本的应用程序之前,也可以考虑更改文件名(如添加时间戳),这样浏览器会认为这是一个新的文件而重新下载。 4. **框架配置...

    各浏览器如何清除缓存.docx

    浏览器缓存是网络浏览过程中非常重要的一个组成部分,它存储了我们访问过的网页的静态资源,如图片、JavaScript 文件和 CSS 样式表等,目的是为了加快网页加载速度,提高用户体验。然而,有时缓存可能会导致网页加载...

Global site tag (gtag.js) - Google Analytics