`
Fangrn
  • 浏览: 814300 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

高性能WEB开发(7) - JS、CSS的合并、压缩、缓存管理

    博客分类:
  • j2ee
阅读更多

    本篇文章主要讨论下目前JS,CSS 合并、压缩、缓存管理存在的一些问题,然后分享下自己项目中用到的1个处理方案,并提供1个实例下载。

存在的问题 :    
 
     合并、压缩文件主要有2方面的问题:
       1. 每次发布的时候需要运行一下自己写的bat文件或者其他程序把文件按照自己的配置合并和压缩。
 
       2. 因生产环境和开发环境需要加载的文件不一样,生产环境为了需要加载合并、压缩后的文件,而开发环境为了修改、调试方便,需要加载非合并、压缩的文件,所以 我们常常需要在JSP中类似与下面的判断代码:
<c:if test="${env=='prod'}">
   <script type="text/javascript" src="/js/all.js"></script>
</c:if>
<c:if test="${env=='dev'}">
   <script type="text/javascript" src="/js/1.js"></script>
   <script type="text/javascript" src="/js/2.js"></script>
   <script type="text/javascript" src="/js/3.js"></script>
</c:if>
     
    缓存问题:在现在JS满天飞的时代,大家都知道缓存能带来的巨大好处,但缓存确实非常麻烦的一个问题,相信很多人曾经历过下面的情况:为了让程序更快, 在服务器上为JS加上缓冲5天的代码,但产品更新后第二天就接到电话说系统出错,详细了解后就发现是缓存引起的,让用户删除缓存后就会OK。原因很简单, 就是你JS已经修改了,但用户还在使用缓存中的老JS。在经历几次这种情况,被领导数落了几次后。没办法只能把JS的缓冲去掉,或者改成8个小时。可这样 就完全失去了缓存的优势了,哪我们到底需要解决哪些问题才能让我们使用缓冲顺心如意了?
    1. 如何在修改了某个JS后,自动把所有引用该JS页面的代码中加上1个版本号?

 

    2. 该如何生成版本号,根据什么来产生这个版本号。

 

    可能有人为了解决上面的缓存问题,写了个JSP标签,通过标签读取JS、css文件的修改时间来作为版本号,从而来解决上面2个问题。但这种方法有下面 几个缺点:
    1. 每次请求都要通过标签读取读取文件的修改时间,速度慢。当然你可以把文件的修改时间放到缓存中,这样也会加到了内存使用量。

 

    2. 在HTML静态页面中用不了

 

    3. 如果你们公司是如下的部署发布方式(我们公司就是这样),则会失效。每次发布,不是直接覆盖之前的WEB目录,运维的为的发布方便,要求每次发布直接给他 们1个war包,他们会把之前WEB目录整个删除,然后上传现在的war包,这样就导致程序运行后,所有文件的最后修改时间都是解压war的时间。



分享自己项目中的处理方案:

      
    为了解决上面讨论过的问题,在下写了1个如下的组件,组件中根据我们自己的实际情况使用了文件大小来做为文件的版本号,虽然在文件修改很小(比如把字符 a改成b),可能文件大小并没有变,导致版本号也不会变。

 

但这种机率还是非常低的。当然如果你觉的使用文件修改时间作为版本号适合你,只需要修改一行代码就行,下面看下这个组件的处理流程(本来想用流 程图表达,最后还是觉的文字来的直白写):


    1. 程序启动(contextInitialized)

    2. 搜索程序目录下的所有merge.txt文件,根据merge.txt文件的配置合并文件, merge.txt文件实例如下:
# 文件合并配置文件,多个文件以|隔开,以/开头的表示从根目录开始, 
# 空格之后的文件名表示合并之后的文件名

# 把1,2,3合并到all文件中
1.js|2.js|3.js all.js

#合并CSS
/css/mian.css|/css/common.css all.css


    3. 搜索程序目录下所有JS,CSS文件(包括合并后的),每个文件都压缩后生成对应的1个新文件。

    4. 搜索程序目录下所有JSP,html文件,把所有JS,css的引用代码改成压缩后并加了版本号的引用。

实例:

 

    实例的文件结构如下图:
    

 

    看JSP原始代码(程序运行前):
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">
<% boolean isDev = false;  // 是否开发环境%>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
        <% if(isDev){ %>
        <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-1.4.2.js"></script>
        <script type="text/javascript" src="<%=request.getContextPath() %>/js/1.js"></script>
        <script type="text/javascript" src="<%=request.getContextPath() %>/js/2.js"></script>
        <link type="text/css" rel="stylesheet" href="<%=request.getContextPath() %>/css/1.css" />
        <link type="text/css" rel="stylesheet" href="<%=request.getContextPath() %>/css/2.css" />
        <% }else{ %>
        <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-1.4.2.js"></script>
        <script type="text/javascript" src="<%=request.getContextPath() %>/js/all.js"></script>
        <link type="text/css" rel="stylesheet"  href="<%=request.getContextPath() %>/css/all.css" />
        <% } %>
    </head>
    <body>
        <h1 class="c1">Hello World!</h1>
    </body>
</html>


    程序运行后JSP的代码:
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
    boolean isDev = false;  // 是否开发环境
%>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
        <% if(isDev){ %>
        <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-1.4.2-3gmin.js?99375"></script>
        <script type="text/javascript" src="<%=request.getContextPath() %>/js/1-3gmin.js?90"></script>
        <script type="text/javascript" src="<%=request.getContextPath() %>/js/2-3gmin.js?91"></script>
        <link type="text/css" rel="stylesheet" href="<%=request.getContextPath() %>/css/1-3gmin.css?35" />
        <link type="text/css" rel="stylesheet" href="<%=request.getContextPath() %>/css/2-3gmin.css?18" />
        <% }else{ %>
        <script type="text/javascript" src="<%=request.getContextPath() %>/js/jquery-1.4.2-3gmin.js?99375"></script>
        <script type="text/javascript" src="<%=request.getContextPath() %>/js/all-3gmin.js?180"></script>
        <link type="text/css" rel="stylesheet"  href="<%=request.getContextPath() %>/css/all-3gmin.css?53" />
        <% } %>
    </head>
    <body>
        <h1 class="c1">Hello World!</h1>
    </body>
</html>

    加3gmin后缀的文件全部是程序启动时自动 生成的。

 

实例下载:猛 击此处下载

 

PS:自己的设计的处理方案并没有解决"需 要JSP中加判断代码的问题",主要是因为还没有找到什么好的办法去自动删除1.js,2.js,3.js的3个引用,而插入1个新的all.js的引 用,如果那位同学对解决这个问题有好的想法,请不吝赐教。
      如果有同学想使用这个组件,建议在测试环境下运行一次后,把修改后的程序直接上传到正式服务器上,然后去掉这个功能,不然在服务器上每次启动都调用这个 功能还是需要花费一些时间和资源的 
       其实一直想使用SVN中的版本号来控制缓存,这个是最严谨的一个方法,但也因为做起来太复杂,所以一直也没做起来,以后以后有时间可以再研究。
分享到:
评论
1 楼 bohemia 2010-06-24  
plz google packtag。it's a nice solution for js and css compression and cache;

相关推荐

    高性能WEB开发 JS、CSS的合并、压缩、缓存管理

    在高性能Web开发中,JavaScript(JS)和 Cascading Style Sheets(CSS)的合并与压缩是提升网站性能的关键步骤。这两个操作能够减少HTTP请求的数量,从而加快页面加载速度,提高用户体验。然而,它们也带来了一些...

    js和css批量压缩工具

    "js和css批量压缩工具" 正是这样一个解决方案,它可以帮助我们在项目部署前有效地压缩和优化资源,提高网站的整体性能。 批量压缩的优势在于它可以一次性处理大量的文件,大大节省了手动操作的时间。对于大型项目或...

    js、css、img等浏览器缓存问题的2种解决方案.docx

    * 高性能 WEB 开发 JS、CSS 的合并、压缩、缓存管理 * 禁止 js 文件缓存的代码 * js 设置缓存及猎取设置的缓存 * JSP 页面缓存 cache 技术--扫瞄器缓存介绍及实现方法 * Js 代码中,ajax 恳求地址后加随机数防止扫瞄...

    高性能PHP应用开发-高清扫描

    8. **前端优化**:前端性能同样重要,比如压缩CSS、JS文件,合并HTTP请求,利用CDN加速静态资源加载,以及使用懒加载等技术,都能显著改善用户体验。 9. **持续监控与调优**:使用性能分析工具(如Xdebug、New ...

    Combres .net js/css压缩工具

    Combres .NET是一款高效且强大的JavaScript(js)和CSS(层叠样式表)压缩工具,专为.NET开发者设计。这个工具的主要目标是提高网站的性能,通过合并、压缩和缓存Web应用程序中的静态资源,从而减少HTTP请求的数量和...

    DivCss网页布局和高性能Web站点

    网页布局和高性能Web站点是现代互联网开发中的关键领域。DivCSS,全称为“层叠样式表(Cascading Style Sheets)”,是用于控制网页元素样式和布局的主要技术。DivCSS布局利用HTML的div标签,结合CSS,实现了内容与...

    高性能网站web开发之图片管理

    在高性能网站Web开发中,图片管理是一个至关重要的环节。它涉及到如何有效地存储、处理、优化以及展示图片,以提升用户体验并降低服务器负载。本篇内容将深入探讨与图片管理相关的技术点,结合提供的"ImageConvert....

    构建高性能WEB站点(完整版)

    《构建高性能WEB站点》是一本全面探讨Web系统优化的著作,涵盖了从客户端浏览器到服务器端的各个关键环节,旨在帮助开发者和运维人员提升网站的性能和用户体验。这本书深入剖析了Web系统的瓶颈,并提供了实用的解决...

    构建高性能web站点.pdf

    总的来说,《构建高性能Web站点》是一本全面覆盖Web性能优化的指南,无论你是开发人员、运维工程师还是网站管理员,都能从中受益,学习到提升Web站点性能的实用技术和最佳实践。通过本书的学习,你将能够创建出更...

    js 压缩工具、css压缩工具

    JavaScript和CSS压缩工具是Web开发中的重要组成部分,它们主要用于优化网站性能,通过减小文件大小来减少带宽消耗,从而加快网页的加载速度。在现代Web开发中,为了提供更好的用户体验,快速的页面加载时间至关重要...

    构建高性能web站点

    构建高性能web站点的知识点涵盖了从基础的网站架构设计到前端优化、后端性能提升、数据库优化、内容分发网络(CDN)的使用以及负载均衡等多个方面,每一个环节都至关重要。 1. 高效的网站架构设计: - 架构模式:...

    Python-webassets用于PythonWeb开发的静态资源管理

    在Python Web开发中,管理和优化静态资源如CSS、JavaScript、图片等是至关重要的。`webassets`库就是为了这个目的而设计的,它提供了一种高效、灵活的方式来处理这些资源,确保它们能被正确地合并、压缩和缓存,从而...

    构建高性能移动web

    在智能手机和移动设备普及的今天,构建高性能的移动Web成为了前端开发人员所面临的一项重要任务。移动Web能够覆盖更广泛的用户群体,并且可以跨平台运行,而不像原生应用那样受限于特定的操作系统。腾讯作为一家领先...

    构建高性能WEB站点

    3. 前端性能优化:包括使用浏览器渲染优化技术、减少DOM操作、合理使用JavaScript库和框架、CSS和JavaScript文件的合并与压缩、前端资源加载策略等。 4. 后端逻辑优化:后端框架的选择、业务逻辑的优化、内存使用...

    基于PHP的minify 自动压缩合并JS和CSS(减少请求数).zip

    "基于PHP的minify 自动压缩合并JS和CSS(减少请求数)"是一个解决这个问题的方案,它通过合并和压缩JavaScript (JS) 和 Cascading Style Sheets (CSS) 文件来减少网络请求的数量,从而加快页面的加载速度。 1. ...

    web 开发课件使用,入门,提高

    - Vue.js:轻量级框架,易于学习,具有高性能和可扩展性。 5. **后端开发** - Node.js:基于Chrome V8引擎的JavaScript运行环境,用于构建服务器端应用。 - PHP:广泛使用的服务器端脚本语言,适用于快速开发。 ...

    GWT性能优化,利用GWT开发高性能Ajax应用,始终做好缓存, 程序压缩

    【GWT性能优化:开发高性能Ajax应用的关键】 Google Web Toolkit(GWT)是Ajax开发领域的一个强大工具,它以其独特的特性和优势提升了Ajax应用的性能和用户体验。GWT通过将Java代码编译为高度优化的JavaScript,...

    高性能PHP应用开发

    1. **代码压缩**:通过合并CSS和JavaScript文件,减少HTTP请求次数,同时压缩代码以减小文件大小,如使用Gzip压缩。 2. **图片优化**:压缩图片以降低其大小,使用合适的图片格式(如SVG用于矢量图,WebP或JPEG 2000...

Global site tag (gtag.js) - Google Analytics