使用 jawr 压缩js css
背景:web项目中通常会引入大量的js及css,为了开发方便和提高代码的重用性,也会更多的将工具类的js独立成一个文件,css同样如此;这样就导致了几乎每个页面都重复着导入js及css的代码,同时当用户访问web页面时,将会创建多个请求,而每个请求都将重复着和服务器请求响应的操作,这样势必影响页面加载速度,降低客户体验
开发:搜索发现了jawr项目,该项目做到了将多个资源合并压缩,包括js、css甚至image
项目文档:https://j-a-w-r.github.io
jar关联:http://mvnrepository.com/artifact/net.jawr/jawr-core
1、开始按流程开发:如果是Maven项目直接配置pom节点即可直接上手,如果普通web项目需要根据自己用到的包按需下载,再添加到项目的lib中
2、配置web.xml,增加servlet节点
<servlet> <servlet-name>JavascriptServlet</servlet-name> <servlet-class>net.jawr.web.servlet.JawrServlet</servlet-class> <init-param> <param-name>configLocation</param-name> <param-value>jawr.properties</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet> <servlet-name>CSSServlet</servlet-name> <servlet-class>net.jawr.web.servlet.JawrServlet</servlet-class> <init-param> <param-name>configLocation</param-name> <param-value>jawr.properties</param-value> </init-param> <init-param> <param-name>type</param-name> <param-value>css</param-value> </init-param> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>JavascriptServlet</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>CSSServlet</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping>
有了这个配置,系统启动的时候jawr将读取项目中的所有js、css并将它们缓存起来已提高访问响应的效率
2、项目的src目录新建jawr.properties文件,内容如下
jawr.charset.name=UTF-8 jawr.locale.generator.resourceBundle.charset=UTF-8 #The interval in seconds in which Jawr checks whether the configuration or the bundles have changed. If this value is set, when you change the properties file or a bundle file, Jawr will detect it and redeploy itself so you don’t need to restart the server to test your changes. jawr.config.reload.interval=5 jawr.js.bundle.factory.bundlepostprocessors=YUI #jawr.css.bundle.factory.bundlepostprocessors=YUI jawr.working.directory=D:\\jawr\\temp jawr.basecontext.directory=D:\\jawr\\temp #jawr.debug.on=true jawr.js.use.cache=false jawr.css.use.cache=false jawr.use.generator.cache=false #定义全局包,定义后其他不用显示调用,将自动引用;多个使用order指定顺序;定义的bundle id不能有. jawr.js.bundle.jquery_19.id=/bundles/jquery_1.9.js jawr.js.bundle.jquery_19.mappings=/1503/js/jquery_1.9.js jawr.css.bundle.index.id=/bundles/index.css jawr.css.bundle.index.mappings=/1503/css/reset.css
jawr.config.reload.interval 表示自动监控该文件修改重新加载的时间,单位为秒;开发是比较有用,不用自己手动重启(注意修改js或者css源文件是不会被自动加载的,需要手动重启web服务器)
jawr.debug.on 设置为true时,页面将显示合并之前多个script标签,方便调试
jawr.js.bundle.factory.bundlepostprocessors 标识使用哪种框架来执行js压缩,不配置默认好像是postprocessors,但启动时有些js编译不通过,所以修改成了YUI
jawr.js.use.cache、jawr.css.use.cache、jawr.use.generator.cache 开发的时候最好将这三个都设置为true,避免由于缓存的问题导致修改了源码也无法从新合并压缩的问题
下面就是指定访问的路径,设置路径映射的源文件
jawr.js.bundle.jquery_19.id=/bundles/jquery_1.9.js #jquery_19是自己定义的,注意不能有. 也不区分大小写
jawr.js.bundle.jquery_19.mappings=/1503/js/jquery_1.9.js,... #配置源文件路径,多个用,隔开;可设置目录如/* jawr.js.bundle.lib.global=true #可指定lib为全局的,指定后页面无需导入,将自动加载定义的资源 jawr.js.bundle.lib.order=1 #指定全局后,如果有多个,可指定加载顺序 jawr.js.bundle.foo.dependencies=lib #同时也可以使用 dependencies 标记导入其他公共已定义的资源包 #这两种,其实一般不建议这么做,这有就会产生多个script标签
更多介绍可查看官方文档
3、页面导入
jsp页面
<%@ taglib uri="http://jawr.net/tags" prefix="jwr" %> <jwr:style src="/bundles/index.css"></jwr:style> <jwr:script src="/bundles/index.js"></jwr:script>or html页面
<script type="text/javascript" src="./jawr_loader.js" ></script> <script> JAWR.loader.style('/bundles/index.css'); JAWR.loader.script('/bundles/index.js'); </script>
完成后访问你的页面,查看页面源码将看到
<link rel="stylesheet" type="text/css" media="screen" href="/xxx/gzip_1567303866/bundles/index.css" /> <script type="text/javascript" src="/xxx/gzip_N722610567/bundles/index.js" ></script>
点击进去看看,发现已经将我们预定义的js及css合并而且min了
最后值得注意的是,如果你想在合并的某些地方换行(因为合并时会去掉注释)可以使用
*!**/
个来标识哦
至此,已经实现预期效果