使用Handlebars模塊化你的頁面

Handlebars的layout和partials

Handlebars的layout文件和partials文件坛悉,可以是我們很輕松的組織一些公共的頁面或代碼片段官册,使得前端視圖可維護性非常高焰宣。

Handlebars的layout文件

Express+express-handlebars項目中岔霸,我們定義好頁面的layout文件后,然后在內(nèi)容變化的位置加入{{{body}}}粒氧,這樣我們每次渲染頁面都會替換到{{{body}}}中喳篇,這種“布局文件”的概念大大的降低了我們的維護成本敞临。

Handlebars的partials文件

partials文件,也就是片段文件麸澜,可以放置公共的引用挺尿。
在配置Handlebars的時候,我們可以指定partials文件目錄:

var hbs = exphbs.create({
    partialsDir: 'views/partials',
    layoutsDir: "views/layouts/",
    defaultLayout: 'main',
    extname: '.hbs',
    helpers: hbsHelper
});

這樣在partials目錄下定義的handlebars文件都會是partials文件炊邦,使用方法:{{> head}}编矾。

下面是一個布局文件(layout.hbs),同時使用了partials文件馁害,可供參考:

<!doctype html>
<html>
<head>
    {{> head}}
</head>
<body class="hold-transition skin-blue layout-top-nav">
<div class="wrapper">
    {{>header}}
    <!-- Full Width Column -->
    <div class="content-wrapper">
        <div class="container">
            {{{body}}}
        </div>
    </div>
</div>
{{>footer}}
<script src="/js/app.js"></script>
</body>
</html>

使用Helper實現(xiàn)段落功能

所謂段落功能窄俏,就是我們在頁面預置一個位置,動態(tài)來渲染這個位置的代碼(代碼可以是html碘菜、js凹蜈、或者css)。
概念聽起來可以有些模糊忍啸,我們舉個例子:


舉個栗子

我們已經(jīng)知道仰坦,上面的layout.hbs文件是一個布局文件,所有的跳轉(zhuǎn)頁面都會通過這個布局文件來渲染內(nèi)容计雌,那么現(xiàn)在假如有一個個例頁面(/hello請求渲染的頁面)悄晃,需要用js來處理一段代碼呢?

<script>
alert('hello world');
</script>

如果我們在layout中加入這段js代碼凿滤,那么所有的頁面都會打印hello world传泊,顯然不是我們想要的,我們僅僅是想在請求/hello的時候打印鸭巴。

用partials?可以嗎拦盹?答案是不可以鹃祖。
partials僅能來組織公共的代碼片段,不是用來個性化的普舆。

那么又有童靴提出解決方案:在/hello渲染的頁面底下加上不就行了嗎恬口?
如:hello.hbs

這也是一種解決方案校读,但是出來的代碼不倫不類,查看/hello渲染的頁面源碼:

```javascript
<!doctype html>
<html>
<head>
    {{> head}}
</head>
<body class="hold-transition skin-blue layout-top-nav">
<div class="wrapper">
    {{>header}}
    <!-- Full Width Column -->
    <div class="content-wrapper">
        <div class="container">
            <script>
            alert('hello world');
            </script>
        </div>
    </div>
</div>
{{>footer}}
<script src="/js/app.js"></script>
</body>
</html>

我們的script代碼片段跑到container里了祖能!這個簡單的例子能滿足需求歉秫,但是加入javascript片段依賴jquery,而jquery是在{{>footer}}里引用呢养铸?這里肯定就會報錯了雁芙。

使用Helper優(yōu)雅的解決段落問題

Handlebars提供了強大的Helper支持,使我們解決這個問題變得簡單明了钞螟。

首先我們定義一個helper兔甘,來組織這些個性片段(這些片段可能包含js、css鳞滨、特殊的html等等)洞焙。

section: function(name, block){
    if(!this._sections) this._sections = {};
    this._sections[name] = block.fn(this);
    return null;
},

在這個helper 中,我們定義了_sections變量(需要理解handlebars中的this關(guān)鍵字)拯啦,當指定了_sectionsname時澡匪,就會動態(tài)渲染session中的內(nèi)容。

如何使用褒链?
首先我們可以在layout中預置一個section唁情。如果我們渲染動態(tài)的js段落,需要放到{{> footer}}下面碱蒙。以下是改造后的layout文件部分代碼:

{{>footer}}
<script src="/js/app.js"></script>
{{{_sections.js}}}
</body>
</html>

說明:{{{_sections.js}}}這段是預置的代碼荠瘪,意思是從this._sections變量中取namejs的段落,渲染在這里赛惩。如果當前頁面沒有js則不渲染哀墓。

位置預置好了,我們就可以寫具體的段落了喷兼。接上個例子篮绰,只想在請求/hello頁面中打印hello world,就可以在hello.hbs中任意位置加入下面段落(最好是在頁面最底下季惯,方便維護)吠各。

{{#section 'js'}}
    <script>
        alert('hello world')
    </script>
{{/section}}

這樣當我們請求/hello時,就會打印hello world勉抓,請求其他頁面則不會有這段js代碼贾漏。

養(yǎng)成良好的代碼組織能力,有助于提高我們的編碼質(zhì)量藕筋!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纵散,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伍掀,老刑警劉巖掰茶,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蜜笤,居然都是意外死亡濒蒋,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門把兔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沪伙,“玉大人,你說我怎么就攤上這事垛贤⊙嫫海” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵聘惦,是天一觀的道長某饰。 經(jīng)常有香客問我,道長善绎,這世上最難降的妖魔是什么黔漂? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮禀酱,結(jié)果婚禮上炬守,老公的妹妹穿的比我還像新娘。我一直安慰自己剂跟,他們只是感情好减途,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著曹洽,像睡著了一般鳍置。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上送淆,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天税产,我揣著相機與錄音,去河邊找鬼偷崩。 笑死辟拷,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的阐斜。 我是一名探鬼主播衫冻,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谒出!你這毒婦竟也來了羽杰?” 一聲冷哼從身側(cè)響起渡紫,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎考赛,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莉测,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡颜骤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了捣卤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忍抽。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖董朝,靈堂內(nèi)的尸體忽然破棺而出鸠项,到底是詐尸還是另有隱情,我是刑警寧澤子姜,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布祟绊,位于F島的核電站,受9級特大地震影響哥捕,放射性物質(zhì)發(fā)生泄漏牧抽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一遥赚、第九天 我趴在偏房一處隱蔽的房頂上張望扬舒。 院中可真熱鬧,春花似錦凫佛、人聲如沸讲坎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晨炕。三九已至,卻和暖如春厚满,著一層夾襖步出監(jiān)牢的瞬間府瞄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工碘箍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留遵馆,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓丰榴,卻偏偏與公主長得像货邓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子四濒,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容

  • hbs是Express提供的默認視圖引擎, 是對Handlerbars的封裝. 具體用法參考下面的項目地址, 這里...
    烈風裘閱讀 13,969評論 0 3
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,162評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理换况,服務(wù)發(fā)現(xiàn)职辨,斷路器,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 本文介紹seajs和hanlebars戈二,并實現(xiàn)前端控件組件化. 我想實現(xiàn)的是把組件單獨一個文件夾舒裤,js和css,h...
    木易林1閱讀 1,401評論 0 1
  • 早飯后觉吭,步行去銀行辦事腾供,現(xiàn)在外出只要距離不是很遠我就選擇步行,一方面可以健身鲜滩,一方面能夠欣賞路邊風景伴鳖。今天的太陽有...
    荷塘戀雨閱讀 329評論 0 2