从0到1手写vue源码

模版引擎

数组join法(字符串)

es6反引号法(模版字符串换行)

mustache (小胡子)

引入mustache

模版引擎的使用

mustache.render(templatestr,data)

mustache.render
循环简单数组  

循环复杂数组
循环单项数组

数组的嵌套

mustache底层核心机制

使用正则实现简单的替换机制(注意点replace替换的时候第二个参数可以为一个函数函数的形参,第一个参数代表查询的第一个正则机制,第二个为找到data中的第二个参数)

但是mustache不能简单使用正则来表示,他中间的话牵扯到的数据类型比较复杂

mustache的原理
什么是tokens

循环状态下的tokens

手写mustache库 

安装依赖运行node解析js文件
npm init
npm i -D webpack@4 webpack-dev-server@3 --legacy-peer-deps   
新建webpack.congfig.js文件
const path = require('path') // 引用path模块module.exports = {  // 这里是commrnt.js语法// 使用开发模式打包mode:"development",// 入口文件entry:"./src/index.js",// 打包后的出口文件output:{filename:'build.js',},devServer:{contentBase:path.join(__dirname,"www"),compress:false,port:8000,publicPath:'xuni'}
}

建立这样的文件格式

      

index.html文件代码如下
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title></title>
</head>
<body><script src="/xuni/build.js"></script><script>let temple= `我买了一个{{thing}},好{{good}}`let data={}console.log(window. window.vueMustache);window.vueMustache.render(temple,data)</script>
</body>
</html>
我们需要手写算法了!!!!

这个文件是扫描器函数

这个文件是我们需要获取到当前的文件格式

扫描器函数的目的就是为了获取模版,并把它进行拆分

具体的拆分如下

我们把这个模版分为scanUntil和scan2个过程,scanUntil是模拟的是"{{"之前的把它拆分出去,scan这个函数是相当于跳过”{{“,利用scasnUntil这个函数对他进行运用

判断代码逻辑如下

// 扫描器函数
export default class Scanaer{constructor(temple){console.log("我是",temple);//将子列写在自己身上this.temple=temple//设计一个指针this.pio=0;//尾巴,最开始尾巴是全文this.tail=temple}//相当于是跳过“{{”这个字符没有返回值scan(tag){if(this.tail.indexOf(tag)==0){this.pio+=tag.length;//尾巴也要进行变化为从当前指针开始到最后的所有字符this.tail=this.temple.substring(this.pio)}}// 让指针扫描,遇见指定内容返回,并返回结束前的返回值scanUtil(stopTop){//记录当前位置指针的当前位置let pio_backup=this.pio// 当尾巴不等于0的时候,或者当我的指针小于当前字符串的长度的时候,如果不小于当前的长度的话就会一直往后走,导致死循环while(this.eos()&&this.tail.indexOf(stopTop)!==0){this.pio++//让尾巴也跟着变化,获取到指针位置变化后的尾巴this.tail=this.temple.substring(this.pio)}//返回指针开始的值到现在的值的所有文字return this.temple.substring(pio_backup,this.pio)}//判断我的指针小于当前字符串的长度的时候,如果不小于当前的长度的话就会一直往后走,导致死循环  end 0f stringeos(){return this.pio<this.temple.length}
}

在index。js文件中的代码

import Scanaer from "./Scanner";
window.vueMustache={render(temple,data){//实例化一个扫描器,构造时提供参数,这个参数就是模版字符串//这个参数就是给模版字符串工作的let Scanaerl=new Scanaer(temple)//  let a=  Scanaerl.scanUtil("{{")//  console.log(a,);//  console.log(Scanaerl.pio,"测试扫描器函数是否能到指定内容返回");// Scanaerl.scan("{{")// console.log(Scanaerl.pio,"测试扫描器函数是否可以跳过指定内容");while(Scanaerl.pio!=temple.length){let a= Scanaerl.scanUtil("{{")console.log(a,"获取到的");Scanaerl.scan("{{")let b= Scanaerl.scanUtil("}}")console.log(b,"获取到的");Scanaerl.scan("}}")}}
}
生成tokens数组

创建这样的目录文件

import Scanaer from "./Scanner";
export default function createTokens(temple) {let tokens = [];let scanaer = new Scanaer(temple);let word;//让扫描器工作while (scanaer.eos()) {console.log("111");word = scanaer.scanUtil("{{")//运行到word到最后的时候会出现字符串的情况if (word !== '') {tokens.push(["text", word])}scanaer.scan("{{")word = scanaer.scanUtil("}}")//判断是否是#或者/的判断if (word !== "") {if (word[0] == "#") {tokens.push(["#", word.substring[1]])} else if (word[0] == "/") {tokens.push(["/", word.substring[1]])} else {tokens.push(["text", word])}}scanaer.scan("}}")}return tokens
}

index,js文件

import Scanaer from "./Scanner";
import createTokens from "./createTokens.js"
window.vueMustache={render(temple,data){let tokens=createTokens(temple)console.log(tokens);}}

但是以上的方法不能满足于二维数组的使用

token二维数组源码书写

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

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

相关文章

江苏徐州SAP代理商有哪些?怎么选择?

在数字化浪潮席卷全球的今天&#xff0c;企业对于高效、智能的管理系统需求日益迫切。SAP作为全球领先的企业管理软件解决方案提供商&#xff0c;其产品在市场上享有极高的声誉。而在江苏徐州&#xff0c;哲讯智能科技作为SAP的代理商&#xff0c;以其专业的技术实力和优质的服…

开源205W桌面充电器,140W+65W升降压PD3.1快充模块(2C+1A口),IP6557+IP6538

开源一个基于IP6557和IP6538芯片的205W升降压快充模块&#xff08;140W65W&#xff09;&#xff0c;其中一路C口支持PD3.1协议&#xff0c;最高输出28V5A&#xff0c;另一路是A口C口&#xff0c;最高输出65W&#xff08;20V3.25A&#xff09;&#xff0c;可搭配一个24V10A的开关…

代码随想录算法训练营第3天|LeetCode

203.移除链表元素 题目链接&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 文档链接&#xff1a;代码随想录 (programmercarl.com) 视频链接&#xff1a;手把手带你学会操作链表 | LeetCode&#xff1a;203.移除链表元素_哔哩哔哩_bilibili 第一想法 …

SpringBoot-第一天学习

SpringBoot介绍-约定大于配置 SpringBoot是在Spring4.0基础上开发的&#xff0c;不是替代Spring的解决方案&#xff0c;而是和Spring框架结合并进一步简化Spring搭建和开发过程的。 如何简化&#xff1f;就是通过提供默认配置等方式让我们更容易&#xff0c;集成了大量常用的…

交叉测试的优点和缺点!

交叉测试在软件测试中具有重要的地位和作用。通过交叉测试&#xff0c;可以提高软件质量、提升用户体验、增加测试覆盖率、提高测试效率以及满足市场需求和竞争优势。因此&#xff0c;在软件开发和测试过程中&#xff0c;应充分重视交叉测试的实施和应用。 以下是对其优缺点的…

推荐3款Windows系统的神级软件,免费、轻量、绝对好用!

DiskView DiskView是一款用于管理和查看磁盘空间的工具&#xff0c;它集成了于微软的Windows操作系统资源管理器中&#xff0c;以显示直观的磁盘空间使用情况。该软件通过生成图形化地图&#xff0c;帮助用户组织和管理大量文件和文件夹&#xff0c;从而高效地管理磁盘空间。用…

JDBC 学习笔记+代码整理

Tip Idea自带可视界面&#x1f449;MySQL 图形化界面-CSDN博客 Idea2022无add Framework support选项&#x1f449;最新版IDEA:Add web Framework Support步骤/构建JavaWeb项目步骤_idea add framework support-CSDN博客 基本步骤 1.加载驱动包Driver 2.建立与数据库的连接C…

证券交易系统中服务器监控系统功能设计

1.背景介绍 此服务器监控系统的目的在于提高行情服务器的监管效率&#xff0c;因目前的的行情服务器&#xff0c;包括DM、DT、DS配置数量较多&#xff0c;巡回维护耗时较多&#xff0c;当行情服务器出现异常故障&#xff0c;或者因为网络问题造成数据断线等情况时&#xff0c;监…

芯科普| 矽光子是什麼?可以用在哪些领域?点击查看!

随着生成式人工智能的崛起&#xff0c;数据传输需求亦呈现爆发式增长。而在此背景下&#xff0c;台积电在半导体展览上披露的硅光子&#xff08;SiPh&#xff1a;Silicon Photonics&#xff09;技术进展&#xff0c;更是将硅光子推向了风口浪尖&#xff0c;成为了市场的宠儿。 …

IDEA导入依赖+Maven配置

Maven安装及配置 安装 安装链接&#xff1a;https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/ 注&#xff1a;建议不要直接安装最新版本&#xff0c;选用常用、稳定的版本安装即可&#xff0c;比如&#xff1a;3.6.3 配置 1> 配置bash_profile文件 终端输…

《知识点扫盲 · 监听器 Listener》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…

高效前端开发:解密pnpm的存储与链接

什么是pnpm PNPM&#xff08;Performant NPM&#xff09;是一种快速且节省磁盘空间的包管理工具。相较于其他包管理器如NPM和Yarn&#xff0c;PNPM通过独特的存储机制和链接技术解决了许多常见的问题。以下是PNPM如何避免这些问题以及其关键技术的详细介绍。 特性 PNPM Store…

批量注册工具是什么

摘要&#xff1a;批量注册工具作为自动化领域的一个分支&#xff0c;为用户在多平台账号管理中提供了极大的便利。 关键词 批量注册&#xff0c;自动化&#xff0c;实战代码&#xff0c;设计原则&#xff0c;法律法规 1. 引言 批量注册工具能够在短时间内创建大量账号&…

【MySQL备份】Percona XtraBackup总结篇

目录 1.前言 2.问题总结 2.1.为什么在恢复备份前需要准备备份 2.1.1. 保证数据一致性 2.1.2. 完成崩溃恢复过程 2.1.3. 解决非锁定备份的特殊需求 2.1.4. 支持增量和差异备份 2.1.5. 优化恢复性能 2.2.Percona XtraBackup的工作原理 3.注意事项 1.前言 在历经了详尽…

数据库、创建表、修改表

一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo 二、创建表 1、创建一个名称为db_system的数据库 2、在该数据库下创建两张表&#xff0c;具体要求如下 员工表 user…

图像的对数变换

对数变换在图像处理中通常有以下作用&#xff1a; 因为对数曲线在像素值较低的区域斜率较大&#xff0c;像素值较高的区域斜率比较低&#xff0c;所以图像经过对数变换之后&#xff0c;在较暗的区域对比度将得到提升&#xff0c;因而能增强图像暗部的细节。图像的傅里叶频谱其…

MySQL 结构的优化方案

主要是指三方面&#xff0c;即表结构、字段结构以及索引结构&#xff0c;这些结构如果不合理&#xff0c;在某些场景下也会影响数据库的性能&#xff0c;因此优化时也可以从结构层面出发。一般在项目的库表设计之初就要考虑&#xff0c;当性能瓶颈出现时再调整结构&#xff0c;…

Python函数语法详解(与C++对比学习)【未完】

一、Python函数的形式 def function_name (参数, ...) -> return value_type:# 函数体return value# 看具体需求# 如果没有return语句&#xff0c;函数执行完毕后也会返回结果# 只是结果为None。return None可以简写为return 1. Python的返回值 在Python3中&#xff0c;提…

利用Redis bitmap 实现签到案例

数据库实现 设计签到功能对应的数据库表 CREATE TABLE sign_record (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键,user_id bigint NOT NULL COMMENT 用户id,year year NOT NULL COMMENT 签到年份,month tinyint NOT NULL COMMENT 签到月份,date date NOT NULL COMMENT 签…

EI检索被认为是工程技术领域的权威数据库

EI检索被认为是工程技术领域的权威数据库&#xff0c;能够被EI检索收录的期刊和会议论文通常被认为具有一定的学术质量和影响力。然而&#xff0c;EI检索与“高水平”不能完全画等号&#xff0c;以下是一些需要考虑的因素&#xff1a; 1. 收录标准&#xff1a;虽然EI检索有严格…