当前位置: 首页 > news >正文

浅谈web中前端模板引擎的使用

模板引擎

模板引擎-百度词条

什么是模板引擎?(百度词条)

模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎会生成一个标准的HTML文档。

原理(百度词条)

模板引擎的实现方式有很多,最简单的是“置换型”模板引擎,这类模板引擎将指定模板内容(字符窜)中的特定标记(子字符窜)替换一下变生成了最终需要的业务数据(比如网页)。

置换型模板引擎的优点:实现简单, 缺点: 效率低,无法满足高负载的应用请求。

用途(百度词条)

模板引擎可以让(网站)程序实现界面与数据分离,业务代码与逻辑代码的分离,提升开发效率,良好的设计也提高了代码的复用性。

我们司空见惯的模板安装卸载等概念,基本上都和模板引擎有着千丝万缕的联系。模板引擎不只是可以让你实现代码分离(业务逻辑代码和用户界面代码),也可以实现数据分离(动态数据与静态数据),还可以实现代码单元共享(代码重用),设置是多语言、动态页面与静态页面自动均衡(SDE)等等与用户界面可能没有关系的功能。

前端模板

AJAX的出现使得前后端分离成为可能。

后端专注于业务逻辑,为前端提供接口。

前端通过AJAX的方式向后端的接口请求数据,然后动态渲染页面。

//假设接口数据如下
//[{friends: "Sharon"}, {friends: "Sandy"}, {friends: "Roc"}]

//假设渲染后的页面

<div>
    <ul class="friends-list">
        <li>Sharon</li>
        <li>Sandy</li>
        <li>Roc</li>
    </ul>
</div>

模板引擎出现之前,当然是在js中遍历拼接字符窜。

<div></div>

<script>
//假设接口的数据为
var data = [{friends: "Sharon"}, {friends: "Sandy"}, {friends: "Roc"}];

var htmlStr = '';

htmlStr += '<ul class="friends-list">';

for(var i= 0; i < data.legnth; i ++ ) {
    htmlStr += '<li>' + data[i].friends + '</li>';
}

htmlStr += '</ul>';

document.querySelector('div').innerHTML = str;
</script>

确实很简单方便,但是也有很多缺点:

html代码(View层) 和 JS代码 (Controller层),UI与逻辑代码混杂在一起,非常不便于阅读。 一旦业务复杂起来,不容易维护。

从安全角度来讲,也会有代码注入攻击风险(code injection)。

从代码者的角度来讲,如果需要拼接的HTML代码里有很多引号的话(比如标签里面有很多属性),那么就非常容易出错。


既然这样,总要想办法解决问题!

这就引出模板引擎, Underscore的_.template可能是最简单的前端模板引擎了(或者可以说,这就是个前端模板函数)。

引用_.template,将以上的代码改写。

<div></div>

<script src="http://cdn.bootcss.com/underscore.js/1.8.3/underscore.js"></script>


<script type="text/template" id="tpl">
    <ul class="list">
        <%_.each(data, function(item){%>
            <li><%= item.friends %></li>
        <%});%>
    </ul>
</script>


<script>
// 模拟数据
var data = [{friends: "Sharon"}, {friends: "Sandy"}, {friends: "Roc"}];
var compiled = _.template(document.getElementById("tpl").innerHTML);
var htmlStr = compiled(data);
document.querySelector('div').innerHTML = htmlStr;
</script>

这样的话,前端需要改HTML代码,只需要改模板即可。

用户界面与逻辑代码不在混杂,可维护性和扩展性大大的提高了。

如何实现一个模板引擎呢? 实现的思路是什么呢?

感兴趣的话,可以看看我翻译的两篇文章。

翻译_20行代码创造JavaScript模板引擎(一)

翻译_只需20行代码创造JavaScript模板引擎(二)

相关文章:

  • pytorch实战(2)-----回归例子
  • 柔宇科技发售可折叠柔性屏手机 平板与手机从此二合一
  • 浅析宽带接入技术
  • 一个网工的Linux学习过程
  • 数据结构(算法)-图(最短距离Dijkstra)
  • Jessica Kerr:高绩效团队简史
  • Windows操作系统查看电脑开关机记录
  • 实现图元及属性的算法---椭圆生成算法
  • 大快搜索数据爬虫技术实例安装教学篇
  • 解决项目不编译4大clean
  • 迭代器 /生成器 yield
  • mysql表与表之间的关系
  • 对标汽车之家,新势力杉车网的另类崛起
  • RabbitMq集群搭建
  • vue-cli2使用cdn方式引入cytoscape
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【Linux系统编程】快速查找errno错误码信息
  • eclipse(luna)创建web工程
  • ESLint简单操作
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java 网络编程(2):UDP 的使用
  • jquery ajax学习笔记
  • Laravel Telescope:优雅的应用调试工具
  • python docx文档转html页面
  • React Native移动开发实战-3-实现页面间的数据传递
  • Selenium实战教程系列(二)---元素定位
  • spring cloud gateway 源码解析(4)跨域问题处理
  • yii2中session跨域名的问题
  • 阿里研究院入选中国企业智库系统影响力榜
  • 工作中总结前端开发流程--vue项目
  • 猴子数据域名防封接口降低小说被封的风险
  • 排序(1):冒泡排序
  • 前端
  • 前端之React实战:创建跨平台的项目架构
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 写代码的正确姿势
  • 走向全栈之MongoDB的使用
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #每日一题合集#牛客JZ23-JZ33
  • (06)金属布线——为半导体注入生命的连接
  • (6)设计一个TimeMap
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (转)h264中avc和flv数据的解析
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)Sublime Text3配置Lua运行环境
  • (状压dp)uva 10817 Headmaster's Headache
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .net MVC中使用angularJs刷新页面数据列表
  • .NET Standard、.NET Framework 、.NET Core三者的关系与区别?
  • .net 程序 换成 java,NET程序员如何转行为J2EE之java基础上(9)
  • .net 生成二级域名
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调