博客 / 詳情

返回

GWA2吉娃兔🐇升級模板引擎子系統

近期,全球範圍內的新冠肺炎疫情有所緩解,抗擊疫情有發展成為常態化的趨勢,復工復學正有序展開。GWA2 吉娃兔🐇 在此期間升級改進了模板引擎系統。

這是一件令人開心的事,夙願已久,終得實現。
大約7-8年前,當我們完成GWA2 PHP版本所有主要功能架構後,開始審視代碼進行加強和優化時,就設想在模板文件的加載部分需要優化改進。 這一設想,拖來拖去,竟然有7-8年過去了。

通常情況下,GWA2專注於架構設計,遵循 MVC的設計理念,將 V(視圖)的工作交給了當時選定的 Smarty模板引擎來處理。像我們在此前討論的一樣,Smarty模板引擎被選中,是有一些考慮在裏面(參考:㊗️ GWA2/吉娃兔🐇八週年啦!GWA2內置模板引擎成功由Smarty替換為Hanjst , https://ufqi.com/blog/gwa2-8-... );同樣地,當我們使用 Hanjst漢吉斯特替換 Smarty時,也是對這些考慮的再次審視。

重啓這一問題,是因為 GWA2在準備數據和模板文件之後,在模板引擎工作之前,還有一些工作需要處理,這就是 GWA2的模板引擎子系統的預處理部分。這部分主要包括大致兩方面的工作。

  1. GWA2 模板引擎子系統的兩件工作
    1.1. 模板子系統之前預處理
    GWA2 在結束一次請求的業務處理之後,會根據輸出變量 fmt 的具體情況來決定將要輸出內容的格式,是純文本,還是普通的HTML,還是JSON 或者 XML。
    在這一步完成後,如果需要輸出HTML,在指定了待輸出的模板文件之後,餘下的工作將由模板引擎來跟進處理。
     .
    1.2. 設計層的靜態內容替換:資源路徑、關鍵詞等
    通常的軟件項目開發中,設計師和工程師,前端工程師和後台工程師,是不同的角色,由不同的人來擔任。這主要是由於他們各自的工作不同。
    在網絡應用中,特別是網頁應用中,視圖通常是普通的HTML,當前端工程師將HTML準備好之後,相應的HTML文件被添加到項目代碼庫中。

    只是這樣的HTML原文件還不能直接使用。主要原因包括,需要需要改一些頁面的頭部和尾部共用的部分,這些共用的部分,需要提取出來,單獨存放,以便於共用,或者實現模板的嵌套等高級功能。

    另外一項必不可少的工作是對資源路徑、關鍵詞進行替換等。原始的HTML代碼可能是如下這樣的情況:

    ….  
    <img src=”images/abc.png” alt=”an image”/>  
    …
    

    這裏的一個圖片元素,其路徑是相對路徑,而到服務器端真實環境時,可能相對路徑就不能用了,它與用户實際訪問的路徑可能不在一個地方。這時候,就需要對 “images/” 進行替換操作。
    這次替換操作,是每次模板加載時都是動態替換的。
    如果沒有模板緩存,則每次都需要動態替換,除非程序開發人員在拿到HTML文件時手工給修改一次。
    這是理智的,卻不是實際可操作的,因為設計師和前端工程師通常需要修改HTML,每次遞交到系統都來一次這樣的手工替換修改,是惱人的,也是不可靠的。

    所以,多次實踐之後,我們考慮還是將這部分工作交給程序和系統去做比較可靠。與之對應的,模板應該有緩存機制,這也是我們最早就注意到要優化的地方之一。
    .

    1.3. 模板文件的讀取加載
    模板文件在完成動態替換後,還需要實際的實現從磁盤文件讀取然後輸出給客户端的過程。

    這一過程的緩存也尤為重要。如果緩存了相關頁面,則每次讀取時,不需要磁盤操作,直接從相應的內存緩存中進行讀取,速度會大幅提升。額外地,有些模板引擎還能夠對模板進行預編譯,進而更快地提升模板引擎的處理速度。
    .

  2. GWA2兼容 Smarty模板引擎 和 Hanjst漢吉斯特模板引擎
    2.1. Hanjst漢吉斯特模板引擎
    Hanjst漢吉斯特是目前 GWA2 默認的和推薦的模板引擎。(參考: https://ufqi.com/blog/category/hanjst/ )
    Hanjst 在接管模板加載工作後,也需要需要完成上述兩項工作。通過磁盤文件系統讀取模板文件,進行替換資源路徑操作,然後再將替換後的模板內容與要輸出的環境變量內容一併輸出到前端。

    在前端頁面通過 JavaScript完成數據內容與模板形式的融合。
    加入模板引擎子系統的緩存後,上面的預操作(讀取模板文件,替換靜態內容)就可以省略,其僅在緩存失效的情況下再重新做一遍預操作的工作。當預操作完成後,進行緩存寫操作,以便接下來的第二次請求使用緩存內的模板形式,從而避免了讀取磁盤文件內容然後進行靜態內容替換等操作。
    提升了模板加載效率,也提升了系統處理速度。
    .

    2.2. Smarty模板引擎
    Smarty模板引擎即將被替換掉。在 GWA2 中,我們將在未來的版本逐漸使用 Hanjst 替換掉 Smarty . 目前 GWA2 Java的模板引擎已經升級為 Hanjst. GWA2 PHP的模板引擎還是 Smarty,預計會在未來1-2年內完成從 Smarty 到 Hanjst 的升級.

    在現有的版本中,我們也對 Smarty模板進行了一定的緩存支持升級改進。早前Smarty 本身已經具有一定的預編譯與緩存操作。
    GWA2 的預操作在其之前,也即讀取文件並做靜態路徑替換等。
    增加了這些預操作的緩存之後,GWA2的 Smarty 模板引擎子系統有望跑得更快。
    .

  3. GWA2 模板子系統緩存開關
    緩存對正式運行環境有幫助,較明顯地性能提升,但對開發環境有干擾。
    也即修改不能及時提現出來,有緩存週期。有鑑於此,我們在 GWA2 中對模板緩存開啓設置了兩個變量開關: is_debug 和 enable_cache .

    只有 is_debug == false 並且 enable_cache == true 時,才會開啓 GWA2 的模板引擎的緩存。 前者的變量是針對是否開發環境的約束,如果是開發環境,則不會開啓緩存,任何在模板文件上的修改即可生效。
    只有 enable_cache == true 才能夠支持模板引擎的緩存,否則無處緩存。

    因此,如果不想啓用模板引擎緩存,可以任意修改這兩個控制變量其中一個即可。當然,也可以在輸出控制的程序裏 comm/footer.inc 中直接操作 enableTplCache 變量,使之始終開或者關。

    此外,我們還單獨提供了模板緩存的單獨有效期變量, tplCacheExpire, 其默認取自於 GWA2 的緩存有效時長。

五月是美好的季節,在奼紫嫣紅、麥浪滾滾的時光裏,從更深層面近乎完美地實現了多年來的一個心願,所謂幸福,大抵如此。對個人如此,對 GWA2 社羣,應該也是福音。

已經啓用模板引擎緩存系統的產品包括 有福新聞( https://ufqi.com/news/ ) | 有福常在( https://ufqi.com/news/mod.ulo... ) | 木子商城( http://www.muzimed.com ) 等。


-GWA2 是”通用網絡應用架構( General Web Application Architeture )”,基於 -GWA2 可以輕便構建各種網絡應用程序,
包括複雜的在線購物商城、在線醫療、在線教育、 旅遊交易平台、社羣或者社交網站和新聞資訊網站等,
也包括各種企事業單位網上門户,在線交互及服務作業系統等.
還可以包括為NativeApp做服務器端支持, 甚至是WebApp的全部.
-GWA2 是為數不多的支持跨開發語言的應用框架,目前支持 -Java, -PHP, -Perl, -Aspx and -Python .

-GWA2 is a “General Web Application Architecture” and based on -GWA2 developers can easily build a variety of network applications,
including complex online shopping malls, online medical services, online teaching, travel trading platforms, community or social networking sites and news information sites, etc.
Also the applications include various online portals of enterprises and institutions, online interaction and service operations systems.
Moreover it contains server-side support for NativeApp, or even all of the WebApp.
-GWA2 is one of the web frameworks which provide cross-language support for -Java, -PHP, -Perl, -Aspx and -Python at present.

**-GWA2 is E.A.S.Y
Easy Along, Swift Yield
輕鬆啓動, 快速產出.**

https://ufqi.com/dev/gwa2/

-R/E2SS

https://ufqi.com/blog/gwa2-up...

user avatar zzd41 頭像 lanlanjintianhenhappy 頭像 hightopo 頭像 201926 頭像 niumingxin 頭像 pangsir8983 頭像 mrqueue 頭像 gfeteam 頭像 tofrankie 頭像 yangkaiqiang 頭像 huaihuaidedianti 頭像 xuriliang 頭像
36 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.