【原創申明:文章為原創,歡迎非盈利性轉載,但轉載必須注明來源】
在互聯網產品中,一般會有多個項目(Jar、WAR)組成一個產品線。這些WAR項目,因為使用相同的前端架構(jQuery、easyui等),在各個項目中都會存在這些組件的代碼,以及其他各個項目中都要用到的公共資源文件。
傳統的做法,在每個War項目中拷貝一份這些文件,分別打包到各個War中。如果這些組件非常穩定,很少升級,也幾乎不存在BUG需要修改,這麼做問題也不大。但如果是相反的情況,前端人員就要忙瘋了,因為他要在各個項目中進行修改調試,而且還要記住哪些項目修改了,哪些還沒修改。
針對這一類問題,有什麼比較好的處理方法嗎?
不管後續采用哪種方案,這都是必須要做的一個步驟。區別在於獨立出來的這些靜態文件,采用哪種方法組成一個獨立的module。
我們項目中典型的static目錄內容如下,其他項目基本類似。
可以看到,其中包括jquery\easyui的代碼將會在各個項目中重復出現。
將資源文件獨立出來後,使用一個獨立的jar包進行開發;其他war項目依賴這個jar包。
在項目的src/main/resources目錄中創建static目錄,並將公共靜態文件復制到該目錄中。
修改pom.xml文件,配置私有maven庫的地址和用戶信息,這樣mvn deploy可以自動將jar發布到maven庫,供其它war項目使用。
首先修改pom.xml,添加dependency。
<dependency>
<groupId>cn.codestory.research</groupId>
<artifactId>common-static</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
然後修改spring配置文件中的mvc:resources部分為
<mvc:resources mapping="/static/**" location="classpath:/static/" />
頁面引用靜態文件時,直接使用代碼
<script type="text/javascript" src='/static/javascript/framework/jquery.min.js'></script>
<script type="text/javascript" src='/static/javascript/framework/jquery.easyui.min.js'></script>
這樣就能正常訪問jar包中的靜態文件。
如果war包中需要添加本項目特有的靜態文件,或者是對jar中的部分靜態文件做修改適應本項目的需要,可以保存在war項目的目錄中/src/main/resources/static中,其他代碼都不需要修改。
如果原war中的靜態文件保存在src/main/webapp/static目錄中並且不想移動這些文件,修改spring配置文件中的mvc:resources內容為
<mvc:resources mapping="/static/**" location="classpath:/static/,/static/" />
這種修改方法,不修改項目的部署方式就能實現靜態文件的共享。只是它需要構建一個私有Maven倉庫,在項目之間共享才比較方便。
前端修改代碼時,只需要在common-static.jar項目中修改即可。當然,因為涉及到更多的項目,修改也一定要慎重。這可以通過升級jar版本號的方法來實現各個war項目的逐漸升級。
在生產環境,將靜態文件獨立部署到一台服務器,采用Tomcat或Http Server。有兩種方案可以實現static文件的轉發。
這種方式對項目的修改比較少,也不需要增加新的域名,下圖中可設置轉發規則:
1、uri是/static/**,則一律轉發到static server
2、host是app1.codestory.cn,轉發到app server 1
3、host是app2.codestory.cn,轉發到app server 2
部署方案跟前面類似,區別在於轉發規則的設置。同時,在war包中的script引用路徑必須包括host的完整URL。
<script type="text/javascript"
src='http://static.codestory.cn/static/javascript/framework/jquery.min.js'></script>
更進一步的解決方案,是使用CDN部署,將靜態文件部署到全國各地的機房,用戶能夠自動訪問就近的服務器,能提供更高的訪問速度。
不過,這個方案就完全是部署的問題了,項目有需要且公司有錢的可以去嘗試。