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

超轻量模板引擎

还在痛苦的手工拼接HTML?

使用模板引擎渲染出目标HTMl,避免手工拼接的错误,同时增加模板代码的可读性。

话不多说,先看代码,此demo实现了一个轻量的模板引擎。

DEMO

模板引擎的核心

正则表达式的单元匹配,以及replace函数。

模板采用双大括号的形式来标识此处是模板插槽,匹配到的可以是一个变量,同时也可以是对象访问属性。

replace函数第二个参数,支持传入function配合正则的匹配。

  /{{((\w+\.?)+)}}/g
复制代码

正则表达式当中一个括号代表一个匹配组

\w 匹配字母、数字、下划线。等价于[A-Za-z0-9_]

+ 匹配前面的子表达式一次或多次

? 匹配前面的子表达式零次或一次

render 函数的实现

支持对象的属性访问

function render(tpl, data) {
  var reg = /{{((\w+\.?)+)}}/g
  return tpl.replace(reg, function(matchItem, keyName) {
    let keys = keyName.split('.');
    if (keys.length === 1) return data[keys[0]];
    let res = data;
    for (let item of keys) {
      res = res[item];
    }
    return res;
  })
}
复制代码

完整DEMO

<div id="output"></div>
<script id="waitRender" type="text/plain">
    <h1>{{title}}</h1>
    <p>{{content.boy.name}}</p>
</script>

<script>
function render(tpl, data) {
  var reg = /{{((\w+\.?)+)}}/g
  return tpl.replace(reg, function(matchItem, keyName) {
    let keys = keyName.split('.');
    if (keys.length === 1) return data[keys[0]];
    let res = data;
    for (let item of keys) {
      res = res[item];
    }
    return res;
  })
}

var template = document.getElementById('waitRender').innerHTML;
var data = {
  title: 'Hello TPL !!!',
  content: {
    boy: {
      name: 'author calvin'
    }
  }
};
document.getElementById('output').innerHTML = render(template, data);
</script>
复制代码

转载于:https://juejin.im/post/5aba69636fb9a028b92d2c4a

相关文章:

  • 异构计算助力客户春节webp图片编码
  • Python练习实例100例(持续更新中)
  • 技术往事:微信估值已超5千亿,雷军曾有机会收编张小龙及其Foxmail
  • 论flex布局和box布局的华为meta8手机自带浏览器的兼容
  • ajaxfileupload-上传文件示例
  • 4027. [HEOI2015]兔子与樱花【树形DP】
  • 1491. [NOI2007]社交网络【最短路计数】
  • Java基础-比较运算符Compare Operators
  • LDAP DIT设计参考
  • 爬取校园新闻首页的新闻
  • 学习索引结构的一些案例——Jeff Dean在SystemML会议上发布的论文
  • node爬虫-使用puppeteer
  • 使用linux下的crontab定时任务跑定时脚本
  • mycat的wrapper.log日志中发现主从切换报错
  • react组件的生命周期
  • Angular Elements 及其运作原理
  • CSS 专业技巧
  • ES6--对象的扩展
  • Java-详解HashMap
  • Linux CTF 逆向入门
  • Making An Indicator With Pure CSS
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • SQLServer之创建显式事务
  • vue-loader 源码解析系列之 selector
  • 对象管理器(defineProperty)学习笔记
  • 简单基于spring的redis配置(单机和集群模式)
  • 类orAPI - 收藏集 - 掘金
  • 巧用 TypeScript (一)
  • 数据可视化之 Sankey 桑基图的实现
  • 物联网链路协议
  • 原生 js 实现移动端 Touch 滑动反弹
  • #13 yum、编译安装与sed命令的使用
  • #在 README.md 中生成项目目录结构
  • (1)Nginx简介和安装教程
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (14)Hive调优——合并小文件
  • (4)logging(日志模块)
  • (C++)八皇后问题
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (十一)手动添加用户和文件的特殊权限
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • **PHP二维数组遍历时同时赋值
  • .NET Core 中的路径问题
  • .NET 编写一个可以异步等待循环中任何一个部分的 Awaiter
  • .net 托管代码与非托管代码
  • .NET 药厂业务系统 CPU爆高分析
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • @Autowired自动装配
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • @WebService和@WebMethod注解的用法
  • [2019.3.5]BZOJ1934 [Shoi2007]Vote 善意的投票