前后端版本号关联
主要解决前后端版本自动化关联问题。目前推荐使用 ykit-version-plugin,最新版本为1.1.3,建议使用最新版本。
页面写法
只需要在资源文件名后面加一个@ver,发布之后即可自动匹配到对应的前端资源。
<script src="http://q.qunarzz.com/piao_pmc/prd/scripts/base@ver.js" type="text/javascript"></script>
后端配置
在后端工程的pom.xml里的build—》plugins节点里增加如下配置(如果原来使用了copy-maven-plugin,那么可以去掉了,只用配置下面的plugin即可。)
<plugin>
<groupId>com.qunar.maven.plugins</groupId>
<artifactId>ykit-version-plugin</artifactId>
<version>1.1.2</version>
<executions>
<execution>
<id>fe.piao_tts</id> //这里要修改为自己工程的标示,否则可能导致插件无法正常执行
<phase>package</phase> //对于java工程,默认设置package,如果是Node或其它工程,要看具体发布之行的mvn指令,比如Node一般就是:initialize
<goals>
<goal>FEVersionGenerator</goal>
</goals>
<configuration>
<domain>q.qunarzz.com</domain>
<verType>VER_FILE</verType>
<extension>.vm;.jsp</extension>
<project>piao_tts</project>
<fetag>${fe.piao_tts.version}</fetag>
<mailto>xinju.dan@qunar.com</mailto>
<vmPath>${project.basedir}/target/ticket-tts/WEB-INF/template/</vmPath>
</configuration>
</execution>
</executions>
</plugin>
参数说明
问:一个后端可以关联多个前端工程吗?
答:可以,只需要在excutions节点里增加一个excution配置即可。
问:非java工程可以使用吗?
答:可以,只要是通过maven构建的工程都可以使用。非maven构建的工程可以通过命令行调用,考虑到需求极少,有需要单独联系xinju.dan。
问:domain参数是做什么用的?
答:domain用来限定前端资源匹配的范围,不是指定域下的资源不会被替换。有的页面src里domain部分是一个变量,那就需要在这里的domain节点也配置那个变量。
问:verType参数是做什么用的?
答:前端构建生成的版本资源包含两种:Files和Map形式,这里可以去指定按照哪种方式去匹配。
问:extension参数是做什么用的?
答:extension用来限定模版文件扩展名,比如这里设置.vm和.jsp,那么.php的模版文件就不会被替换。
问:project参数怎么设置?
答:project必须为前端工程的名字,和git工程的名字是对应的。
问:fetag参数是做什么用的?
答:插件会根据fetag参数去到maven仓库下载前端资源包,这个地方是和后端job里的qzz_tag_name相关连的,务必填写正确,大多数匹配失败都和这个有关系。如果关联一个前端工程,一般写:
${qzz.version}如果关联多个前端,则需要根据qzz_tag_name里定义的去写。
问:mailto参数是做什么用的?
答:如果发布过程中发现有些页面资源匹配不到版本号,则会发报警邮件,这里是接收人邮件,如果多个用分号隔开。
问:vmPath参数是做什么用的?
答:是后端工程vm存放的目录,如果是java工程,要去工程的target下面去找vm所在的目录路径,大多数的匹配失败都和这个有关系,务必填写正确。
扩展功能
关联报警
有时候,前端导出的资源移除了,而后端没有排查完全,或者是分支发布错等原因都会导致 页面关联不到版本号,一旦到线上,页面就会坏掉。
而用自动化插件,配置下mailto节点,在发布阶段,就可以自动把这种情况报警给指定人员,并在邮件里详细描述关联失败的情况,第一时间就可以知道并解决问题。
预先缓存
如果我们在模版(vm/jsp)页面里指定了:
<!--[precache]-->
那么发布完成之后,插件就会在工程的resource目录里生成cache-list文件,这样前端拿到这个文件可以选择性的去做预先加载。格式如下:
x_precache_callback([
"//q.qunarzz.com/piao_tts/prd/styles/usage/touch/core/style@47045973dd6e2d41c75aea17bbaf8d2d.css",
"//q.qunarzz.com/piao_tts/prd/scripts/cpanel/touch/setting/page@f6ee723939b02c382ba22725b3cd453a.js",
"//q.qunarzz.com/piao_tts/prd/scripts/cpanel/touch/order/consume/page@2e2dd4fc3939ed622aad02e56b7bbd22.js",
"//q.qunarzz.com/piao_tts/prd/styles/usage/touch/page/login/style@1c7164301c45726f7f7cedafaae41b6e.css",
"//q.qunarzz.com/piao_tts/prd/styles/usage/touch/page/list/style@4029ea60c4ab5081deb884aecaa61e32.css",
"//q.qunarzz.com/piao_tts/prd/styles/usage/touch/page/notice/style@c158e2066837e25cc428addf0c00d949.css",
"//q.qunarzz.com/piao_tts/prd/scripts/cpanel/touch/login/page@f7e04d6baba46cced50858f7fafd8818.js",
"//q.qunarzz.com/piao_tts/prd/styles/usage/touch/page/setting/style@71a8fbcdae43dd1c0f74111f88c522ea.css",
"//q.qunarzz.com/piao_base/prd/scripts/release/hybrid@fad1d22cebfdcce55ae669b99a5ad23f.js",
"//q.qunarzz.com/piao_tts/prd/scripts/cpanel/touch/notice/list/page@f26fd1c6ae4e6f997be0bf391d85762c.js",
"//q.qunarzz.com/piao_tts/prd/scripts/cpanel/touch/order/list/page@97ad1e7089b7dbd115fa3b4ae578482c.js"
]);
前端可以使用jsonp的方式去选择性的预先加载这些文件,或者发挥想象力做一些其他优化。
HTML压缩
前端工程发布后,js、css这些都得到了压缩,对于加载速度流量要求较高的页面,HTML也需要压缩怎么办呢?拿门票首页面来说,启用HTML压缩之前大小是130k+,压缩之后能到80k+,还是比较可观的。
使用ykit-version-plugin可以做到,发布过程中对jsp进行可选择性压缩。
使用方法:
在jsp页面任意位置增加如下标记,当然建议增加在头部。
<!--[minsource on]-->
如果是一个jsp里include多个小jsp,需要在小jsp里也加入此标记。