`
baseline
  • 浏览: 43484 次
  • 来自: ...
最近访客 更多访客>>
社区版块
存档分类
最新评论

网站性能优化- JS、CSS的合并、压缩、缓存管理

阅读更多

转帖:

网站性能优化- JS、CSS的合并、压缩、缓存管理

 

本篇文章主要讨论下目前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中的版本号来控制缓存,这个是最严谨的一个方法,但也因为做起来太复杂,所以一直也没做起来,以后以后有时间可以再研究。

分享到:
评论

相关推荐

    Munee:集图片尺寸调整、CSS-JS合并/压缩、缓存等功能于一身的PHP类库.zip

    Munee是一个集图片尺寸调整、CSS-JS合并/压缩、缓存等功能于一身的PHP库。可以在服务器端和客户端缓存资源。它集成了PHP图片操作库Imagine来实现图片尺寸调整和剪切,之后进行缓存。 Munee可以自动编译LESS、...

    Munee:集图片尺寸调整、CSS-JS合并/压缩、缓存等功能于一身的PHP类库

    Munee是一个集图片尺寸调整、CSS-JS合并/压缩、缓存等功能于一身的PHP库。可以在服务器端和客户端缓存资源。它集成了PHP图片操作库Imagine来实现图片尺寸调整和剪切,之后进行缓存。 Munee可以自动编译LESS、SCSS和...

    gulp JS CSS html 压缩优化 及 JS CSS 自动添加版本号

    总的来说,通过Gulp自动化流程,我们可以有效地对JS、CSS和HTML进行压缩优化,提升网站性能,并通过自动添加版本号解决浏览器缓存问题,确保用户始终能够获取最新的网页内容。这种实践方法对于现代前端开发来说是...

    minify v2.1.4 beta,css/js 优化压缩工具.zip

    《minify v2.1.4 beta:CSS/JS 优化压缩工具详解》 在现代网页开发中,提高页面加载速度是至关重要的。这不仅关乎用户体验,也影响着搜索引擎的排名。为此,开发者们常常使用各种工具来优化前端资源,其中minify v...

    jscss压缩合并工具JSCompress_

    JSCompress是一款强大的前端资源优化工具,主要功能是对JavaScript(js)和 Cascading Style Sheets(css)文件进行压缩和合并,从而显著减小网站的加载时间,提高页面性能。这对于现代网页开发至关重要,尤其是在...

    js css文件合并工具

    总的来说,"js&css合并工具"是为了提升网站性能而设计的,它通过减少HTTP请求次数和文件大小来加速页面加载。在实际开发中,结合其他优化技术(如延迟加载、代码分割、缓存策略等),可以实现更高效的Web应用。理解...

    js和css批量压缩工具

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

    compres实现js、css压缩合并

    4. 在部署时,服务器将只返回这些合并压缩后的文件,而不是原始的多个文件。 总的来说,通过JS和CSS的压缩合并,我们可以显著提升网页的加载速度,减少服务器负载,并提高用户满意度。这一技术是现代Web开发不可或...

    性能优化-高性能网站建设指南

    同时,通过使用图片压缩工具(如TinyPNG)、CSS和JavaScript压缩工具(如UglifyJS和CSSNano)可以有效提升性能。 4. **异步加载第三方脚本**:许多网站依赖第三方服务如广告、追踪脚本等,这些脚本往往会在加载页面...

    css js压缩

    在现代Web开发中,为了提高网站的加载速度和性能,CSS和JavaScript的压缩与优化是至关重要的步骤。本文将深入探讨“CSS js压缩”的概念、重要性以及如何进行这两种技术的优化。 首先,我们来理解CSS和JavaScript...

    css js 合并工具

    在IT行业中,优化网站性能是至关重要的,其中CSS和JavaScript的合并是常见的一种优化策略。"CSS JS 合并工具"就是这样的一个实用程序,它旨在帮助开发者将多个CSS和JavaScript文件整合到单个文件中,以此减少网页...

    大规模网站性能优化方法-高性能网站性能优化

    1. **压缩与合并资源**:通过合并CSS和JavaScript文件,减少HTTP请求的数量,同时对代码进行Gzip压缩,可以显著减少页面加载时间。 2. **图片优化**:使用恰当的文件格式(如WebP或JPEG 2000),压缩图片大小,采用...

    HTML CSS JS压缩工具

    压缩CSS的方式包括合并多个CSS文件为一个,移除空白符,转换颜色和长度的十六进制表示法为更紧凑的RGB或简写形式,以及内联CSS优化等。这样的工具可以帮助开发者快速地处理大量的CSS代码,提高加载速度。 ...

    js css eclipse压缩插件

    在实际开发过程中,除了压缩,还应考虑其他优化策略,如合并多个 CSS 或 JavaScript 文件以减少HTTP请求,利用缓存机制,以及采用延迟加载(lazy loading)技术等。结合这些方法,可以构建出高性能、响应快速的网页...

    JS CSS 压缩工具

    总的来说,JS和CSS压缩是优化网页性能的关键步骤,"JsCssZip.exe"这样的工具提供了便利,帮助开发者快速实现这一目标。理解并熟练运用这些工具,能有效提升网站的整体性能,为用户提供更好的浏览体验。

    web前端性能优化-人人都能做优化

    1. **合并CSS和JavaScript文件**:减少HTTP请求数是优化性能的重要步骤。如描述中所示,将多个CSS文件合并成一个可以降低网络请求次数,从而减少页面加载时间。例如,codesnippet.css被合并到style.css中,减少了...

    Javascript、CSS压缩

    总结来说,"Javascript、CSS压缩"是提高网站性能的重要手段,通过使用像AjaxMin这样的工具,开发者能够有效地压缩和优化JavaScript与CSS文件,降低页面加载时间,提升用户体验。而"JS、CSS压缩.exe"这样的本地工具则...

    js/css压缩

    总结,js和css压缩是优化网站性能的关键步骤。通过使用Closure Packer、YUI Compiler等工具,开发者可以有效地减小文件大小,提升网页加载速度,从而提供更好的用户体验。在实际项目中,结合其他优化策略,如延迟...

    合并、压缩js、css - Combres

    Combres是一个高效的ASP.NET资源管理库,它允许开发者轻松地对JavaScript(js)和 Cascading Style Sheets (CSS) 文件进行合并与压缩,从而减少HTTP请求的数量,提升网站性能,并有利于SEO优化。 首先,我们需要...

    图片压缩,CSS压缩,JS压缩

    在IT行业中,优化网站性能是至关重要的,其中一项关键技术就是对资源进行压缩,包括图片、CSS和JavaScript(JS)。本文将深入探讨如何利用Node.js和Grunt工具进行这些类型的文件压缩,以提升网页加载速度和降低...

Global site tag (gtag.js) - Google Analytics