layui源码详细分析系列之模板引擎
来源:互联网 发布:qq浏览器mac版官网 编辑:程序博客网 时间:2024/06/01 22:10
前言
所谓的模板引擎,其实最早接触该形式的应该是jsp,在html代码中嵌套java代码,使用形式与模板很相似,实际上jsp就是一种模板语言,对于模板语言我的了解并不多,此处就不再详细的描述了。
当我看见layui内置的模板引擎模块laytpl.js时,我首先想起的是Vue中{{}}模板的使用,但是Vue中还有双向绑定的概念(你可已使用get/set方法来实现),laytpl.js中提供的模板类型有两种,一种是单纯的变量解析的形式,形如:
<h3>{{title}}</h3>
还有一种是表达式的解析处理,形如:
{{# 表达式}}
自实现简单模板解析以及指令
自己实现的部分非常简单,实际上就是操作DOM获取指定的结构,替换{{变量}}的值而已,以后会研究Vue相关的源码,到时看看Vue中关于模板处理的处理实现,HTML结构以及实现效果图如下所示:
我实现的模板只是{{}}的形式,不支持表达式的处理,同时实现了v-if、v-text的指令(Vue中相应的指令),实现思路很简单,具体如下:
- 对于指令获取节点元素的相应属性,判断属性值对应的变量是否存在,存在就执行相应操作,最后清除掉对应的指令属性,v-if支持单目运算符!
- 对于{{}},查找nodeType为3的文本节点,匹配相应的正则表达式,执行对应变量值内容填充
在上面的实现中使用递归函数,遍历body下所有的节点,区分元素节点以及文本节点做不同的处理。
下面说说laytpl.js模块的处理方式,laytpl的使用形式如下:
laytpl(模板).render(data, function(html) { // html:模板解析后的形式});
layuitpl.js内置模块中的组织结构图如下所示:
可以看出代码组织简洁清晰,主要的方法时render、parsey以及laytpl函数,
这几个函数的具体功能在上图中有了较为详细的描述,该内置模块中是如何实现变量填充的呢?
实际上,在该内置模块内部,是将模板构建成js代码的形式,并将其构建成函数,从而完成变量的填充,例如:
var data = {'city': 'shanghai'}layTpl('欢迎来到{{city}}').render(data, fucntion(html) {})
在内部实际上构建成了:
tpl = '欢迎来到' + (d.city);tpl = '"use strict; var view = "' + tpl +'; return view;'var tpl = new Function(d, _escape_, tpl);
最后执行tpl方法填充变量,实际上还可以使用ES6中字符串模板来实现,当然方法很多种,但殊途同归。
该内置模块详细的代码注释以及自实现demo会上传到我的GitHub上,每天得要接触新的内容,这样自己才会一点点成长。
- layui源码详细分析系列之模板引擎
- layui源码详细分析系列之模块加载机制
- layui源码详细分析系列之文件上传模块
- layui源码详细分析系列之富文本编辑器模块
- layui源码详细分析之树形菜单
- layui源码详细分析系列之element模块以及自定义事件机制
- layui源码详细分析系列之流加载模块
- layui框架详细分析系列之框架主体组织结构
- layui框架详细分析系列之熟悉框架以及提供的页面元素
- doT模板引擎源码分析
- hsqldb源码分析系列4 查询引擎之查询操作
- hsqldb源码分析系列5 查询引擎之查询操作
- Layui laytpl模板引擎的学习
- //layui的模板引擎和分页组合用
- //layui的模板引擎和分页组合用
- Mahout系列之推荐引擎核心源码
- snort 源码分析之模式匹配引擎
- SpringBoot进阶之模板引擎(含源码)
- POJ
- CVE-2017-8464 转载poc
- 预处理的学习
- LeetCode-2-Add-Two-Numbers 链表
- Sort函数用法
- layui源码详细分析系列之模板引擎
- 路由器工作原理
- HBase深入学习(2)
- i春秋-2016-2017年信息安全竞赛 Web writeup 补题 By Assassin
- 用链表实现通讯录,并保存到文件
- Ubuntu下安装JDK
- hadoop系列之一hadoop文件配置
- QT实现记录上一次用户名和密码功能
- 文件系统编程—系统调用与标准IO