模板引擎
模板原理:
模板的诞生是为了将显示与数据分离,模板技术多种多样,但其本质是将模板文件和数据通过模板引擎生成最终的HTML代码。
模板技术并不是什么神秘技术,干的是拼接字符串的体力活。模板引擎就是利用正则表达式识别模板标识,并利用数据替换其中的标识符。比如:
Hello, <%= name%>
数据是{name: ‘木的树’},那么通过模板引擎解析后,我们希望得到Hello, 木的树。
模板的前半部分是普通字符串,后半部分是模板标识,我们需要将其中的标识符替换为表达式。
模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。 模板引擎不属于特定技术领域,它是跨领域跨平台的概念。在Asp下有模板引擎,在PHP下也有模板引擎,在C#下也有,甚至JavaScript、WinForm开发都会用到模板引擎技术。
比如我们需要在页面渲染一个列表:
<li>111</li>
<li>222</li>
<li>333</li>
列表中的数据是动态获取的一个数组data=[‘111’,’222’,’333’]。 如果不用模板引擎,直接用代码写,需要循环data,然后使用字符串拼接每一个li的数据:
html += "<li>" + data[i] + "</li>";
这就导致html 和 js 代码混杂在了一起,后期维护和阅读都不方便,模板引擎就可以用来将html和js进行解耦。把代码逻辑直接写在一个html里面,只要更换数据源,就能输出不同的页面代码了。
Handlebars 模板引擎
官方文档: http://handlebarsjs.com/
https://www.jianshu.com/p/c9c459c40250
https://webcache.googleusercontent.com/search?q=cache:QxA0wjWzScIJ:https://blog.csdn.net/m0_37836194/article/details/79041403+&cd=4&hl=zh-CN&ct=clnk&gl=hk
使用handlebars一般来说都是为了解决从后台拿数据,并实现后台数据前端渲染的问题。
是js的一个语义模板库,通过view和data的分离来快速构建Web模板。采用“Logic-less template”(无逻辑模板)的思路,Handlebars兼容Mustache,你可以在Handlebars中导入Mustache模板。handlebars支持的浏览器及运行环境有:IE6+ Chrome Firefox Safari5+ Operall11+以及node.js
handlebars 相当于一个js库,如同jquery一样,可以从http://handlebarsjs.com 中下载handlebars.js库,然后和引用Jquery库一样通过script标签将其添加引用。
Handlebars的基本语法极其简单,使用将数据包装起来即可,Handlebars会自动匹配响应的数值和对象。
Handlebars 使用
一个简单的示例:
第一,引入Hiberbars
像普通的js库一样引用
<script src="./js/handlebars-1.0.0.beta.6.js"></script>
第二,定义template
template 和 普通的html相同, 只是增加了 ,这里面的内容需要动态数据接口来确定。
通过一个script将需要的模板包裹起来,在script标签中填入type和id。
type类型可以是除text/javascript以外的任何MIME类型,推荐type=”text/template”,更加语义化,防止被当成一般的javascript被解析。id为了后期编译时找到该模板。
<script id="entry-template" type="text/x-handlebars-template">
<div class="entry">
<h1></h1>
<div class="body">
</div>
</div>
</script>
第三,编译template,生成目标html
//get template by ID, like other html elements
var source = document.getElementById("entry-template").innerHTML;
//compile
var template = Handlebars.compile(source);
//pass data into the template
var context = {title: "My New Post", body: "This is my first post!"};
var html = template(context);
得到的html为:
<div class="entry">
<h1>My New Post</h1>
<div class="body">
This is my first post!
</div>
</div>
可以将其插入页面当中显示:
document.getElementById(“divID”).innerHTML = html;
实用示例:
html 内容:
<!--模板. -->
<!--需要数据的地方,用括起来.-->
<script id="address-template" type="text/x-handlebars-template">
<p>You can find me in . My address is .</p>
</script>
<!--新的内容在这里展示-->
<div class="content-placeholder"></div>
javascript代码:
$(function () {
// 抓取模板
var theTemplateScript = $("#address-template").html();
// 编译模板
var theTemplate = Handlebars.compile(theTemplateScript);
// 定义数据
var context={
"city": "London",
"street": "Baker Street",
"number": "221B"
};
// 把数据传送到模板
var theCompiledHtml = theTemplate(context);
// 更新到页面显示
$('.content-placeholder').html(theCompiledHtml);
});
实例参考:
https://webcache.googleusercontent.com/search?q=cache:X6pxofzTyVUJ:https://www.cnblogs.com/diligenceday/p/4105229.html+&cd=3&hl=zh-CN&ct=clnk&gl=hk
https://webcache.googleusercontent.com/search?q=cache:ZRmpdGcQTLQJ:https://wm4n.github.io/%25E4%25BD%25BF%25E7%2594%25A8-Handlebars-js-%25E8%25BC%2595%25E9%25AC%2586%25E5%2581%259A-HTML-Template-%25E4%25B8%2580/+&cd=2&hl=zh-CN&ct=clnk&gl=hk
html中使用handlebars
在html中使用handlebars两种方式(类比javascript):
一,直接嵌入
二,使用.hbs文件外部链接
在html 中嵌入使用handlebars.js:以下代码可以拿来直接执行
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>test</title>
</head>
<body>
<script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/2.0.0/handlebars.js"></script>
<div id="div1"></div>
<script id="entry-template" type="text/x-handlebars-template">
<div class="entry">
<h1></h1>
<div class="body">
</div>
</div>
</script>
<script>
//JS代码
var source = $("#entry-template").html();
var template = Handlebars.compile(source);
var context = {title: "标题", body: "我是字符串!"}
var html = template(context);
document.getElementById("div1").innerHTML = html;
</script>
</body>
</html>
.hbs文件是什么?
类比js,将template code拿出来存为 .hbs文件;将js code拿出来存为 .js文件;
.hbs文件中的内容就是
<script id="entry-template" type="text/x-handlebars-template">
里面定义的template的内容,所以在.hbs中看不到这些标签,就类似于.js中看不到script标签一样。
.hbs文件是如何被使用到.html中去的?(not clear yet)
那么.js是通过 script 标签添加引用,.hbs文件如何添加引用呢?? 目前.hbs没有试用成功。
若将模板代码写成单独的.hbs文件时,需要在Js 中使用ajax请求该文件;
handlebars模板是可以预编译的,需要提前安装一些handlebars引擎相关工具,预编译后.hbs文件会变成一个 .js文件,可以当成普通的.js文件通过script标签在html文件中引用,但是在html中具体使用模板的格式还不太清楚,直接使用吗?
参考: https://webcache.googleusercontent.com/search?q=cache:qCG5u8Di_iAJ:https://codeday.me/bug/20180721/198443.html+&cd=1&hl=zh-CN&ct=clnk&gl=hk
handlebars官网中也提到,在Prod上面是不建议使用Js compile模板的,还是使用预编译的方式。
others
http://webcache.googleusercontent.com/search?q=cache:ipr_TlWS070J:web.jobbole.com/85948/+&cd=6&hl=zh-CN&ct=clnk&gl=hk
express中的handlebars引擎是这么生成页面的:
/* layout.hbs
* 主模板,所有的的页面都将替换"}",""相当于占位符,由数据进行替换
*/
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
}
</body>
</html>
/* index.hbs
* 单个页面模板,这里以首页为例。""表示引用其他模板来替换,这里引用名为"partial"的模板
*/
<div>index</div>
/* partial.hbs
* 一个分页文件,被其他模板引用,分页之间也可以互相引用。
*/
<div>123</div>
/* index.html
* 当浏览器请求index.html时,经过handlebars模板引擎处理后生成的页面
*/
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div>index</div>
<div>123</div>
</body>
</html>