网上有好提供压缩的组件,但个人感觉比较麻烦,要配置好多东西,还会压缩整个文件夹下面的文件,Php网站提供了一种传参数的方法,在我的以前文件里面有提到过,不过我没有贴出完整的解决方法,今天把代码直接贴出来,供大家参考学习,直接上代码了:
实现原理,利用Urlwriter组件,重定向要压缩的文件,如样例:
script type="text/javascript" src="http://localhost/NhibernateWeb/Js/jquery?v=js/jquery-1.7.2.js,js/validate/jquery.metadata.js"></script>
1、web.config
<configSections> <!--设置地址重写组件--> <section name="rewriter" requirePermission="false" type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter"></section> </configSections> <!--rewriter config--> <rewriter file="~/App_Data/rewrite.xml"/>
2、重写文件rewrite.xml
<?xml version="1.0" encoding="utf-8" ?> <rewriteRules> <rewrite url="^~/Js/jquery\?v=([0-9a-zA-Z\.,-\/]+)$" to="~/MegerCompress.ashx" /> </rewriteRules>
3、前台文件 MegerJsCss.aspx
<html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title></title> <link type="text/css" href="http://localhost/NhibernateWeb/PagecontrolStyle.css" /> <link type="text/css" href="Css/index.css" rel="Stylesheet"/> <script type="text/javascript" src="http://localhost/NhibernateWeb/Js/jquery?v=js/jquery-1.7.2.js,js/validate/jquery.metadata.js"></script> <script type="text/javascript"> $(function() { jQuery.mytest = function() { alert("ok"); } }) $(function() { $.mytest(); }) </script> </head> <body> <form id="form1" runat="server"> <div style="width:100%;height:500px;"> </div> </form> </body> </html>
4、后台处理文件 MegerCompress.ashx
Imports System.Web Imports System.Web.Services Imports System.Collections.Generic Imports System.Text Imports System.IO Imports Yahoo.Yui.Compressor Public Class MegerCompress Implements System.Web.IHttpHandler Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest context.Response.ContentType = "text/javascript" 'context.Response.Write("function f(){}") Dim s As String = context.Request("v") Dim jspath() As String = s.Split(",") Dim strContent As New StringBuilder For i As Integer = 0 To jspath.Length - 1 Next Dim fpath As String = System.Web.HttpContext.Current.Server.MapPath(jspath(0)) If File.Exists(fpath) Then '读取文本 Dim sr As New StreamReader(fpath, System.Text.Encoding.UTF8) Dim str As String = sr.ReadToEnd() sr.Close() strContent.Append(str) End If Dim js As New JavaScriptCompressor(strContent.ToString(), False, Encoding.UTF8, System.Globalization.CultureInfo.CurrentCulture) context.Response.Write(js.Compress) End Sub ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable Get Return False End Get End Property End Class
个人测试结果分享:
编号 | 行为 | 页面大小 | 时间 |
---|---|---|---|
1 | 按文件路径逐个加载 | 490.7K | 500ms(onload2.45s) |
2 | 动态加载(上面) | 334.1 | 1.97s(onload3.73s) |
3 | 用工具压缩成一个文件 | 334.1 | 391ms(onload3.07s) |
结论上面的方法可以实现动态按需加载,但问题是效率不怎么高,最好是用工具压缩需要的文件,最好加载压缩文件。