從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.pswp.cn/web/40395.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40395.shtml
英文地址,請注明出處:http://en.pswp.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檢索有嚴格…