前端开发系列128-进阶篇之template compile
最近有个朋友问
<%=...%>
和{{ Mustache }}
插值语法的一些问题,突然想起以前使用<%=...%>
语法进行模板编译的日子,似乎已经很久远了,刚好有点时间所以写篇文章重新温故下模板编译的处理逻辑。
关键 正则表达式
、eval函数
和字符串拼接
<ul>
<% for(var i = 0; i< data.list.length;i++) {%>
<li><%= data.list[i] %></li>
<% } %>
</ul>
给定上面的模板字符串,我们希望能够提供一个模板编译函数,传递数据(data:["a","b","c"])
给该函数以编译出下面的文本标签。
<ul>
<li>a</li>
<li>b</li>
<li>c</li>
</ul>
思路 对于上面的字符串模板,如果要编译得到目标字符串,那么关键点在于for循环的处理,这里最简单的办法就是直接通过eval函数
来执行 for循环
部分的代码,而<% 和 %>
等部分则需要通过正则来进行替换。假设,我们在这里提供一个 echo函数
用于做字符串的拼接,那么可以考虑先把模板字符串处理为下面的样式,再行处理。
echo('<ul>');
for(var i = 0; i< data.list.length;i++) {
echo('<li>');
echo(data.list[i]);
echo('</li>');
}
echo('</ul>');
具体实现
/* 1.模板字符串 */
let template = `
<ul>
<% for(var i = 0; i< data.list.length;i++) {%>
<li><%= data.list[i] %></li>
<% } %>
</ul>
`
/* 2.封装编译函数 */
function compile(template) {
/* 2.1 编写正则规则 */
/* 匹配<% %>部分 */
let expr = /<%([\s\S]+?)%>/g;
/* 匹配 <%= data.list[i] %> 部分*/
let evalExpr = /<%=(.+?)%>/g;
/* 2.2 字符串拼接和正则匹配:$1表示匹配到的原文内容 */
template = template
.replace(evalExpr, '`); \n echo($1); \n echo(`')
.replace(expr, '`); \n $1 \n echo(`');
/* 2.3 拼接最外层的 echo 函数 */
template = 'echo(`' + template + '`)';
/* 2.4 组装解析函数 */
let script = `(function parse(data){
let output = "";
function echo(html){
output += html.trimEnd();
}
${template}
return output;
})`;
console.log('script', script);
return script;
}
/* 3.生成解析函数 */
let parse = eval(compile(template));
/* 4.注入数据 */
let html = parse({ list: ["a", "b", "c"] });
console.log(html);
/* 输出内容: */
/*
script (function parse(data){
let output = "";
function echo(html){
output += html.trimEnd();
}
echo(`
<ul>
`);
for(var i = 0; i< data.list.length;i++) {
echo(`
<li>`);
echo( data.list[i] );
echo(`</li>
`);
}
echo(`
</ul>
`)
return output;
})
**********************************
<ul>
<li>a</li>
<li>b</li>
<li>c</li>
</ul>
*/
前端开发系列128-进阶篇之template compile的更多相关文章
- openlayers5-webpack 入门开发系列一初探篇(附源码下载)
前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...
- leaflet-webpack 入门开发系列一初探篇(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- 【Windows10 IoT开发系列】配置篇
原文:[Windows10 IoT开发系列]配置篇 Windows10 For IoT是Windows 10家族的一个新星,其针对不同平台拥有不同的版本.而其最重要的一个版本是运行在Raspberry ...
- ESP8266开发之旅 进阶篇② 闲聊Arduino IDE For ESP8266烧录配置
授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...
- 【webpack 系列】进阶篇
本文将继续引入更多的 webpack 配置,建议先阅读[webpack 系列]基础篇的内容.如果发现文中有任何错误,请在评论区指正.本文所有代码都可在 github 找到. 打包多页应用 之前我们配置 ...
- 旨在脱离后端环境的前端开发套件 - IDT Server篇
IDT,一个基于Nodejs的,旨在脱离后端环境的前端开发套件,目的就是能让前端开发完全脱离后端的环境,无论后端是什么模板引擎(主流),都能应付自如. IDT主要包括两大部分:Server + Bui ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- 前端开发【第2篇:CSS】
鸡血 样式的属性多达几千个,但别担心,按照80-20原则,常用的也就几十个,你完全可以掌握它. Css初识 HTML的诞生 早期只有HTML的时候为了让HTML更美观一点,当时页面的开发者会把颜色写到 ...
- [置顶]【实用 .NET Core开发系列】- 导航篇
前言 此系列从出发点来看,是 上个系列的续篇, 上个系列因为后面工作的原因,后面几篇没有写完,后来.NET Core出来之后,注意力就转移到了.NET Core上,所以再也就没有继续下去,此是原因之一 ...
- openlayers4 入门开发系列之风场图篇
前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...
随机推荐
- PriorityQueue作用和源码
一.PriorityQueue作用和源码 PriorityQueue跟前几个阻塞队列不一样,并没有实现BlockingQueue接口,只是实现了Queue接口,Queue接口中定义了几组放数据和取数据 ...
- Tryhackme部分翻译学习
Tryhackme部分翻译学习 1.Weaponization WSH 上传txt到桌面 Set shell = WScript.CreateObject("Wscript.Shell&qu ...
- 从零开始:基于CUDA 12.6的YOLOv5模型训练实战(RTX 2050显卡全流程)
基于cuda12.6训练yolov5模型 前面完成了使用CPU调用yolov5s模型进行识别车辆,现在想训练自己的模型进行目标识别,使用CPU效率太低,尝试使用GPU加速的Pytorch,再重新整理了 ...
- Windows系统常用端口详解
7,9,13,17,19 这是几个简单的TCP/IP服务,在windows中被Simple TCP/IP Services管理. 7 : Echo 服务:将接收到的数据原样返回. 9 : Discar ...
- svg标签元素定位最有效的办法
随着前端技术发展,svg(可伸缩矢量图形 )在前端应用中广泛被使用,然而采用传统的xpath元素定位方法已经无法对其进行定位,我们需要将svg标签及其包含的子标签用以下方式表达: *[name()=& ...
- MongoDB从入门到实战之Windows快速安装MongoDB
前言 本章节的主要内容是在 Windows 系统下快速安装 MongoDB 并使用 Navicat 工具快速连接. MongoDB从入门到实战之MongoDB简介 MongoDB从入门到实战之Mong ...
- GPT-4 即将在 ChatGPT 中退役:技术进化的又一里程碑
你是否曾好奇人工智能背后的推动力是什么?OpenAI 最近宣布了一项重大更新--从2024年4月30日起,ChatGPT将全面采用全新的AI模型GPT-4o替代现行的GPT-4.这标志着一次重大的技术 ...
- Python模块的搜索路径
在Python中,模块搜索路径是指解释器用来查找导入模块的位置列表.了解和掌握Python模块搜索路径对于正确导入模块和管理模块的位置至关重要. Python模块搜索路径的主要来源包括当前目录.Pyt ...
- useEffect的那些坑,你知道多少
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 14px; o ...
- JS中的Uncaught TypeError: Cannot set property 'innerHTML' of null
问题: 这是JS中常见的一种错误,其错误在于在页面载入之前,JS中有代码提前调用了页面的元素,如以下就是今天碰到的问题,查找了半天才发现了这个简单的错误,做个记录: 可见页面上并没有任何内容,提示是U ...