Javascript开发之js压缩篇
来源:百度文库 编辑:神马文学网 时间:2024/05/01 04:15:53
Extjs可以说是目前最优秀的js开发库了。除了那个蹩脚的GPLV3授权。
但是使用中遇到的第一个问题就是,Extjs那庞大的个头。想办法压缩ExtJS的大小成了首先要解决的问题。
谈谈我的解决方法,欢迎拍砖。突然发现前面那个广告贴被锁了
1、压缩混淆
除了ExtJS的大个子以外,引用的很多其他的js库,项目中自己的js文件等等。采用OPOA组件式开发最后一定会增大js文件的总量。所以项目后期要对这些文件进行压缩合并。现在流行的js压缩工具有很多,如packer,jsMin,Esc,JSA,yui-compressor等等。经过实际使用我选的是yui-compressor.
yui-compressor项目地址:http://developer.yahoo.com/yui/compressor/
下载后得到一个java开发的jar包。使用方法基于命令行:
java -jar yuicompressor-x.y.z.jar [options] [input file]
开发中的js文件不可能一个个的手动压缩,这里用到了ANT。在项目构建中可以替你完成以上任务。
Java代码
2、gzip压缩。
坛子里讨论的gzip压缩有2种,
一是有的容器(服务器)提供的功能,但这个局限于特定容器。比如apache+tomcat或者resin-pro版。
二是部署前手动gzip压缩,配合servlet过滤器使用,这个能实现gzip功能,但是降低了灵活性。
我自己用的是自己的实现,采用gzip servlet filter实现。下面是我的代码参考网上内容.
Java代码
Java代码
Java代码
实际使用的效果以http://demo.slivercrm.cn:8084为例
登陆窗口:
首页:
但是使用中遇到的第一个问题就是,Extjs那庞大的个头。想办法压缩ExtJS的大小成了首先要解决的问题。
谈谈我的解决方法,欢迎拍砖。突然发现前面那个广告贴被锁了
1、压缩混淆
除了ExtJS的大个子以外,引用的很多其他的js库,项目中自己的js文件等等。采用OPOA组件式开发最后一定会增大js文件的总量。所以项目后期要对这些文件进行压缩合并。现在流行的js压缩工具有很多,如packer,jsMin,Esc,JSA,yui-compressor等等。经过实际使用我选的是yui-compressor.
yui-compressor项目地址:http://developer.yahoo.com/yui/compressor/
下载后得到一个java开发的jar包。使用方法基于命令行:
java -jar yuicompressor-x.y.z.jar [options] [input file]
开发中的js文件不可能一个个的手动压缩,这里用到了ANT。在项目构建中可以替你完成以上任务。
Java代码
"yuicompressor" value="${tools}/yuicompressor-2.3.6.jar" /> -
"java" parallel="false" verbose="true" dest="${dist}/WebRoot"> -
"${dist}/WebRoot"> -
"modules/*.js" /> -
"js/*.js" /> -
"-jar" /> -
"${yuicompressor}" /> -
"--type js --charset UTF-8 -o" /> -
-
"glob" from="*.js" to="*-m.js" /> -
"${dist}/WebRoot/js/base.js" encoding="UTF-8" > -
"${dist}/WebRoot/js"> -
"*-m.js" /> -
"${dist}/WebRoot/modules/modules.js" encoding="UTF-8" > -
"${dist}/WebRoot/modules"> -
"*-m.js" /> -
-
"${dist}/WebRoot"> -
"js/*.js"/> -
"modules/*.js"/> -
"modules/modules.js" /> -
"js/base.js" />
2、gzip压缩。
坛子里讨论的gzip压缩有2种,
一是有的容器(服务器)提供的功能,但这个局限于特定容器。比如apache+tomcat或者resin-pro版。
二是部署前手动gzip压缩,配合servlet过滤器使用,这个能实现gzip功能,但是降低了灵活性。
我自己用的是自己的实现,采用gzip servlet filter实现。下面是我的代码参考网上内容.
Java代码
- package sh.blog.util.web.filter;
- import java.io.IOException;
- import java.util.zip.GZIPOutputStream;
- import javax.servlet.ServletOutputStream;
- public class CompressedStream extends ServletOutputStream {
- private ServletOutputStream out;
- private GZIPOutputStream gzip;
- /**
- * 指定压缩缓冲流
- * @param 输出流到压缩
- * @throws IOException if an error occurs with the {@link GZIPOutputStream}.
- */
- public CompressedStream(ServletOutputStream out) throws IOException {
- this.out = out;
- reset();
- }
- /** @see ServletOutputStream * */
- public void close() throws IOException {
- gzip.close();
- }
- /** @see ServletOutputStream * */
- public void flush() throws IOException {
- gzip.flush();
- }
- /** @see ServletOutputStream * */
- public void write(byte[] b) throws IOException {
- write(b, 0, b.length);
- }
- /** @see ServletOutputStream * */
- public void write(byte[] b, int off, int len) throws IOException {
- gzip.write(b, off, len);
- }
- /** @see ServletOutputStream * */
- public void write(int b) throws IOException {
- gzip.write(b);
- }
- /**
- * Resets the stream.
- *
- * @throws IOException if an I/O error occurs.
- */
- public void reset() throws IOException {
- gzip = new GZIPOutputStream(out);
- }
- }
package sh.blog.util.web.filter;import java.io.IOException;import java.util.zip.GZIPOutputStream;import javax.servlet.ServletOutputStream;public class CompressedStream extends ServletOutputStream {private ServletOutputStream out;private GZIPOutputStream gzip;/*** 指定压缩缓冲流* @param 输出流到压缩* @throws IOException if an error occurs with the {@link GZIPOutputStream}.*/public CompressedStream(ServletOutputStream out) throws IOException {this.out = out;reset();}/** @see ServletOutputStream * */public void close() throws IOException {gzip.close();}/** @see ServletOutputStream * */public void flush() throws IOException {gzip.flush();}/** @see ServletOutputStream * */public void write(byte[] b) throws IOException {write(b, 0, b.length);}/** @see ServletOutputStream * */public void write(byte[] b, int off, int len) throws IOException {gzip.write(b, off, len);}/** @see ServletOutputStream * */public void write(int b) throws IOException {gzip.write(b);}/*** Resets the stream.** @throws IOException if an I/O error occurs.*/public void reset() throws IOException {gzip = new GZIPOutputStream(out);}}
Java代码
- package sh.blog.util.web.filter;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletOutputStream;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpServletResponseWrapper;
- public class CompressionResponse extends HttpServletResponseWrapper {
- protected HttpServletResponse response;
- private ServletOutputStream out;
- private CompressedStream compressedOut;
- private PrintWriter writer;
- protected int contentLength;
- /**
- * 创建一个新的被压缩响应给HTTP
- *
- * @param response the HTTP response to wrap.
- * @throws IOException if an I/O error occurs.
- */
- public CompressionResponse(HttpServletResponse response) throws IOException {
- super(response);
- this.response = response;
- compressedOut = new CompressedStream(response.getOutputStream());
- }
- /**
- * Ignore attempts to set the content length since the actual content length
- * will be determined by the GZIP compression.
- *
- * @param len the content length
- */
- public void setContentLength(int len) {
- contentLength = len;
- }
- /** @see HttpServletResponse * */
- public ServletOutputStream getOutputStream() throws IOException {
- if (null == out) {
- if (null != writer) {
- throw new IllegalStateException("getWriter() has already been called on this response.");
- }
- out = compressedOut;
- }
- return out;
- }
- /** @see HttpServletResponse * */
- public PrintWriter getWriter() throws IOException {
- if (null == writer) {
- if (null != out) {
- throw new IllegalStateException("getOutputStream() has already been called on this response.");
- }
- writer = new PrintWriter(compressedOut);
- }
- return writer;
- }
- /** @see HttpServletResponse * */
- public void flushBuffer() {
- try {
- if (writer != null) {
- writer.flush();
- } else if (out != null) {
- out.flush();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- /** @see HttpServletResponse * */
- public void reset() {
- super.reset();
- try {
- compressedOut.reset();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- /** @see HttpServletResponse * */
- public void resetBuffer() {
- super.resetBuffer();
- try {
- compressedOut.reset();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
- /**
- * Finishes writing the compressed data to the output stream. Note: this
- * closes the underlying output stream.
- *
- * @throws IOException if an I/O error occurs.
- */
- public void close() throws IOException {
- compressedOut.close();
- }
- }
package sh.blog.util.web.filter;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletOutputStream;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpServletResponseWrapper;public class CompressionResponse extends HttpServletResponseWrapper {protected HttpServletResponse response;private ServletOutputStream out;private CompressedStream compressedOut;private PrintWriter writer;protected int contentLength;/*** 创建一个新的被压缩响应给HTTP** @param response the HTTP response to wrap.* @throws IOException if an I/O error occurs.*/public CompressionResponse(HttpServletResponse response) throws IOException {super(response);this.response = response;compressedOut = new CompressedStream(response.getOutputStream());}/*** Ignore attempts to set the content length since the actual content length* will be determined by the GZIP compression.** @param len the content length*/public void setContentLength(int len) {contentLength = len;}/** @see HttpServletResponse * */public ServletOutputStream getOutputStream() throws IOException {if (null == out) {if (null != writer) {throw new IllegalStateException("getWriter() has already been called on this response.");}out = compressedOut;}return out;}/** @see HttpServletResponse * */public PrintWriter getWriter() throws IOException {if (null == writer) {if (null != out) {throw new IllegalStateException("getOutputStream() has already been called on this response.");}writer = new PrintWriter(compressedOut);}return writer;}/** @see HttpServletResponse * */public void flushBuffer() {try {if (writer != null) {writer.flush();} else if (out != null) {out.flush();}} catch (IOException e) {e.printStackTrace();}}/** @see HttpServletResponse * */public void reset() {super.reset();try {compressedOut.reset();} catch (IOException e) {throw new RuntimeException(e);}}/** @see HttpServletResponse * */public void resetBuffer() {super.resetBuffer();try {compressedOut.reset();} catch (IOException e) {throw new RuntimeException(e);}}/*** Finishes writing the compressed data to the output stream. Note: this* closes the underlying output stream.** @throws IOException if an I/O error occurs.*/public void close() throws IOException {compressedOut.close();}}
Java代码
- /**
- * 如果浏览器支持解压缩,则压缩该代码
- * @throws IOException ServletException if an error occurs with the {@link GZIPOutputStream}.
- * 如果需要开启该过滤器,在web.xml中加入此代码
-
-
gzip -
com.strongit.finance.gzip -
-
gzip -
*.jsp - */
- package sh.blog.util.web.filter;
- import java.io.IOException;
- import java.util.Enumeration;
- import javax.servlet.Filter;
- import javax.servlet.FilterChain;
- import javax.servlet.FilterConfig;
- import javax.servlet.ServletException;
- import javax.servlet.ServletRequest;
- import javax.servlet.ServletResponse;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- public class CompressionFilter implements Filter {
- protected Log log = LogFactory.getFactory().getInstance(this.getClass().getName());
- @SuppressWarnings("unchecked")
- public void doFilter(ServletRequest request, ServletResponse response,
- FilterChain chain) throws IOException, ServletException {
- boolean compress = false;
- if (request instanceof HttpServletRequest){
- HttpServletRequest httpRequest = (HttpServletRequest) request;
- Enumeration headers = httpRequest.getHeaders("Accept-Encoding");
- while (headers.hasMoreElements()){
- String value = (String) headers.nextElement();
- if (value.indexOf("gzip") != -1){
- compress = true;
- }
- }
- }
- if (compress){//如果浏览器支持则压缩
- HttpServletResponse httpResponse = (HttpServletResponse) response;
- httpResponse.addHeader("Content-Encoding", "gzip");
- CompressionResponse compressionResponse= new CompressionResponse(httpResponse);
- chain.doFilter(request, compressionResponse);
- compressionResponse.close();
- }
- else{//如果浏览器不支持则不压缩
- chain.doFilter(request, response);
- }
- }
- public void init(FilterConfig config) throws ServletException {
- }
- public void destroy(){
- }
- }
/*** 如果浏览器支持解压缩,则压缩该代码* @throws IOException ServletException if an error occurs with the {@link GZIPOutputStream}.* 如果需要开启该过滤器,在web.xml中加入此代码gzip com.strongit.finance.gzip */package sh.blog.util.web.filter;import java.io.IOException;import java.util.Enumeration;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class CompressionFilter implements Filter {protected Log log = LogFactory.getFactory().getInstance(this.getClass().getName());@SuppressWarnings("unchecked")public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {boolean compress = false;if (request instanceof HttpServletRequest){HttpServletRequest httpRequest = (HttpServletRequest) request;Enumeration headers = httpRequest.getHeaders("Accept-Encoding");while (headers.hasMoreElements()){String value = (String) headers.nextElement();if (value.indexOf("gzip") != -1){compress = true;}}}if (compress){//如果浏览器支持则压缩HttpServletResponse httpResponse = (HttpServletResponse) response;httpResponse.addHeader("Content-Encoding", "gzip");CompressionResponse compressionResponse= new CompressionResponse(httpResponse);chain.doFilter(request, compressionResponse);compressionResponse.close();}else{//如果浏览器不支持则不压缩chain.doFilter(request, response);}}public void init(FilterConfig config) throws ServletException {}public void destroy(){}} gzip *.jsp
实际使用的效果以http://demo.slivercrm.cn:8084为例
登陆窗口:
首页:
- 大小: 65.9 KB
- 大小: 19.4 KB
- 大小: 23.9 KB
- 大小: 29.9 KB
- 查看图片附件
Javascript开发之js压缩篇
Javascript压缩工具(Javascript compressed,Js压缩)
压缩/反压缩javascript
压缩/反压缩javascript
js的页面打印,页眉和页脚一些多余信息怎么去除 Web 开发 / JavaScript
js的页面打印,页眉和页脚一些多余信息怎么去除 Web 开发 / JavaScript
js的页面打印,页眉和页脚一些多余信息怎么去除 Web 开发 / JavaScript -...
prototype.js开发笔记
javascript写unix: JS/UIX - Terminal
prototype.js dojo 中 javascript继承实现
javascript验证Validator.js--入门讨论
js教程:javascript作用域(Scope)
Javascript开发包汇总
compdoc2cn: prototype.js开发笔记
Javascript教程下拉菜单全攻略之Javascript篇-Javascript教程下...
Gzip压缩css和js文件 - Ks Home11
语义化——表单 - ajax,css,js,javascript,actionscript...
发现IE下的优秀JavaScript调试工具Companion.JS
JS日历控件,Javascript日历控件-wpCalendar Ver 2.59-Wal...
JavaScript就这么回事 (JS基础知识整理)
JavaScript就这么回事 (JS基础知识整理)
浏览器开发插件列表(JS、DIV、CSS)
事半功倍之Javascript [2]
BS开发中常用的javascript技术