国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

重構(gòu)后端模板文件的一種實(shí)踐

JeOam / 1319人閱讀

摘要:后端的動(dòng)態(tài)模板后端通常會(huì)使用模板文件來(lái)動(dòng)態(tài)返回前端頁(yè)面。后端代碼調(diào)用文件可以看作是函數(shù)調(diào)用。這里雖然處理的是后端模板文件和前端的一個(gè)結(jié)合,但其思想可以利用在別的地方。

后端的動(dòng)態(tài)模板

Java后端通常會(huì)使用ftl(freemarker template language)模板文件來(lái)動(dòng)態(tài)返回前端頁(yè)面。這個(gè)工作,通常還可以用jspphp文件來(lái)實(shí)現(xiàn)。但這些動(dòng)態(tài)模板的實(shí)現(xiàn),通常是在已有的html文件上對(duì)特定的需要做動(dòng)態(tài)處理的部分做改寫。這對(duì)小項(xiàng)目來(lái)講沒(méi)什么不對(duì)。可如果你的頁(yè)面數(shù)量足夠多,維護(hù)它們將成為一件異常困難的事情。

Nodejs大前端技術(shù)

在目前的大前端技術(shù)棧下,Nodejs的各種框架讓前端開發(fā)變得規(guī)矩不少。我的一個(gè)理解是,傳統(tǒng)前端的html+css+js的技術(shù)棧的最大問(wèn)題在于其模塊化、組織能力像是一個(gè)教學(xué)語(yǔ)言,應(yīng)有的語(yǔ)句控制和代碼復(fù)用的技術(shù),都顯得蒼白無(wú)力。

就html的編寫來(lái)講,幾乎不存在一種類似函數(shù)的復(fù)用方式,能夠簡(jiǎn)化重復(fù)的UI component的生成。你只能不斷地去寫一些重復(fù)的、雜亂的代碼。整體上來(lái)講,這不僅難以做后期的維護(hù),也無(wú)法輕易地看懂其間的代碼邏輯。

一句話來(lái)講,這些代碼非常類似于機(jī)器代碼或者匯編代碼。沒(méi)有高級(jí)語(yǔ)言的精準(zhǔn)控制和抽象層去對(duì)代碼做宏觀把控。

Pugjs是一個(gè)很好的html預(yù)處理項(xiàng)目。它的基本想法是:

不要去直接編寫“底層”的html代碼,而是用自己定義的一套語(yǔ)法去編寫pug文件。

通過(guò)這個(gè)pug文件去生成出html代碼。特別的,在它的語(yǔ)法中,你不必再寫一大堆的尖括號(hào)和與前后呼應(yīng)的tag。如同Python,僅僅依靠代碼的對(duì)齊方式,就可以自動(dòng)識(shí)別相應(yīng)的作用域范圍。例如

  • First tip
  • Second tip
  • Third tip

這樣語(yǔ)義簡(jiǎn)單、語(yǔ)法繁瑣的一堆代碼,在pug下可以簡(jiǎn)化為

div
    ul
        li First tip
        li Second tip
        li Third tip

但這還不是最誘人的技術(shù),因?yàn)檫@無(wú)非是加入了一些語(yǔ)法糖。最為誘人的是pug提供的函數(shù),它能夠定義一個(gè)函數(shù)去生成某個(gè)組件。

例如,如果你需要定義一組table,每個(gè)table僅僅是表頭或者其中一部分的數(shù)據(jù)不一樣,你該如何處理?傳統(tǒng)的方式當(dāng)然是復(fù)制粘貼一堆模板代碼,然后一個(gè)個(gè)地去修改里面的數(shù)據(jù)。

pug的處理方式就要好太多,完全符合將數(shù)據(jù)和代碼分離的思想。定義函數(shù):

mixin leftbox-gen(dataObj)
        table.table
            thead
                tr
                    th(scope="col") #{dataObj.title}
            tbody
                each area in dataObj.areas
                    tr
                        td
                            .box-title #{area.name}
                            ul
                                each subarea in area.subareas
                                    li
                                        a(id=subarea.id, href=subarea.url) #{subarea.name}

這樣就可以根據(jù)通過(guò)定義json格式的dataObj去引用函數(shù):

+leftbox-gen(cs_leftbox_data)

你通過(guò)不同的json數(shù)據(jù),就能夠生成不同的table出來(lái)。這就實(shí)現(xiàn)了代碼的模塊化和以及數(shù)據(jù)和業(yè)務(wù)代碼的分離。要做出新的table component,你只需要改變數(shù)據(jù)就可以了。

這樣的實(shí)現(xiàn)方式在別的高級(jí)語(yǔ)言中是很常見的,但是在傳統(tǒng)的前端代碼中,這常常難以見到。原因就在于,html代碼更像是沒(méi)有抽象層的機(jī)器代碼,只是一大堆的實(shí)際操作,而缺少抽象層的高效管理。

前端預(yù)處理和后端動(dòng)態(tài)模板的結(jié)合

pug這樣優(yōu)秀的工具,如果能夠用來(lái)管理后端的ftl模板當(dāng)然會(huì)相當(dāng)合適。優(yōu)秀的語(yǔ)法糖、代碼模塊化、數(shù)據(jù)和業(yè)務(wù)邏輯的分離,實(shí)在是相當(dāng)誘人的選擇。

但這樣的理念真要實(shí)施在生產(chǎn)代碼中,特別是用來(lái)重構(gòu)已有的legacy code時(shí),就不大容易了。

例如,pug只能生成html代碼,且生成出來(lái)的位置通常是在一個(gè)統(tǒng)一的地方。可ftl代碼卻分散在各個(gè)不同Java工程的不同目錄之下。這兩者很難統(tǒng)一到一起。

或許一個(gè)直接的想法是,不如直接把所有的ftl都放到一個(gè)地方,這樣就不用把模板語(yǔ)言分散到各個(gè)不同項(xiàng)目的不同文件夾里,而難以維護(hù)。

但這種方案帶來(lái)的一個(gè)麻煩是,如果真的把后端的ftl文件挪動(dòng)了位置,那么你后端代碼的接口部分就不得不做修改。而這樣的接口部分其數(shù)量并不少。既要做出大量的修改,還要保證它們的正確性,并不是一件輕松的事情。

經(jīng)過(guò)大量的思考和嘗試,我得出的一個(gè)解決方案是:

使用Pugjs生成出統(tǒng)一的ftl文件,放在同一個(gè)公共資源文件夾下。讓每一個(gè)具體項(xiàng)目下的ftl文件中,直接include這個(gè)公共資源文件夾中ftl內(nèi)容。

這種做法的一個(gè)精妙之處是:它將ftl文件當(dāng)作函數(shù)接口來(lái)使用。后端Java代碼調(diào)用ftl文件可以看作是函數(shù)調(diào)用。而函數(shù)實(shí)現(xiàn)并不需要直接放在這個(gè)ftl文件里,而是可以放在別的地方做引用。這就把實(shí)現(xiàn)和調(diào)用部分,通過(guò)一個(gè)多帶帶的文件分離開了。

這里雖然處理的是后端模板文件和前端的一個(gè)結(jié)合,但其思想可以利用在別的地方。如果一個(gè)模板文件具備了include功能,便可以把模板文件本身當(dāng)作接口,從而將實(shí)現(xiàn)與定義分離。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/98155.html

相關(guān)文章

  • 關(guān)于前后端分離與模板引擎

    摘要:但似乎他們的職責(zé)在以前甚至于現(xiàn)在都并不明確,雖然前端是跟瀏覽器打交道,但是最終瀏覽器拿到的頁(yè)面是服務(wù)器通過(guò)模板生成的一個(gè)臨時(shí)靜態(tài)頁(yè)面而已。當(dāng)然,一般傳統(tǒng)上的開發(fā)協(xié)作模式有兩種一種是前端先寫一個(gè)靜態(tài)頁(yè)面,寫好后,讓后端去套模板。隨著不同終端(Pad/Mobile/PC)的興起,對(duì)開發(fā)人員的要求越來(lái)越高,純?yōu)g覽器端的響應(yīng)式已經(jīng)不能滿足用戶體驗(yàn)的高要求,往往需要針對(duì)不同的終端開發(fā)定制的版本,為了提...

    cnTomato 評(píng)論0 收藏0
  • 后端分離的一點(diǎn)實(shí)踐

    摘要:怎么做前后端的分離我目前的做法是將作為一種服務(wù)存在,僅需要提供接口即可,前端目前采用,調(diào)用后端,解析數(shù)據(jù),靜態(tài)頁(yè)面。采用,充當(dāng)層,前后端實(shí)現(xiàn)了真正的分離,但還是有點(diǎn)問(wèn)題的。 什么是前后端分離 對(duì)于這個(gè)問(wèn)題,其實(shí)可以看看我的學(xué)習(xí)歷程,我覺(jué)得很好的體現(xiàn)了Web開發(fā)模式的演化。 石器時(shí)代:那正是本人剛學(xué)JSP的時(shí)候,寫了一個(gè)簡(jiǎn)單的商城DEMO,所有的業(yè)務(wù)邏輯,數(shù)據(jù)庫(kù)的交互以及Javascri...

    enda 評(píng)論0 收藏0
  • 《從零構(gòu)建前后分離web項(xiàng)目》探究 - 深入聊聊前后分離架構(gòu)

    摘要:什么是前后分離前后端分離并不是什么新鮮事,到處都是前后端分離的實(shí)踐。然而一些歷史項(xiàng)目在從一體化設(shè)計(jì)轉(zhuǎn)向前后端分離的架構(gòu)時(shí),不可避免的會(huì)遇到各種各樣的問(wèn)題。搞了一個(gè)前后分離,需要分離部署。 探究 :深入聊聊前后分離架構(gòu) 前后分離,一直是一個(gè)相當(dāng)泛泛的問(wèn)題,前后分離到底好不好?沒(méi)有絕對(duì)的對(duì),沒(méi)有絕對(duì)的錯(cuò),業(yè)界就這個(gè)問(wèn)題已經(jīng)激烈的探討幾年了.出現(xiàn)討論的點(diǎn)在于:分離當(dāng)然是好的,但是以什么樣的服...

    whinc 評(píng)論0 收藏0
  • 《從零構(gòu)建前后分離web項(xiàng)目》探究 - 深入聊聊前后分離架構(gòu)

    摘要:什么是前后分離前后端分離并不是什么新鮮事,到處都是前后端分離的實(shí)踐。然而一些歷史項(xiàng)目在從一體化設(shè)計(jì)轉(zhuǎn)向前后端分離的架構(gòu)時(shí),不可避免的會(huì)遇到各種各樣的問(wèn)題。搞了一個(gè)前后分離,需要分離部署。 探究 :深入聊聊前后分離架構(gòu) 前后分離,一直是一個(gè)相當(dāng)泛泛的問(wèn)題,前后分離到底好不好?沒(méi)有絕對(duì)的對(duì),沒(méi)有絕對(duì)的錯(cuò),業(yè)界就這個(gè)問(wèn)題已經(jīng)激烈的探討幾年了.出現(xiàn)討論的點(diǎn)在于:分離當(dāng)然是好的,但是以什么樣的服...

    Corwien 評(píng)論0 收藏0
  • 《從零構(gòu)建前后分離web項(xiàng)目》探究 - 深入聊聊前后分離架構(gòu)

    摘要:什么是前后分離前后端分離并不是什么新鮮事,到處都是前后端分離的實(shí)踐。然而一些歷史項(xiàng)目在從一體化設(shè)計(jì)轉(zhuǎn)向前后端分離的架構(gòu)時(shí),不可避免的會(huì)遇到各種各樣的問(wèn)題。搞了一個(gè)前后分離,需要分離部署。 探究 :深入聊聊前后分離架構(gòu) 前后分離,一直是一個(gè)相當(dāng)泛泛的問(wèn)題,前后分離到底好不好?沒(méi)有絕對(duì)的對(duì),沒(méi)有絕對(duì)的錯(cuò),業(yè)界就這個(gè)問(wèn)題已經(jīng)激烈的探討幾年了.出現(xiàn)討論的點(diǎn)在于:分離當(dāng)然是好的,但是以什么樣的服...

    lunaticf 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<