es6實(shí)現(xiàn)簡單模板編譯

現(xiàn)在有各種框架,其中一個主要模塊就是關(guān)于template碰缔。最火的vue账劲、react等框架,在這一塊上也是是下足了功夫金抡。我也想寫一個自己的模板編譯工具瀑焦,所以就做了個簡單的實(shí)現(xiàn),主要是使用es6的反引號編譯梗肝。

1.選擇

這里使用es6的反引號去編譯文本節(jié)點(diǎn)榛瓮,只要把數(shù)據(jù)放在scope中,我們就可以使用反引號加“${}”的方式去把變量替換掉模板中的內(nèi)容巫击。

2.編譯內(nèi)容

首先禀晓,我嘗試去直接編譯一個文本,讓變量能夠被填充坝锰,模板這么寫

<div id="app">
     <p>your name is ${name}</p>
     <p>your age is ${age}</p>
</div>

模板中${}中的內(nèi)容是要被替換的粹懒。首先我們獲取文本字符串

const root = document.querySelector('#app');
let htmlFragment = root.innerHTML;

然后我們要找出需要替換的變量名,這里用正則查找

const templateReg = /\${([^{}])+}/g;
let res = null;
let keyArray = [];
//把找到的變量存起來
while(res = reg.exec(htmlFragment)){
     let key = res[0].slice(2,res[0].length-1);
     keyArray.push(key);
}

我們在js中定義的數(shù)據(jù)格式是這樣的

let data = {
     name:"javascript",
     age:"22"
}

接下來顷级,我們把js中的數(shù)據(jù)格式替換掉模板中的

 for(let item of keyArray){
     let nReg = new RegExp("\\${"+item+"}","g");           
     htmlFragment = htmlFragment.replace(nReg, '${data["'+item+'"]}');
}   

這里說一下為什么要替換崎淳,首先是es6中編譯字符串中的變量,這個變量必須在scope中愕把,然后拣凹,我們的數(shù)據(jù)不可能是就像一個一個的變量,那樣要定義太多恨豁,還有就是模板中盡量寫法簡潔嚣镜。所以這里把簡潔的變量替換為正真的scope中的變量。因?yàn)槭且獎討B(tài)替換橘蜜,所以正則表達(dá)式每次都要重新定義(注意轉(zhuǎn)義)菊匿。
最后就是如何編譯的問題,因?yàn)槲覀兡玫降氖莻€字符串计福,而es6是要用反引號來編譯跌捆,所以這里就需要拼接反引號和字符串進(jìn)行編譯,大家最容易想到的就是eval象颖,但是介于它可能會帶來一些不可預(yù)知的東西佩厚,所以我們使用new Function()的方式。

let str = new Function("return `"+htmlFragment+"`");
root.innerHTML = "";
//這個方法很久之前就有了说订,并不是最新出的
root.insertAdjacentHTML('afterbegin',str);

3.編譯模板

這里借鑒vue的節(jié)點(diǎn)編譯方式抄瓦,主要就是對元素節(jié)點(diǎn)和文本節(jié)點(diǎn)的處理。由于并沒有做循環(huán)渲染陶冷,所以目前只做了對文本節(jié)點(diǎn)的處理钙姊。基本的思想還是以一顆樹的形式去一層一層的編譯埂伦。

    class Compile{   constructor(node){      this.compileNode(node);      node.hasChildNodes() ? this.compileNodeList(node.childNodes) : null;   }   compileNodeList(nodeList){      let childListFn, node;      for(node of nodeList){         this.compileNode(node);         node.hasChildNodes ? this.compileNodeList(node.childNodes) : null;      }   }   compileNode(node){      console.log(node);      if(node.nodeType == 1){         this.compileElement(node);      }else if(node.nodeType == 3){         this.compileText(node);      }   }   compileElement(node){      //解析指令   }   compileText(node){      //解析模板      node.data;      node.data = this.compileTemplate(node.data)();   }   compileTemplate(textFragment){      let res = null;      let keyArray = [];      while(res = templateReg.exec(textFragment)){         let key = res[0].slice(2,res[0].length-1);         keyArray.push(key);      }      for(let item of keyArray){         let nReg = new RegExp("\\${"+item+"}","g");         console.log(nReg.test(textFragment));         textFragment = textFragment.replace(nReg, '${data["'+item+'"]}');      }      return new Function("return `"+textFragment+"`");   }}//new這個對象即可new Compile(root);

全部的可以去github上看煞额,這個后續(xù)也會加強(qiáng)功能。https://github.com/Stevenzwzhai/plugs/tree/master/es6-template

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沾谜,一起剝皮案震驚了整個濱河市膊毁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌类早,老刑警劉巖媚媒,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異涩僻,居然都是意外死亡缭召,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門逆日,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嵌巷,“玉大人,你說我怎么就攤上這事室抽√履模” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵坪圾,是天一觀的道長晓折。 經(jīng)常有香客問我惑朦,道長,這世上最難降的妖魔是什么漓概? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任漾月,我火速辦了婚禮,結(jié)果婚禮上胃珍,老公的妹妹穿的比我還像新娘梁肿。我一直安慰自己,他們只是感情好觅彰,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布吩蔑。 她就那樣靜靜地躺著,像睡著了一般填抬。 火紅的嫁衣襯著肌膚如雪烛芬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天痴奏,我揣著相機(jī)與錄音蛀骇,去河邊找鬼。 笑死读拆,一個胖子當(dāng)著我的面吹牛擅憔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播檐晕,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼暑诸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了辟灰?” 一聲冷哼從身側(cè)響起个榕,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎芥喇,沒想到半個月后西采,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡继控,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年械馆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片武通。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡霹崎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冶忱,到底是詐尸還是另有隱情尾菇,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站派诬,受9級特大地震影響劳淆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜千埃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一憔儿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧放可,春花似錦、人聲如沸朝刊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拾氓。三九已至冯挎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咙鞍,已是汗流浹背房官。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留续滋,地道東北人翰守。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像疲酌,于是被迫代替她去往敵國和親蜡峰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理朗恳,服務(wù)發(fā)現(xiàn)湿颅,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 一粥诫、情景創(chuàng)設(shè)及引入:一分鐘以內(nèi) 二油航、學(xué)習(xí)目標(biāo)、重難點(diǎn)呈現(xiàn):兩分鐘以內(nèi) 三怀浆、合作學(xué)習(xí)分工及展示評價:兩分鐘以內(nèi) 四谊囚、...
    淮高劉溪閱讀 481評論 0 0
  • 自制力即權(quán)利
    阿嚏fairy閱讀 70評論 0 0
  • k
    16de687f9f78閱讀 98評論 0 1
  • 第一章 溝通是一種交流的過程,其參與者處于不同但是有所重疊的背景下揉稚,經(jīng)由交換信息而建立關(guān)系秒啦,關(guān)系品質(zhì)受外在的、生理...
    宇航讀書閱讀 202評論 0 0