使用Handlebars模块化你的页面

Handlebars的layout和partials

Handlebars的layout文件和partials文件,可以是我们很轻松的组织一些公共的页面或代码片段,使得前端视图可维护性非常高。

Handlebars的layout文件

Express+express-handlebars项目中,我们定义好页面的layout文件后,然后在内容变化的位置加入{{{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实现段落功能

所谓段落功能,就是我们在页面预置一个位置,动态来渲染这个位置的代码(代码可以是html、js、或者css)。
概念听起来可以有些模糊,我们举个例子:


举个栗子

我们已经知道,上面的layout.hbs文件是一个布局文件,所有的跳转页面都会通过这个布局文件来渲染内容,那么现在假如有一个个例页面(/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优雅的解决段落问题

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关键字),当指定了_sectionsname时,就会动态渲染session中的内容。

如何使用?
首先我们可以在layout中预置一个section。如果我们渲染动态的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代码。

养成良好的代码组织能力,有助于提高我们的编码质量!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • hbs是Express提供的默认视图引擎, 是对Handlerbars的封装. 具体用法参考下面的项目地址, 这里...
    烈风裘阅读 13,787评论 0 3
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,400评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 本文介绍seajs和hanlebars,并实现前端控件组件化. 我想实现的是把组件单独一个文件夹,js和css,h...
    木易林1阅读 1,378评论 0 1
  • 早饭后,步行去银行办事,现在外出只要距离不是很远我就选择步行,一方面可以健身,一方面能够欣赏路边风景。今天的太阳有...
    荷塘恋雨阅读 317评论 0 1