分享好友 最新动态首页 最新动态分类 切换频道
信息流广告是什么意思?/关键词seo
2024-12-27 10:56

若显示效果不佳,可移步到愚安的小窝

Handlebars模板引擎作为时下最流行的模板引擎之一,已然在开发中为我们提供了无数便利。作为一款无语义的模板引擎,Handlebars只提供极少的helper函数,还原模板引擎的本身,也许这正是他在效率上略胜一筹的原因,这里有一个网友测试,表明Handlebars在万行效率上,稍胜jade,EJS一筹。当然,模板引擎这种东西除了效率外,开发效率,美观度也是很重要的考评一个模板引擎优劣的指标,例如,很多开发者都觉得Jade十分简洁、开发很爽。愚安在这里并不想立Flag引战。关于Handlebars为何在效率上有这样的优势,愚安在这里就不继续深入了,有兴趣的童鞋可以参见一下源码

当然,也有不少用户表示Handlebars提供的功能太少了,诸如

  1. if只能判断condition只能为一个值,不能为一个express
  2. 不提供四则运算
  3. 不能进行索引
    ...

    但Handlebars为我们提供了registerHelper函数,让我们可以轻松注册一些Helper去扩展Handlebars,辅助我们更快的开发。当然Handlebars也为我们提供内置了几个Helper,如each,if,else,with等,其中each作为唯一内置的循环helper在模板编写的过程中有诸多可以发挥的地方。

    1.循环数组
 
 

输出结果为

 

这是一个非常普通的数组循环输出

2.循环对象
 
 

输出结果为

 

这里的@key就是对象里的属性名,关于原理,后面的代码解读里会稍作解释

3.内部嵌套循环
 
 

输出结果为

 

这里是一个嵌套循环,第一个each循环list层,属性有name,sports,scores,在第二个each循环scores,此时的this指向数组scores里的每个score,指向上层结构中的sports。

在同一个对象中,访问上层数据,仿佛很好理解,如保留一个最上层的引用,向下寻找。但其实,这里的路径层次并不是在一个对象里的层次关系(应该不是只有我一个人这么认为的吧,而是多个each循环的嵌套层次,下个例子中就可以看出。

4.多重嵌套循环

这里有一个全国各省、直辖市的地名与邮编的数组zone,还有一个区域划分的数组catZone。

 

现在希望将各个地名按区域做成表格,首先,需要循环catZone,拿出其中的code数组并进行第二个,然后去zone数组中去找code为当前code的地名,但code并不是索引,无法直接得到,所以继续循环遍历zone(此时 /zone 为data中的zone,比较zone中code与第二个each循环中code(http://www.ztmm.cn/this 指向上层的this)是否相等。

 

最终效果如下

源码解读

从上面的例子可以看出,自带的Helper:each是一个非常强大辅助函数。不但可以循环遍历数组和对象,而且支持一种以路径符来表示的嵌套关系。从最后一个例子可以看出,这种嵌套索引并不是一种从顶层向下的关系,而是从当前层出发,寻觅上层数据的做法(记为当前层的parent,多层可以通过parent.parent.parent...索引到,这样既保证了数据结构的轻便,又实现了应有的功能。接下来,我们从源码层去看看具体的实现。

 

上面的代码就是原生each-helper的实现过程,看似很简单,但又看不出什么门道。好的,既然已经把源码扒拉出来了,愚安我如果不讲讲清楚,也对不起标题中的浅读二字。

注1:contextPath(上下文路径

 

appendContextPath方法在最终会在当前层的data上构造一个这样的contextPath = id.index.id.index.id.index....(index为Array索引或Object的key)
注2:frame(数据帧

 

数据帧是编译Handlebars模板文件,非常重要的一环,他将当前上下文所有的数据封装成一个对象,传给当前fn,保证fn能拿到完成的上下文数据,可以看出这里的_parent就是上文例子中路径符可以访问到上层数据的原因。说到这里,Handlebars是怎么处理这种路径符的呢,请看

 

AST是Handlebasr的compiler中非常基础的一部分,他定义了几种节点类型,其中IdNode就是通过路径符转化来的,就是上文contextPath中的id。正是IdNode的存在,才使得Handlebars在无语义的基础上,可以适应各种形式的数据,各种形式的嵌套。

注3:fn(编译而来的编译函数
听起来有点拗口,但确实是这样一个存在,Handlebars的compiler在编译完模板之后,会生成一个fn,将context传入此fn,便可以得到当前上下文对应的HTML字符串ret

 

这里具体的代码戳这里,编译本身是个很复杂的事情,既需要有清晰的结构,完整的规范,又要有一定的优化和冗余手段,我在这里就不讲了(其实我也不懂,555~)。可以看出createFunctionContext返回值为一个编译之后的Function就达到了目的。

结语

最新文章
直通车推广技巧:选词、出价、优化,提高ROI
作为一名资深的电商运营人员,我深知直通车推广在提升店铺流量和销量方面的重要性。很多新手卖家在操作直通车时往往会陷入一些误区,导致ROI偏低,甚至亏损。为了帮助大家更好地理解直通车推广的精髓,我将从选词、出价、优化三个方面来分
行业视角 | 哈尔滨骏展雷克萨斯总经理董占全:探秘黑龙江最大雷克萨斯店,人效与服务的博弈!
我们集团在整个黑龙江省有9家店,其中有7家是在哈尔滨,有两家是在整个黑龙江省外的,整个集团一共是9家店。那我们骏展雷克萨斯可以这么讲,是整个黑龙江省建筑面积是最大的一个雷克萨斯的经销商店。那整个建地面积是15,000平,建筑面积的
抖音开通膳食营养类目准备什么资料?开通具体步骤分享 今年快速渠道
在数字经济飞速发展的今天,短视频平台已经成为了各类品牌宣传、产品推广的重要渠道。抖音作为国内Zui受欢迎的短视频平台之一,凭借其强大的用户基数和丰富的内容生态,吸引了无数企业和个人入驻。如果你打算在抖音上开通膳食营养类目账号
用尖端科技赋能低空城市起降场数智运行
转自:天津日报  “忽如一夜春风来,千树万树梨花开”。低空经济作为战略性新兴产业融合发展的新赛道,已成为推动社会经济创新发展的新引擎。城市起降场作为低空经济的主要基础设施之一,其数智运行程度直接影响了低空经济的整体运行水平
详解人工智能领域重大突破:GPT-3
英语原文:Exploring GPT-3: A New Breakthrough in Language Generation翻译:雷锋字幕组GPT-3是什么?我们讨论15亿参数的 Generative Pretrained Transformer-2(GPT-2)的延迟发布是否合理,似乎还是去年的事情。如果你觉得其实没过多久
,掌握这些技巧,让百度轻松收录你的网站内容
在当今数字化时代,拥有一个网站对于个人和企业来说至关重要,仅仅拥有一个网站是不够的,更重要的是让百度等搜索引擎收录你的网站内容,以便更多的人能够找到你的网站,怎样才能让百度收录网站内容显示呢?下面将为大家介绍一些实用的技巧
谷歌chrome浏览器2023安卓最新
谷歌chrome浏览器是一款快速、安全且功能丰富的网络浏览器,干净整洁的界面以及快速地浏览速度带给用户舒适的使用体验,多功能的特点使用户可以畅快的浏览互联网、享受便捷的上网体验。网页翻译 - 您可以轻松浏览任何语言的网页节省数据流
这些A股光存储概念股名单,你需要知道!(12月12日)
  据南方财富网概念查询工具数据显示,相关光存储概念股:  1、中电兴发002298:12月12日消息,中电兴发5日内股价上涨13.23%,该股最新报6.880元涨3.28%,成交7.58亿元,换手率16.78%。  公司于2020年2月19日晚间披露2019年度非公开
都江堰seo优化价格【百度都江堰】
文章都江堰seo优化价格【百度都江堰】由网友旧时月色投稿,希望给你工作学习带来帮助。在当今数字化时代,搜索引擎优化(SEO)对于企业和个人的在线存在至关重要,都江堰作为一个充满活力和发展潜力的城市,也有许多企业和个人希望通过 SEO
构建个人投资组合网站:从基础到进阶
在数字时代,个人投资组合网站成为展示工作成果、技能和专业身份的不可或缺的平台。构建这样的网站不仅可以增强职业形象,还能在求职和客户互动中发挥关键作用。本章将引导你从零开始,详细探讨构建个人投资组合网站的整
相关文章
推荐文章
发表评论
0评