mustache模板引擎

mustache庫的機(jī)理

image.png
  1. 將模板字符串編譯為tokens形式
  2. 將tokens結(jié)合數(shù)據(jù)阔加,解析為dom字符串

一鹉梨、tokens

tokens是js的嵌套數(shù)組:


image.png

當(dāng)模板字符串中有循環(huán)存在時动漾,它將被編譯成嵌套更深的tokens创译。

二店溢、模板字符串解析tokens的過程

    1. 定義一個Scanner類酒唉,類中包含兩個方法:scan和scanUntil


      image.png

      scan:路過指定內(nèi)容矩桂,沒有返回值
      scanUntil:讓指針進(jìn)行掃描,知道遇見指定內(nèi)容結(jié)束痪伦,并返回結(jié)束之前路過的文字

class Scanner{
  constructor(templateStr){
    this.templateStr = templateStr
    this.pos = 0 // 指針
    this.tail = templateStr // 指針尾侄榴,剛開始時指向原字符串
  }
  scan(tag){
    if(this.tail.indexOf(tag)===0){
      // tag有多少位就讓tail后移多少位
      this.pos += tag.length
      this.tail = this.templateStr.substring(this.pos)
    }
  }
  scanUntil(stopTag){
    // 記錄執(zhí)行本方法時pos的值
    let pos_up = this.pos
    // 當(dāng)指針尾不等于要跳過的目標(biāo)字符串時,指針一直向后移動
    while(this.tail.indexOf(stopTag)!==0 && this.pos<this.templateStr.length){ // && 后面的用來防止while死循環(huán)
      this.pos++
      // 改變尾巴為從當(dāng)前指針這個字符网沾,到剩下的全部字符
      this.tail = this.templateStr.substr(this.pos)
    }
    // 返回掃描到的值
    return this.templateStr.substring(pos_up, this.pos)
  }
}
    1. 將解析出來的字符串變成tokens
      渲染方法render()讓模板字符串變成tokens數(shù)組(如下圖)癞蚕;


      image.png

      折疊tokens,將#和/之間的數(shù)組整合起來作為子數(shù)組(利用collector收集器變量):

function parseTokens(tokens){ 
  let res = [] // 存儲最終返回結(jié)果
  let sections = [] // 一個棧結(jié)構(gòu),來表示是否有嵌套數(shù)組
  let collector = res // 收集器辉哥,用來收集嵌套數(shù)組,指向結(jié)果數(shù)組桦山,因?yàn)閿?shù)組是引用類型,所以collector和res指向同一個數(shù)組
  for(let i=0; i<tokens.length; i++){
    let token = token[i]
    switch(token[0]){
      case '#':
        sections.push(token)
        collector = token[2] = [] // 當(dāng)有嵌套數(shù)組時將collector值初始化為目標(biāo)收集的嵌套數(shù)組
        break;
      case '/':
        sections.pop()
        collector = sections.length>0?sections[sections.length-1][2]:res
        break;
      default:
        collector.push(token) // 將每一項(xiàng)token存入collector數(shù)組
    }
  }
return res;
}
    1. 將tokens結(jié)合數(shù)據(jù),解析為dom字符串
      其中有一個問題是度苔,js不能將帶有點(diǎn)符號的數(shù)據(jù)(如 {{item.label}} )解析出來匆篓,所以需要編寫lookup函數(shù):
// lookup函數(shù)從一個對象中讀取出嵌套的值,如下lookup(dataObj, 'a.b.c')值為123
let dataObj = {
  a: {
    b: {
      c: 123
    }
  }
}
function lookup(dataObj, keyName){
  // 如果keyName里面有點(diǎn)符號
  if(keyName.indexOf('.')!==-1){
    let keys = keyName.split('.')
    let temp = dataObj
    for(let i=0; i<keys.length; i++){
      temp = temp[keys[i]]
    }
    return temp
  }
  return dataObj[keyName]
}

最后判斷token[0]的值,若是"text"則與結(jié)果字符串直接拼接寇窑,若是"name"則取data中對應(yīng)的值之后再拼接鸦概,若是"#"說明有嵌套數(shù)組則要遞歸。

最后編輯于
?著作權(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)容