Ionic进行PC端Web开发时通过脚本压缩提高第一次加载效率

来源:互联网 发布:淘宝商户注册风险 编辑:程序博客网 时间:2024/05/17 00:07

注意,本文中的描述仅适用于基于Ionic进行PC端的Web开发,如果是手机端的开发,可以尝试仅使用UglifyJS2进行压缩,是否会有提高请自行验证,至少文件小了加载速度会快。^_^


1. 问题

1.1. 问题上下文描述:

  1. 基于Ionic进行PC端的Web应用开发;
  2. 使用Tomcat作为最终服务发布容器。

1.2. 问题描述:

编译后main.js的大小为4-6MByte。(集成第三方控件前4M左右,集成后6M左右),导致第一次加载时速度较慢。

2.解决方案

经过分析,main.js有很大的压缩空间:

  • 首先,其没有进行代码级别的研发,可以通过UglifyJS2进行代码级别的压缩;
  • 其次,可以利用浏览器的特性,进行gzip压缩。
    经验证原本6MByte左右的文件,压缩后成了500KByte左右,极大提高了加载效率。

3. 具体操作

3.1. 安装并使用UglifyJS2进行代码级别的压缩:

3.1.1. 安装UglifyJS2

首先保证已经安装了nodejsnpm

npm install uglify-js -g

3.1.2. 代码级压缩

uglifyjs main.js -o main.min.js

通过上面的压缩命令,生成的main.min.js大约是原来的一半3MByte左右。

3.2. 使用gzip进一步压缩

首先到gzip官网下载对应命令行的安装包。
解压后,可以在环境变量中进行配置,方便后续操作。
然后通过如下命令进行gzip压缩:

gzip -9 -S gz main.min.js

压缩后会生成一个名为main.min.jsgz的文件,好了可以看到这个文件只有500KByte左右,我这里是577KByte。

压缩后,就是使用了,基于Tomcat我们增加过滤器,对访问main.js的请求都转发给main.min.jsgz

3.3. 增加过滤器进行请求转发

本部分基于Servlet3.0以上支持的注解方式增加:

package com.telchina.workmanage.common.filter;import java.io.IOException;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.annotation.WebFilter;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet Filter implementation class JSRequestFilter */@WebFilter(filterName="JSRequestFilter",urlPatterns={"/build/main.js"})public class JSRequestFilter implements Filter {    @Override    public void init(FilterConfig filterConfig) throws ServletException {    }    @Override    public void doFilter(ServletRequest request, ServletResponse response,            FilterChain chain) throws IOException, ServletException {        if(request instanceof HttpServletRequest){            this.doFilter((HttpServletRequest)request, (HttpServletResponse)response, chain);        }        else{            chain.doFilter(request, response);        }    }    public void doFilter(HttpServletRequest request, HttpServletResponse response,            FilterChain chain) throws IOException, ServletException {        if(request.getRequestURI().endsWith("main.js")){            response.addHeader("Content-Encoding", "gzip");            request.getRequestDispatcher("/build/main.min.jsgz")                .forward(request, response);        }        else{            chain.doFilter(request, response);        }    }    @Override    public void destroy() {    }} 

文章转载于:http://www.cnblogs.com/gavin-cn


原创粉丝点击