Vue深入學(xué)習(xí)1—mustache模板引擎原理

mustache 是 “胡子”的意思娩贷,因為它的嵌入標(biāo)記 {{ }} 旋轉(zhuǎn)過來很像胡子汗销,Vue中的 {{ }} 語法也引用了mustache栽惶,這也是我深入學(xué)習(xí)的目的岔留。

1机错、原始js方式使 數(shù)據(jù) 變?yōu)?strong>視圖

 <ul id="list"></ul>
 <script>
        var arr = [
            {"name":"張三", "age":12, "sex":"男"},
            {"name":"李四", "age":13, "sex":"女"},
            {"name":"王五", "age":14, "sex":"女"},
            {"name":"趙六", "age":15, "sex":"男"},
        ]
        var list = document.getElementById('list');
        // 純Dom法——比較笨拙蹬叭,沒有實戰(zhàn)的意義
        // jion法——遍歷arr數(shù)組乡摹,每遍歷一項预明,就將HTML 字符串添加到list 中
        for(let i = 0; i<arr.length; i++){
            list.innerHTML += [
                '<li>',
                '    <div class="hd">'+ arr[i].name +'</div>',
                '    <div class="bd">',
                '        <p>姓名:'+ arr[i].name +'</p>',
                '        <p>年齡:'+ arr[i].age +'</p>',
                '        <p>性別:'+ arr[i].sex +'</p>',
                '    </div>',
                '</li>'
            ].join('')
        }
        // 反引號法——遍歷arr數(shù)組缩赛,每遍歷一項,就將HTML 字符串添加到list 中
        for(let i = 0; i<arr.length; i++){
            list.innerHTML += `
                <li>
                    <div class="hd"> ${arr[i].name} </div>
                    <div class="bd">
                        <p>姓名:${arr[i].name}</p>
                        <p>年齡:${arr[i].age }</p>
                        <p>性別:${arr[i].sex }</p>
                    </div
                </li>
            `;
        }
</script>

2撰糠、mustache的底層原理

要實現(xiàn)這樣的:
<script>
        // 模板
        var templateStr =  '<h1>今天我買了一輛{{thing}},{{money}}W,很{{mood}}</h1>';
        // 數(shù)據(jù)
        var data = {
            thing: '蘭博基尼',
            money: 50,
            mood: '開心'
        };
        // 1.使用正則實現(xiàn)簡單數(shù)據(jù)填充酥馍,正則中的 g 表示全局,把'你'替換成 '我'
        // console.log('你很帥阅酪,你很有錢'.replace(/你/g,'我'));
        // 2.最簡單的模板引擎實現(xiàn)機(jī)理旨袒,利用正則表達(dá)式中的replace()方法
        //   replace()的第二個參數(shù)$1 可以是一個函數(shù)汁针,這個喊啊書提供的東西的參數(shù)就是$1
       function render(templateStr, data){
           return templateStr.replace(/\{\{(\w+)\}\}/g,function(findStr, $1){
               return data[$1];
           });
       }
       var result = render(templateStr, data);
       console.log(result);
</script>

實現(xiàn)方式:Mustache.render(templateStr, data); templateStr模板字符串,data數(shù)據(jù)砚尽,render返回填充后dom字符串施无。

實現(xiàn)原理:第①步:將模板字符串編譯成tokens 形式,第②步:將tokens數(shù)據(jù)結(jié)合必孤,解析成dom字符串猾骡。

3、什么是tokens?

JS的嵌套數(shù)組敷搪,模板字符串的JS表示形式兴想。

模板字符串<h1>我買了一輛{{thing}},{{money}}W</h1>會被解析成下面的 tokens:

// tokens: 
[
    ["text",  "< h1 >我買了一輛"],
    ["name",  ”thing“],
    ["text",  ","],
    ["name",  ”money“],
    ["text",  "W< /h1 >"],
]

實現(xiàn)tokens思路:用到了《數(shù)據(jù)結(jié)構(gòu)》中的原理,遇到 # 號進(jìn)棧赡勘,遇到 / 線出棧襟企; # 號標(biāo)記的tokens,需要遞歸處理它的下標(biāo)為2的小數(shù)組狮含。遍歷傳入的 tokens 的每一個 token顽悼,遇到第一項是 # 和 / 的分別做處理,其余的做一個默認(rèn)處理几迄。大致思路是當(dāng)遍歷到的 token 的第一項為 # 時蔚龙,就把直至遇到配套的 / 之前,遍歷到的每一個 token 都放入一個容器(collector)中映胁,把這個容器放入當(dāng)前 token 里作為第 3 項元素木羹。

// nestTokens.js
export default (tokens) => {
  const nestTokens = []
  const stack = []
  let collector = nestTokens // 一開始讓收集器 collector 指向最終返回的數(shù)組 nestTokens
  tokens.forEach(token => {
    switch (token[0]) {
      case '#':
        stack.push(token)
        collector.push(token)
        collector = token[2] = [] // 連等賦值
        break
      case '/':
        stack.pop(token)
        collector = stack.length > 0 ? stack[stack.length-1][2] : nestTokens
        break;
      default:
        collector.push(token)
        break
    }
  })
  return nestTokens
}

參考:https://juejin.cn/post/6954244558938963982

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市解孙,隨后出現(xiàn)的幾起案子坑填,更是在濱河造成了極大的恐慌,老刑警劉巖弛姜,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脐瑰,死亡現(xiàn)場離奇詭異,居然都是意外死亡廷臼,警方通過查閱死者的電腦和手機(jī)苍在,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荠商,“玉大人寂恬,你說我怎么就攤上這事±趁唬” “怎么了初肉?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長饰躲。 經(jīng)常有香客問我牙咏,道長臼隔,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任眠寿,我火速辦了婚禮躬翁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盯拱。我一直安慰自己盒发,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布狡逢。 她就那樣靜靜地躺著宁舰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪奢浑。 梳的紋絲不亂的頭發(fā)上蛮艰,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機(jī)與錄音雀彼,去河邊找鬼壤蚜。 笑死,一個胖子當(dāng)著我的面吹牛徊哑,可吹牛的內(nèi)容都是我干的袜刷。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼莺丑,長吁一口氣:“原來是場噩夢啊……” “哼著蟹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起梢莽,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤萧豆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后昏名,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涮雷,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年葡粒,在試婚紗的時候發(fā)現(xiàn)自己被綠了份殿。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡嗽交,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颂斜,到底是詐尸還是另有隱情夫壁,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布沃疮,位于F島的核電站盒让,受9級特大地震影響梅肤,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜邑茄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一姨蝴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肺缕,春花似錦左医、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至彤路,卻和暖如春秕硝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背洲尊。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工远豺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坞嘀。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓躯护,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姆吭。 傳聞我的和親對象是個殘疾皇子榛做,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 模板引擎之前的時代 純DOM法: 非常笨拙,沒有實戰(zhàn)價值 數(shù)組join法: 曾幾何時非常流行内狸,是曾經(jīng)的前端必會知識...
    強(qiáng)某某閱讀 924評論 0 3
  • 先簡單介紹一下編譯原理的基本知識检眯。眾所周知,基本所有的現(xiàn)代編譯器昆淡,整個編譯過程可以分為三個階段:Parsing(解...
    像朝陽一樣閱讀 1,073評論 0 0
  • Vue.js入門教程 參考文獻(xiàn) Vue-Cli webpack打包入門:http://www.cnblogs.co...
    采香行處蹙連錢閱讀 1,454評論 2 3
  • mustache: 中文意思是:髭锰瘸;上唇的胡子;長髭 它是一款經(jīng)典的前端模板引擎昂灵,在前后端分離的技術(shù)架構(gòu)下面避凝,一度...
    普通不平庸閱讀 913評論 0 0
  • Vue不支持IE8以及以下版本。 想要使用Vue的話可以通過直接下載vue.js眨补,放置到項目中寫好路徑就可以管削,或者...
    酥楓閱讀 632評論 0 0