探究Vue源码:mustache模板引擎(3) 通过编写简单正则了解mustache转换思路

news2024/12/29 9:14:43

我们会基本使用显然不够啊
我们要去了解mustache的原理 乃至自己去写一个mustache

首先 mustache 不是不能用简单的正则表达式来实现
但是 这里为了让大家理解 为什么不能 我们还是用简单正则写一下

我们创建一个 html文件
然后 编写代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id = "list"></div>
    
    <script>
        var templateStr = `<h1>我是一只{{name}},今年{{age}}岁啦</h1>`;
        var data = {
            name: "小猫猫",
            age: 2
        }
    </script>
</body>
</html>

这里 我们定义了一个模板字符串 templateStr 写的是一个 h1的页面模板字符串
在下面定义了一个 data的对象 模板字符串里面用了data中的两个字段

那么 我们现在就需要写一个函数 将他们写入到dom树中

我们在下面编写这样一段代码

console.log(templateStr.replace(/\{\{(\w+)\}\}/g, function(a, b, c){
  console.log(a, b, c);
    return "*";
}));

在这里插入图片描述
相信replace函数 大家都不会陌生 字符串替换
这里 我们 写的 是 捕获 {{ }} 一对花括号 里面带有字母的内容
{{ 代表捕获 {{ 同理 }} 捕获 }} 一对小括号 代表捕获 里面 \w代码字母 后面一个加号 代表一个 或者 多个 都会被捕获

所以 我们捕获到了 所有的 {{ 字母组合 }} 并在函数中 a代表原本的内容 b代表 括号内 被捕获的字母内容 c参数代表这个符号在字符串的下标位置 简单说 就是第几个字符
我们运行结果如下

在这里插入图片描述
可以看到 我们两次 输出 分别 捕获到了templateStr中的 name 和 age的使用
并再最后 将他们也都替换成了 *

而我们 abc三个参数的输出 也是没有任何问题
而且 我们还有一个d参数
我们将代码改成

console.log(templateStr.replace(/\{\{(\w+)\}\}/g, function(a, b, c, d){
 console.log(a, b, c, d);
    return "*";
}));

在这里插入图片描述
我们这两次 输出的d参数 都是字符串在没有被替换时的内容

当然 你也不一定要一直用 abc这三个名字 这个行参本来名字你就可以顺便取

其实目前来讲 有用的直属 前两个参数
下面 我们就需要 将他这里 用到的字段 位置 替换成 data中字段的值
意思就是 例如 {{ name }} 我们就要想办法 替换成 data.name 的值

我们可以将代码改成这样

 console.log(templateStr.replace(/\{\{(\w+)\}\}/g, function(pattern, name){
   return data[name];
}));

在这里插入图片描述
因为 我们之前说过 第二个参数 拿到的是 捕获到的 花括号中的内容 那么 比如 {{ name }} 进来
第二个参数 捕获到的内容就是 字符串的 “name” 那么 我们就可以 通过 data[“name”] 拿到data中的这个字段 age也是一样的

运行结果如下
在这里插入图片描述
这里 我们就很顺利的 将这个内容 替换成了 data中的值

这就是一个非常简单的 模板引擎基理 但 mustache的源码不是这样写的
因为这个有点太基础了 之后什么循环啊 甚至说循环嵌套的 这个肯定是搞不定的
但是 大体思路差不多 写这个 只是让大家对这个变量解析有个概念

好啦 既然逻辑已经写好了 我们也可以写个弱功能版的 render函数啦
我们可以这样写

function render(template, data) {
    return template.replace(/\{\{(\w+)\}\}/g, function(pattern, name){
        return data[name];
    });
}

接受两个参数 第一个template 一个页面模板的字符串 data 操作数据的对象 和我们mustache.js中的 render 接的参数写的是一样的

好那我们试着用自己写的这个弱化版的render
将内容写到页面上

我们编写页面代码如下

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <div id = "list"></div>
    
    <script>
        var templateStr = `<h1>我是一只{{name}},今年{{age}}岁啦</h1>`;
        var data = {
            name: "小猫猫",
            age: 2
        }

        function render(template, data) {
            return template.replace(/\{\{(\w+)\}\}/g, function(pattern, name){
                return data[name];
            });
        }
        document.getElementById('list').innerHTML = render(templateStr, data);
    </script>
</body>
</html>

运行结果如下
在这里插入图片描述
功能是实现了 但是 这里还是要给大家泼一瓢冷水

因为 这个只是给大家建立一个具体的思路 但是 后面肯定不是这样去实现 因为 这个只能实现变量转换 字符串转译 但是 像什么 循环语句 等等比较复杂的东西 这个肯定就废了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/668476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

API性能监控 【ApiHelp】-- 组件Monitor 核心功能实现

上篇文章介绍了组件Monitor主要设计和功能Monitor组件设计&#xff0c;现在来具体看看Monitor组件的实现。 1、Java Agent实现AgentMain 前面已经介绍了Java Agent相关知识&#xff0c;现在来具体实现下。 实现AgentMain类&#xff1a; AgentMain为agent的入口类&#xff0c;程…

【C语言】项目实战——快速0基础上手五子棋游戏(内附源码)

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 如果你是从现在关注的老粉的话&#xff0c;你可能会有点疑惑“how old are you&#xff1f;”(怎么老是你&#xff1f;) 唉&#xff0c;没办法我也不想的&#xff0c;但是月末了参加新星计划和2023年博客之星的评选只能更…

职业生涯规划书600字范文

职业生涯规划书600字范文篇1 记得高中时老师就告诉我们要认识自己&#xff0c;“认识自己”&#xff0c;仅仅四个字&#xff0c;实践起来是何等的艰难&#xff0c;古往今来那么多仁人志士为了能认识自己&#xff0c;不断实践&#xff0c;不断创新&#xff0c;可又有几个能在生命…

软件安全技术复习内容

软件安全技术 边复习边写的&#xff0c;有错误及时指正第一章 软件安全概述零日漏洞安全威胁分类CIA安全基本属性PDRR模型软件安全的主要方法和技术基本方法主要技术 第二章 软件漏洞概述概念软件漏洞成因分析软件漏洞分类基于漏洞成因的分类基于漏洞利用位置的分类基于威胁类型…

FPGA基础知识-编程语言接口

目录 学习目标&#xff1a; 学习内容&#xff1a; 1.PLI的使用 2.PLI任务的连接和调用 3.内部数据的获取 4.PLI库子程序 学习时间&#xff1a; 学习产出&#xff1a; 学习目标&#xff1a; 解释在Verilog仿真中如何使用PLI子程序。 描述PLI的用途。 定义用户自定义系…

DSIN(Deep Session Interest Network)详解

1. 提出动机 这个模型依然是研究如何更好地从用户的历史行为中捕捉到用户的动态兴趣演化规律。DIEN存在一个问题&#xff0c;就是只关注了如何去改进网络&#xff0c;而忽略了用户历史行为序列本身的特点&#xff0c;我们仔细去想&#xff0c;用户过去可能有很多历史点击行为&…

kafka硬件选择以及如何在生产中优化各个组件的参数

硬件选择&#xff1a; 1.求出一天kafka会产出大概多少的消息&#xff0c;然后平均到每一秒&#xff0c;要多少的消息&#xff0c;然后一条消息大概就是0.5-2k的大小&#xff0c;求出&#xff0c;每秒占用多少内存 2.求购买服务器数量(上边求出的效率 * 副本数/100)1 如果除不…

2022 开源社年度报告:打开新世界

2022 年被认为是充满挑战的一年&#xff0c;对于开源社而言也不例外。开源社同样面临着外部环境的不断变化&#xff0c;然而&#xff0c;正是开源的力量和开放协作的模式&#xff0c;让我们能够在这个极端情况下做出卓越的回应。 大家对于开源社的组织架构充满好奇&#xff0c;…

下载插件-4K Video Downloader

这款插件小编自己还是蛮喜欢的&#xff0c;有兴趣的小伙伴可以体验学习下。 一、简单介绍 提供视频下载服务&#xff0c;让您以高质量的方式获取所需内容。无论是视频、播放列表、频道还是字幕&#xff0c;您都可以轻松下载并保存为多种格式&#xff0c;如MP4、MKV、M4A、MP3、…

C++基础(8)——类和对象(多态)

前言 本文主要介绍了C中多态的基本知识 4.7.1&#xff1a;多态的基本概念和原理剖析 1&#xff1a;基本概念 静态多态&#xff1a;函数重载、运算符重载 动态多态&#xff1a;派生类和虚函数实现运行时多态 静态多态在编译阶段确定函数地址&#xff1b;动态多态在运行阶段…

RN 学习小记之使用 Expo 创建项目

本文Hexo博客链接&#x1f517; https://ysx.cosine.ren/react-native-note-1 xLog链接&#x1f517; https://x.cosine.ren/react-native-note-1 RSS订阅 &#x1f4e2; https://x.cosine.ren/feed/xml 由于业务需要&#xff0c;开始学习RN以备后面的需求&#xff0c;而虽然之…

《后端存储实战课》课程学习笔记(二)

创建和更新订单时&#xff0c;如何保证数据准确无误&#xff1f; 订单系统是整个电商系统中最重要的一个子系统&#xff0c;订单数据也就是电商企业最重要的数据资产。一个合格的订单系统&#xff0c;最基本的要求是什么&#xff1f;数据不能错。 首先&#xff0c;你的代码必须…

2023年度编程排行重磅发布,JS连续11年霸占榜一

编程语言千千万&#xff0c;你最喜欢用哪一个&#xff1f; 最近&#xff0c;在调研了全球超过9万名开发者之后&#xff0c;程序员社区 Stack overflow 重磅发布了《2023 Developer Survey》&#xff0c;从这份报告中&#xff0c;我们可以了解到当前最热门的工具、最主流的技术…

每日学术速递6.5

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Humans in 4D: Reconstructing and Tracking Humans with Transformers 标题&#xff1a;4D 中的人类&#xff1a;用变形金刚重建和跟踪人类 作者&#xff1a;Shubham Goel, Geor…

深入理解Linux虚拟内存管理(九)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理&#xff08;一&#xff09; 深入理解Linux虚拟内存管理&#xff08;二&#xff09; 深入理解Linux虚拟内存管理&#xff08;三&#xff09; 深入理…

STL容器——map的用法

0、概述 map翻译为映射&#xff0c;map可以将任何基本类型&#xff08;包括STL容器&#xff09;映射到任何基本类型&#xff08;包括STL容器&#xff09;。下面是map、multimap和unordered_map之间的差别。 注意这三种映射的底层实现&#xff0c;他决定了算法的时间复杂度。特…

Java+Demo对接中国移动 云MAS短信发送(http协议详解,新测成功!)

一.登录官网&#xff0c;下载http接入文档&#xff08;随着官网不断更新&#xff0c;可参考官网的文档&#xff09; 官网地址为&#xff1a;云mas业务平台 进入云MAS管理平台&#xff0c;找到 管理-接口管理 的列表页。 (必读&#xff1a;本文对接方式是 java引用jar包&#…

【MYSQL篇】一文弄懂mysql中redo log、binlog

前言 今天想跟大家聊聊关于 mysql 中的两个小的知识点&#xff1a;redo log 和 binlog 。 redo log &#xff1a;InnoDB 存储引擎层方面的日志&#xff0c;所以如果你使用的存储引擎不是 InnoDB 的话&#xff0c;那就根本谈不上 redo log。 binlog &#xff1a; MySQL Serve…

SpringBoot整合模板引擎Thymeleaf(2)

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 概述 Thymeleaf十分类似于JSP中使用的EL表达式。整体而言&#xff0c;Thymeleaf简洁、优雅、高效&#xff1b;非常适合小型项目的快速开发。 Thymeleaf常用标签简述 在此…

多商户商城开发功能清单

电商时代下&#xff0c;传统企业商家急需拓展业务规模&#xff0c;向线上拓展&#xff0c;而多商户小程序造价低&#xff0c;效应高&#xff0c;自然就成为了很多企业商家拓展线上营销渠道的首要选择,那么多商户小程序商城涵盖哪些功能呢?下面小编就来详细为大家解答&#xff…