UNPKG

7.8 kBMarkdownView Raw
1<h2 style="font-weight: normal"> 背景介绍 </h2>
2
3前端工程构建之后,会产生一批版本号资源,那么在后端工程的模版里,需要在(vm/jsp)里引入css、js资源的时候,写法大概是这样的:
4
5```html
6<script src="http://q.qunarzz.com/piao_crm/prd/scripts/supplier/listpage@#include("/include/ver/scripts/supplier/listpage.js.ver").js" type="text/javascript" charset="utf-8"></script>
7```
8
9这样可以使得后端能够关联到前端的资源文件,但是主要存在如下**几个问题**
10
111.需要在@之后写一坨,页面中加上css,页面引入的资源多了,源代码可读性降低。
12
132.需要在每一个模版里都去关心要引入的js对应的版本号文件地址,降低开发效率,而且累。
14
153.前端工程在新增引入或者后期维护的时候,改一个路径,也要跑到后端工程去改这个地方。
16
174.后端的include是一般都是运行时执行的,每一个页面都会引发服务器的IO读取。
18
19<h2 style="font-weight: normal"> 期待效果 </h2>
20
21其实对于开发人员来说,版本应该是框架/工具层面解决的问题,精力应该专注在代码本身,应该有更简练的写法,比如这样的:
22
23```html
24<script src="http://q.qunarzz.com/piao_crm/prd/scripts/supplier/listpage@ver.js" type="text/javascript" charset="utf-8"></script>
25```
26
27<h2 style="font-weight: normal"> 解决方案 </h2>
28
29有了背景和期望,该如何解决这个问题呢?该在哪个阶段解决这个问题呢?
30
31发布后端工程的时候,会找后端工程pom.xml里配置的maven插件并执行,依据pom中配置的前端发布tag,从maven仓库将前端版本号资源拉取到指定目录下,供后续vm里面去include。
32
33其实我们可以往下再做一步,将拉过来的version自动匹配到模板里并替换。
34
35这样一来,在开发引入资源的时候无需关注版本号的问题,而且这个是物理上的替换,待到工程运行的时候,已经是带上版本号的了,消耗上也会比运行时include少一些。
36
37因此开发了一个maven插件来解决这个问题,只需要在maven中配置即可。如果是其它类型的工程,这个插件也可以导出为一个jar包传参数运行,看具体的使用场景。
38
39<h2 style="font-weight: normal"> 如何使用 </h2>
40
41<b style="color: red"> 注:最新版本为1.0.9,强烈建议使用最新版本,如果使用1.0.9之前版本,除了配置下面的plugin外,还需要配置copy-maven-plugin。 </b>
42
43在后端工程的pom.xml里的build--》plugins节点里增加如下配置即可:
44
45```xml
46<plugin>
47 <groupId>com.qunar.maven.plugins</groupId>
48 <artifactId>fekit-maven-plugin</artifactId>
49 <version>1.0.9</version> //插件版本
50 <executions>
51 <execution>
52 <id>fe.piao_tts</id> //这个是自定义的,一般可以为fe.[你的工程名称]
53 <phase>package</phase>
54 <goals>
55 <goal>FEVersionGenerator</goal>
56 </goals>
57 <configuration>
58 <verPath>${project.basedir}/target/ticket-tts/WEB-INF/template/</verPath> //前端版本号资源存放目录,插件会根据fetag参数自动拉取
59 <domain>q.qunarzz.com</domain> //指定前端工程对应的域名,和vm里实际引入的前端资源域名是匹配的
60 <verType>VER_FILE</verType> //版本号资源类型:VER_FILE | VER_MAP,一般VER_FILE即可
61 <vmPath>${project.basedir}/target/ticket-tts/WEB-INF/template/</vmPath> //前端模版文件目录
62 <extension>.vm;.jsp</extension> //在模版文件目录,指定要替换模版类型
63 <project>piao_tts</project> //前端工程名称
64 <fetag>${fe.piao_tts.version}</fetag> //前端工程对应的发布tag,该参数一般由发布系统传进来。
65 <mailto>xinju.dan@qunar.com</mailto> //报警邮件列表,如果发现有匹配不到版本号的情况,会邮件报警
66 </configuration>
67 </execution>
68 </executions>
69</plugin>
70```
71
72如果一个后端工程关联了多个前端工程,只需要在excutions节点里增加一个excution配置即可。
73
74<b style="color: red">问:非java工程可以使用吗?</b>
75
76答:可以,只要是通过maven构建的工程都可以使用。非maven构建的工程可以通过命令行调用,考虑到需求极少,有需要单独联系xinju.dan。
77
78<b style="color: red">问:关联失败怎么办?</b>
79
80答:如果模版里的前端资源版本号关联失败,可以参考:[http://wiki.corp.qunar.com/pages/viewpage.action?pageId=99772097]
81
82<h2 style="font-weight: normal;"> 扩展功能 </h2>
83
84<h3 style="font-weight: normal"> 关联报警 </h3>
85
86有时候,前端导出的资源移除了,而后端没有排查完全,或者是分支发布错等原因都会导致 页面关联不到版本号,一旦到线上,页面就会坏掉。
87
88而用自动化插件,配置下mailto节点,在发布阶段,就可以自动把这种情况报警给指定人员,并在邮件里详细描述关联失败的情况,第一时间就可以知道并解决问题。
89
90<h3 style="font-weight: normal"> 预先缓存 </h3>
91
92如果我们在模版(vm/jsp)页面里指定了:
93
94```html
95<!--[precache]-->
96```
97
98那么发布完成之后,插件就会在工程的resource目录里生成cache-list文件,这样前端拿到这个文件可以选择性的去做预先加载。格式如下:
99
100```javascript
101x_precache_callback([
102"//q.qunarzz.com/piao_tts/prd/styles/usage/touch/core/style@47045973dd6e2d41c75aea17bbaf8d2d.css",
103"//q.qunarzz.com/piao_tts/prd/scripts/cpanel/touch/setting/page@f6ee723939b02c382ba22725b3cd453a.js",
104"//q.qunarzz.com/piao_tts/prd/scripts/cpanel/touch/order/consume/page@2e2dd4fc3939ed622aad02e56b7bbd22.js",
105"//q.qunarzz.com/piao_tts/prd/styles/usage/touch/page/login/style@1c7164301c45726f7f7cedafaae41b6e.css",
106"//q.qunarzz.com/piao_tts/prd/styles/usage/touch/page/list/style@4029ea60c4ab5081deb884aecaa61e32.css",
107"//q.qunarzz.com/piao_tts/prd/styles/usage/touch/page/notice/style@c158e2066837e25cc428addf0c00d949.css",
108"//q.qunarzz.com/piao_tts/prd/scripts/cpanel/touch/login/page@f7e04d6baba46cced50858f7fafd8818.js",
109"//q.qunarzz.com/piao_tts/prd/styles/usage/touch/page/setting/style@71a8fbcdae43dd1c0f74111f88c522ea.css",
110"//q.qunarzz.com/piao_base/prd/scripts/release/hybrid@fad1d22cebfdcce55ae669b99a5ad23f.js",
111"//q.qunarzz.com/piao_tts/prd/scripts/cpanel/touch/notice/list/page@f26fd1c6ae4e6f997be0bf391d85762c.js",
112"//q.qunarzz.com/piao_tts/prd/scripts/cpanel/touch/order/list/page@97ad1e7089b7dbd115fa3b4ae578482c.js"
113]);
114```
115
116前端可以使用jsonp的方式去选择性的预先加载这些文件,或者发挥想象力做一些其他优化。
117
118<h3 style="font-weight: normal"> HTML压缩 </h3>
119
120前端工程发布后,js、css这些都得到了压缩,对于加载速度流量要求较高的页面,HTML也需要压缩怎么办呢?拿门票首页面来说,启用HTML压缩之前大小是130k+,压缩之后能到80k+,还是比较可观的。
121
122使用fekit-maven-plugin可以做到,发布过程中对jsp进行可选择性压缩。
123
124*使用方法:*
125
126在jsp页面任意位置增加如下标记,当然建议增加在头部。
127
128```html
129<!--[minsource on]-->
130```
131
132如果是一个jsp里include多个小jsp,需要在小jsp里也加入此标记。
133
134<h2 style="font-weight: normal"> 开放源码 </h2>
135
136[http://gitlab.corp.qunar.com/ticket/fekit-maven-plugin] 这个是工程源码地址,欢迎大家一起参与修正。
137
138<h2 style="font-weight: normal"> To Do List </h2>
139
140热更新:前端发布后,不需要发布后端,不需要重启后端应用,通过一个指令即可完成前端版本号同步到后台模版。