前端模板引擎:Handlebars

article/2025/11/9 16:27:18

Handlebars.jpg

一. 为什么要使用模板引擎

关于为什么要使用模板引擎, 就我现在的项目而言,我还停留在进行发送Ajax请求到后台后,利用模板引擎拼接接受到的JSON字符串,展现到页面的地步. 按照我老师的一句话表达:不用重复制造轮子. 对于为什么要使用模板引擎的解释,我看过最好的回答来自知乎上niko的回答:

模板最本质的作用是【变静为动】一切利用这方面的都是优势,不利于的都是劣势。要很好地实现【变静为动】的目的,有这么几点:
1. 可维护性(后期改起来方便)
2. 可扩展性(想要增加功能,增加需求方便)
3.开发效率提高(程序逻辑组织更好,调试方便)
4.看起来舒服(不容易写错)
从以上四点,你仔细想想,前端模板是不是无论从哪方便优势体现都不是一点两点。其实最重要的一点就是:【视图(包括展示渲染逻辑)与程序逻辑的分离】分离的好处太多了,更好改了,更好加东西了,调试也方便了,看起来也舒服了,应用优秀的开发模式更方便了(mvvc,mvc等).

二. 选择Handlebars的原因

1. 全球最受欢迎的模板引擎

Handlebars是全球使用率最高的模板引擎,所以当之无愧是全球最受欢迎的模板引擎.Handlebars在许多前端框架中都被引入,比如在MUI和AmazeUI等框架,都推荐使用Handlebars.以AmazeUI为例,AmazeUI的文档中专门为Web组件提供了其Handlebars的编译模板

Amaze UI 提供的开发模板中,包含一个 widget.html 文件,里面展示了 Widget 在纯浏览器环境中的使用。要点如下:1.引入 Handlebars 模板 handlebars.min.js;
2.引入 Amaze UI Widget helper amui.widget.helper.js;
3.根据需求编写模板 <script type="text/x-handlebars-template" id="amz-tpl">{{>slider slider}}</script>;
4.传入数据,编译模板并插入页面中。$(function() {var $tpl = $('#amz-tpl');var source = $tpl.text();var template = Handlebars.compile(source);var data = {};var html = template(data);$tpl.before(html);
});

2. 语法简单

Handlebars的基本语法极其简单,使用{{value}}将数据包装起来即可,Handlebars会自动匹配响应的数值和对象.以下是一个最简单的模板:

<div class="demo"><h1>{{name}}</h1><p>{{content}}</p>
</div>

三.如何使用Handlebars

1. 下载Handlebars

  • 通过Handlebars官网下载: http://handlebarsjs.com./installation.html
  • 通过npm下载: npm install --save handlebars
  • 通过bower下载: bower install --save handlebars
  • 通过Github下载: https://github.com/daaain/Handlebars.git
  • 通过CDN引入:https://cdnjs.com/libraries/handlebars.js

2. 引入Handlebars

通过<script>标签引入即可,和引入jQuery库类似:

<script src="./js/handlebars-1.0.0.beta.6.js"></script>

3. 创建模板

  • 步骤一: 通过一个<script>将需要的模板包裹起来
  • 步骤二: 在<script>标签中填入typeid
    • type类型可以是除text/javascript以外的任何MIME类型,但推荐使用type="text/template",更加语义化
    • id是在后面进行编译的时候所使用,让其编译的代码找到该模板.
  • 步骤三: 在<script>标签中插入我们需要的html代码,根据后台给我们的接口文档,修改其需要动态获取的内容
<script type="text/template" id="myTemplate"><div class="demo"><h1>{{name}}</h1><p>{{content}}</p></div>
</script>

4. 在JS代码中编译模板

//用jQuery获取模板
var tpl   =  $("#myTemplate").html();
//预编译模板
var template = Handlebars.compile(tpl);
//匹配json内容
var html = template(data);
//输入模板
$('#box').html(html);

以上述代码为例进行解释:

  • 步骤一: 获取模板的内容放入到tpl中,这里$("#myTemplate")中填入的内容为你在上一步创建模板中所用的id.
    • 提醒: 这里我使用的jQuery的选择器获取,当然,你可以使用原生javascriptDOM选择器获取,例如:docuemnt.getElementById('myTemplate')document.querySelector('#myTemplate')
  • 步骤二: 使用Handlebars.compile()方法进行预编译,该方法传入的参数即为获取到的模板
  • 步骤三: 使用template()方法进行编译后得到拼接好的字符串,该方法传入的参数即为上一步预编译的模板.
  • 步骤四: 将编译好的字符串插入到你所希望插入到的html文档中的位置,这里使用的是jQuery给我们提供的html()方法.同样,你也可以使用原生的innerHTML

四.案例演示

以下面的慢慢买网站为例,该项目中的手机列表,是通过Ajax动态获取的,我们不可能在html文档中写入全部的手机列表代码,这是不可能的.所以我们需要通过Handlebars来帮我们将后台传递过来的数据动态的显示到html文档中.


慢慢卖的项目

慢慢卖的项目

1. 在HTML中引入:Handlebars,jQuery和本页的Js代码

<script src="./lib/bootstrap/js/jquery-3.2.1.js"></script> //Handlebars
<script src="./js/handlebars-1.0.0.beta.6.js"></script> //jQuery
<script src="./js/product.js"></script>  //本页的Js代码

2. 创建模板

在未插入模板的情况下,页面显示如下,现在我们来使用Handlebars让数据动态的显示在网页上.


未使用Handlebars的页面

未使用Handlebars的页面

<!--定义模板 --><script type="text/template" id="product-list-tepl">{{#each result}} <li><a href="#"><div class="product-img">{{{productImg}}}</div><div class="product-text"><h5>{{productName}}</h5><p>{{productPrice}}</p></div><div class="other"><span>{{productQuote}}</span><span>{{productCom}}</span></div></a></li>{{/each}}</script>

以上模板中的{{#}}为Handlebars的helper语法,可以实现Javascript中的逻辑和循环运算.更多使用方法可以参考: http://www.ghostchina.com/introducing-the-handlebars-js-templating-engine/

3. 在JS代码中编译模板

//定义getList()函数来发送Ajax请求,传递的参数为后台给的接口文档中定义的参数
function getList(categoryId,pageid){//调用jQuery的Ajax()方法来发送Ajax请求$.ajax({type:'get',url:'http://182.254.146.100:3000/api/getproductlist',data:{pageid:pageid||1,categoryid:categoryId},success:function(data){//用zepto获取模板var tpl   =  $("#product-list-tepl").html();//预编译模板var template = Handlebars.compile(tpl);//匹配json内容var html = template(data);//插入模板,到ul中$('.product-list ul').html(html);}})
}//入口函数
$(function(){//获取到查询字符串的idvar categoryId = Number(GetQueryString("categoryid"));  //getQueryString()是获取上一步传递过来的查询字符串的方法//调用定义的getList()获取手机列表getList(categoryId);
})//获取上一步传递过来的查询字符串的方法
function GetQueryString(name) {var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");var r = window.location.search.substr(1).match(reg);if (r != null) return unescape(r[2]);return null;
}

4. 插入模板后的页面如下

使用Handlebars后的页面

使用Handlebars后的页面

通过上面的案例,我相信大家应该能够明白模板引擎的强大,我们只需要在页面中写好一个手机列表的HTML代码,即可动态获取后台传递过来的所有信息,从而在页面中进行展示.

注意: 在实际开发中,我们通过Ajax发送请求时所需要传递的参数,和获取到的JSON或其他格式的数据.皆是需要通过后台给定的接口文档为准.


http://chatgpt.dhexx.cn/article/kkdha9dy.shtml

相关文章

SpringBoot (二) 整合前端模板引擎FreeMarker、thymeleaf

哈喽&#xff0c;大家好&#xff0c;我是有勇气的牛排&#xff08;全网同名&#xff09;&#x1f42e;&#x1f42e;&#x1f42e; 有问题的小伙伴欢迎在文末评论&#xff0c;点赞、收藏是对我最大的支持&#xff01;&#xff01;&#xff01;。 前言 开发网站的时候&#x…

如何选择 Web 前端模板引擎?

&#xff08;点击上方公众号&#xff0c;可快速关注&#xff09; 作者&#xff1a;喻恒春 my.oschina.net/editorial-story/blog/1825266 Web 模板就在那里 模板引擎负责组装数据&#xff0c;以另外一种形式或外观展现数据。 浏览器中的页面是 Web 模板引擎最终的展现。 无论你…

Juicer – 一个 JavaScript 模板引擎的实现和优化

说明 本文转载自&#xff1a;淘系前端团队&#xff1a;Juicer – 一个 JavaScript 模板引擎的实现和优化 介绍 让我们从一段代码说起&#xff0c;假设有一段这样的 JSON 数据&#xff1a; var json {name: 流火,blog: ued.taobao.org };我们需要根据这段 JSON 生成这样的 …

模板引擎?看这一篇就懂了

概念 模板引擎可以让&#xff08;网站&#xff09;程序实现界面与数据分离&#xff0c;业务代码与逻辑代码的分离&#xff0c;这就大大提升了开发效率&#xff0c;良好的设计也使得代码重用变得更加容易。 光看生硬的概念没有用&#xff0c;接下来我来给大家详细解释&#xff0…

前端模板引擎 artTemplate

artTemplate是新一代 javascript 模板引擎 特性&#xff1a;性能卓越&#xff0c;执行速度通常是 Mustache 与 tmpl 的 20 多倍&#xff08;性能测试&#xff09; 支持运行时调试&#xff0c;可精确定位异常模板所在语句&#xff08;演示&#xff09; 对 NodeJS Express 友好…

js模板引擎渲染html,JavaScript模板引擎 art-template.js 的使用

一、基本使用 1、引入模板引擎(版本为4.13.2) 2、编写模板和渲染的容器 {{title}} 3、获取模板并往模板里插入数据 var data { title: "hello world", desc: " 这是一段描述" }; var html template("test-template",data); 4、把模板渲染到页面…

前端开发--art-template模板引擎及实现原理

#博学谷IT学习技术支持# 目录 简介 安装 使用步骤 ​编辑 art-template标准语法 值输出 原文输出 条件输出 循环输出 过滤器 模板引擎的实现原理 1.基本语法 2.分组 3.字符串的replace函数 4.多次replace 5.使用while循环replace 6.replace替换为真值 实现简…

template.js——前端模板引擎

1. 什么情况下推荐使用template.js (1)在你的页面布局中存在一样的模块,可以提出公共的模块,便于维护 注:此处用到循环来减少工作量 对应代

jquery template.js前端模板引擎

1、加载模板引擎js&#xff08;jquery.tmpl.js&#xff09; 可下载链接&#xff1a;https://github.com/BorisMoore/jquery-tmpl 2、直接上代码 <script type"text/javascript" src"${ctxStatic}/web/js/jquery.tmpl.js"></script> <!--…

java 前端模板_前端模板引擎入门

模板引擎 模板引擎 起到 数据和视图分离的作用&#xff0c; 模板对应视图&#xff0c; 关注如何展示数据&#xff0c; 在模板外头准备的数据&#xff0c; 关注那些数据可以被展示。 后端模板引擎 freemarker 如下介绍&#xff0c; java后台的模板引擎&#xff0c; freemark介绍…

art-template前端模板引擎

目录 内容介绍一、使用方法二、主要API1、原文输出2、逻辑判断3、循环语句 三、代码四、页面显示五、其他1、pre标签2、code标签 内容介绍 今天我们要了解的是一款高性能的 art-template 前端模板引擎 —— template-web.js。 一、使用方法 定义容器元素通过type"text/…

前端模板引擎——handlebars

目录 一、代码二、页面显示 一、代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>handlebars 前…

ESLINT错误提示 no-unused-vars

ESLINT错误提示 no-unused-vars 使用ESLINT时遇到如下错误的提示 查阅资料得知&#xff0c;是需要使用插件 https://github.com/typescript-eslint/typescript-eslint/issues/941 全局按照 eslint-plugin-react npm install eslint-plugin-react -g 修改eslint的配置项 "e…

Jmeter书中不会教你的(2)——vars.get和${}引用区别

在上一篇中&#xff0c;我们了解了在beanshell中可以利用vars获取和设置新的变量&#xff0c;也知道了如何用log去查看日志&#xff0c;以及两种获取变量值的方法。没看过的可以点这里Jmeter书本中不会教你的&#xff08;1&#xff09;——beanshell用来获取变量和设置变量的va…

【Python报错-01】解决matplotlib在Pycharm中运行报错:vars()参数必须有__dict__属性

1 运行错误 &#xff08;1&#xff09;程序的原代码如下图所示&#xff1a; import matplotlib.pyplot as plt # 是可视化绘图工具 …… #省略了计算SSE的代码 plt.plot(range(1, 11), SSE) plt.xlabel("聚类数k", fontsize12) plt.ylabel("误差平方和SSE&…

Jmeter书中不会教你的(1)——beanshell用来获取变量和设置变量的vars

这几年Jmeter用的相对比较多&#xff0c;自己每次在做项目时也常会去翻看以前遇到的问题&#xff0c;记录的一些技巧&#xff0c;解决方案&#xff0c;也一直考虑把它整理出来&#xff0c;一来方便自己查找&#xff0c;二来也希望同行可以互相切磋。我写的这些文章不是针对Jmet…

eslint 配置no-unused-vars规则,TypeScript接口抛出“ no-unused-vars”报错

1.项目使用了typescript&#xff0c;并在.eslintrc.js中使用该配置&#xff0c;type类型接口形参检测报错 no-unused-vars: 检测未使用的变量&#xff0c;函数和函数的参数 type类型接口如下&#xff1a; 报错如下&#xff1a; 2.解决 将 “no-unused-vars” 替换成 “typesc…

mmdetection报错 TypeError: vars() argument must have __dict__ attribute

下载官方代码&#xff0c;安装好环境后第一个demo就报错 报错1、error: the following arguments are required: img, config, checkpoint 添加-- 报错2、manager_pyplot_show vars(manager_class).get("pyplot_show")TypeError: vars() argument must have __dict_…

Pycharm使用matplotlib报错:TypeError: vars() argument must have __dict__ attribute 解决方法

Pycharm使用matplotlib绘图时报错 问题描述 TypeError: vars() argument must have __dict__ attribute源程序&#xff1a; # -*- encoding: utf-8 -*-File : MaLearnTest01_1.py Time : 2023/03/03 09:39:05 Author : seveN1foR Version : 1.0 Contact : s…

JMeter常用内置对象:vars、ctx、prev

在前文 Beanshell Sampler 与 Beanshell 断言 中&#xff0c;初步阐述了JMeter beanshell的使用&#xff0c;接下来归集整理了JMeter beanshell 中常用的内置对象及其使用。 注&#xff1a;示例使用JMeter版本为5.1 1 vars 如 API 文档 所言&#xff0c;这是定义变量的类&am…