前端模板引擎

article/2025/8/17 2:23:32
一. 为什么要使用模板引擎

关于为什么要使用模板引擎, 就我现在的项目而言,我还停留在进行发送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或其他格式的数据.皆是需要通过后台给定的接口文档为准.

作者:Lee_tanghui
链接:https://www.jianshu.com/p/2ad73da601fc


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

相关文章

后台系统前端模板

后台系统前端模板——WeAdmin Layui作为后台开发的前端框架&#xff0c;一直以来深受后端开发人员的喜爱。今天这篇文章展示WeAdmin设计巧妙之处&#xff0c;如果需要自定义菜单结构、理解其中的代码和运作原理&#xff0c;这里会给大家演示其修改过程&#xff01; 下面我给大…

初识前端模板

作者&#xff1a;yaya(http://weibo.com/zinkey) 王集鹄(http://weibo.com/zswang) 总述 “模板”这个词&#xff0c;可能很多人第一印象是后端的技术&#xff08;Smarty&#xff0c;Velocity等&#xff09;&#xff0c;但本文要讲的却不是后端的概念&#xff0c;而是前端开发…

前端html-部件模板收集(附源码)

目录 1.下拉列表 1.1 简单下拉菜单 1.2 输入框的下拉列表 1.2 响应式 JavaScript 侧边栏下拉菜单 可折叠隐藏 2.定位导航 3.选项卡切换 3.1 简单选项卡切换-自动 3.2 简单选项卡切换延时 4.轮播图 4.1 渐变轮播 4.2 滚动轮播&#xff08;走马&#xff09; 4.2.3 简单…

【前端开源模板推荐】

前端开源模板推荐 几款前端开源模板 做前端&#xff0c;直接开开源模板不仅省很多工夫&#xff0c;而且还比较美观&#xff0c;所以收藏一些&#xff0c;以备查用。 1、AdminLTE AdminLTE是一个完全响应的后台管理模板。基于Bootstrap3框架。高度可定制&#xff0c;易于使用。适…

几款前端开源模板

做前端&#xff0c;直接开开源模板不仅省很多工夫&#xff0c;而且还比较美观&#xff0c;所以收藏一些&#xff0c;以备查用。 1、AdminLTE AdminLTE是一个完全响应的后台管理模板。基于Bootstrap3框架。高度可定制&#xff0c;易于使用。适合许多屏幕分辨率从小型移动设备到…

使用win10的画图将照片变为2寸大小

材料/工具 一台电脑 方法 1 找到你要调整的图片&#xff0c;单击鼠标右键&#xff0c;选择【编辑】。 风云怎样压缩照片大小_2020全新版免费下载图片压缩器查看详情>>广告 2 打开后界面如图&#xff0c;点击【重新调整大小】。 3 弹出如图界面&#xff0c;点击【像素…

1寸照片如何修改底色?证件照换背景教程

许多报名平台上传一寸证件照时都对背景颜色有具体要求&#xff0c;那么我们就需要证件照换底色来应对&#xff0c;本文将介绍一个快速证件照换背景&#xff08;https://www.yasuotu.com/coloreplace&#xff09;的方法&#xff0c;可以一键将一寸证件照换底色&#xff0c;下面是…

一张照片快速生成1寸照片,小白可用

talk is cheep,show you the code import matplotlib.pyplot as plt import matplotlib.image as mpimg from matplotlib import animation import paddlehub as hub from PIL import Image, ImageSequence import numpy as np import os import cv2# 定义人脸识别和人物识别的…

ps制作2寸照片教程蓝底,ps怎么p二寸照片详细步骤

ps制作2寸照片教程蓝底?ps怎么p二寸照片详细步骤。在日常生活当中经常会用到二寸证件照,很多人都还要跑到数码馆去照相再让人家修图,最后再打印出来,一套照片下来几十元。如果你知道ps制作2寸照片教程蓝底?了解ps怎么p二寸照片详细步骤,下载一个ps分分钟就搞定了,只需要…

计算机画图如何把二寸照片修改为一寸,win7使用自带画图工具把照片调整成2寸的方法...

工作生活中我们需要要一寸或两寸照片当证件照&#xff0c;大家第一反应就是去照相馆拍照&#xff0c;这样比较麻烦。其实我们可以win7旗舰版系统使用自带画图工具来制作2寸相片&#xff0c;操作简单且不复杂。感兴趣的小伙伴一起看下win7系统用自带画图工具把相片调整成2寸的方…

程序员的进阶课-架构师之路(大纲)-思维导图

我的微信公众号&#xff1a;架构真经&#xff08;id&#xff1a;gentoo666&#xff09;&#xff0c;分享Java干货&#xff0c;高并发编程&#xff0c;热门技术教程&#xff0c;微服务及分布式技术&#xff0c;架构设计&#xff0c;区块链技术&#xff0c;人工智能&#xff0c;大…

软考高级-系统架构师-案例分析-架构设计

本篇博文目录: 考点分析一.软件架构风格1.基本概念2.真题案例分析 二.质量属性与架构评估1.基本概念2.案例分析 三.Web架构综合考查1.Web服务器技术演变(1) 负载均衡技术(2) 持久化技术-ORM(3) 数据库读写分离 2.缓存技术3.Redis技术4.CDN(内容分发网络)5.XML与JSON6.Web应用服…

从程序员到架构师,你修炼到哪个境界了?

架构师是程序员的奋斗目标。 我身边的很多优秀程序员&#xff0c;都在暗暗努力往架构师能力栈靠拢。很多人技术很过硬也参与过大型项目、还有的人对新技术信手拈来、也有一些人勤勤恳恳在努力做好手里的事情。 但你会发现&#xff0c;当他们遇到实际业务场景的架构问题&#xf…

程序员到底牛到什么程度才能成为架构师?

身为技术人&#xff0c;相信你也思考过这个问题&#xff1a;工作了几年&#xff0c;代码写得非常熟练&#xff0c;上线的程序也少有 bug &#xff0c;时不时还能搞个技术分享&#xff0c;但接下来要往哪个方向发展呢&#xff1f; 想来无非是 3 种选择&#xff1a;专精技术、转型…

程序员的职业发展道路到底有哪些?

昨天有朋友提问&#xff0c;关于程序员的职业发展路线&#xff0c;简单来讲下这块。程序员我来定义的话&#xff0c;就是用代码改变世界&#xff0c;但是最怕程序员在自我的世界里面&#xff0c;因为面对机器编码&#xff0c;越来越不善交谈&#xff0c;这点是程序员欠缺的&…

程序员就业和发展前景,一文带你了解

程序员&#xff0c;英文是 code worker&#xff0c;顾名思义就是计算机程序的作者。它通常指从事计算机软件开发的人员&#xff0c;当然也包括用计算机语言编写程序来进行各种信息处理的人。现在软件行业中&#xff0c;程序员属于技术含量较高的一个群体。程序员就业和发展前景…

架构师之路一-架构师入门指引

点击箭头处 “JAVA日知录” &#xff0c;关注并星标哟&#xff01;&#xff01; 导读&#xff1a;本系列文章教你怎么样成为一名架构师&#xff0c;而本篇文章则带你先认识一下什么是架构师&#xff0c;架构师的工作是什么&#xff1f; 为什么需要架构师 为什么需要架构师或者说…

程序员转型架构师,推荐你读这两本书

平时工作太忙&#xff0c;没有充足时间的看书&#xff0c;无暇系统地学&#xff0c;以致于在知识运用上出现了“力不从心”和本领恐慌现象&#xff0c;这是制约自身能力发展的最大“瓶颈”。 克服本领恐慌最直接最有效的方法就是定期给自己充电。 正好趁这次长假好好看看书&…

我心里优秀架构师是怎样的?

先声明&#xff0c;这不是在打广告……。之所以那么认真看个宣传视频&#xff0c;是因为曾经阅读过李智慧老师的书籍&#xff08;大型网站技术架构--核心原理与案例分析&#xff09;&#xff0c;书写的挺好&#xff0c;有兴趣的可以阅读下。 本文内容来源于&#xff1a;李智慧…

同是程序员,为什么架构师待遇比你高一倍?

架构不是一个职业而是一种能力,每一种架构师只不过是在不同的领域里面使用不同的技术,没有什么可对比,就好比如你问一个篮球明星和一个足球明星有什么区别一样! 一、架构师需要考虑四个问题 确定系统干什么不干什么,也就是说系统的边界在哪里? 确定架构内部的模块与模块之间…