摘要:翻譯行代碼創(chuàng)造模板引擎一想看博客原文鏈接,請(qǐng)點(diǎn)擊下方一個(gè)非常好用的學(xué)習(xí)正則表達(dá)的網(wǎng)站正則表達(dá)式圖文解說網(wǎng)站譯文事情的起因,我想編寫一個(gè)邏輯簡單的模板引擎,它可以很好滿足我現(xiàn)在的需求。,表示全局匹配。
翻譯_20行代碼創(chuàng)造JavaScript模板引擎(一) 想看博客原文鏈接,請(qǐng)點(diǎn)擊下方
JavaScript template engine in just 20 lines
一個(gè)非常好用的學(xué)習(xí)正則表達(dá)的網(wǎng)站
正則表達(dá)式圖文解說網(wǎng)站
事情的起因,我想編寫一個(gè)邏輯簡單的模板引擎,它可以很好滿足我現(xiàn)在的需求。
我知道不能找一些現(xiàn)有的引擎,因?yàn)樗鼈兘^大多數(shù)是基于NodeJS的,很難在瀏覽器中去實(shí)現(xiàn)它們。
而我希望用原生JavaScript去寫,這樣也可以在瀏覽器上運(yùn)行。
我是從John Resig的博客[](https://johnresig.com/blog/ja...。
我稍微改動(dòng)了一下,縮減到20行。 這個(gè)腳本的工作原理,非常有趣。
在本文中, 將一步一步來創(chuàng)建這個(gè)引擎,這樣你就體會(huì)到來自John的奇思妙想。
構(gòu)思functiom TemplateEngine(tpl, data) { //魔法細(xì)節(jié)在這里 magic details here! } var tpl = "Hello, my name is <%name%>. I"m <%age%> years old.
"; var data = { name: "Shaw", age: 18 } console.log(TemplateEngine(tpl, data)); //按照構(gòu)思,我們想實(shí)現(xiàn)的需要和想得到結(jié)果 應(yīng)該是 "Hello, my name is Shaw. I"m 18 years old.
"
一個(gè)簡單的函數(shù),接收兩個(gè)參數(shù):tpl(模板字符竄),data(JS對(duì)象格式);
第一步,匹配參數(shù)tpl(模板字符竄)中的動(dòng)態(tài)模塊動(dòng)態(tài)模塊是指在 tpl(模板字符竄)中,你想要匹配并用數(shù)據(jù)替換的部分。
"<%string%>"
//舉個(gè)例子 //tpl中的動(dòng)態(tài)模塊有兩個(gè):<%name%>和<%age%>。 var tpl = "Hello, my name is <%name%>. I"m <%age%> years old.
";
在這里,我決定用正則表達(dá)式去實(shí)現(xiàn),正則表達(dá)式不是我的強(qiáng)項(xiàng),所以有什么建議,盡管暢所欲言。
Tips: 其實(shí)正則沒那么難,平時(shí)多練練就好了。 首先克服內(nèi)心的恐懼,嘗試著寫,想不出來,多翻翻基礎(chǔ)知識(shí)。
var regEx = /<%([^%>]+)?%>/g
這個(gè)正則表達(dá)式是什么意思呢?
如果實(shí)在看不懂正則,可以看下這篇博客。 正則表達(dá)式-基礎(chǔ)知識(shí)Review
在一個(gè)字符竄中,匹配以"<%"開頭 和 "%>" 結(jié)尾的字符竄片段。
g,表示全局匹配。
在這里,我們需要用到正則表達(dá)式的exec()方法。
該方法用于正則表達(dá)式模式在字符竄中運(yùn)行查找,如果exec()找到匹配的文本,則返回一個(gè)數(shù)組,否則返回null。
regExp.exec(str);
var tpl = "Hello, my name is <%name%>. I"m <%age%> years old.
"; var regEx = /<%([^%>]+)?%>/g; console.log(regEx.exec(tpl)); /* [0: "<%name%>", 1: "name", index: 21, input: "Hello, my name is <%name%>. I"m <%age%> years old.
", length: 2, groups: undefined] */
得到了正則表達(dá)式在字符竄中匹配的字符竄片段。
只得到一個(gè)匹配的字符竄片段!
可是我們需要所有匹配的字符竄片段。
這時(shí),我們需要一個(gè)while循環(huán)語句來依次得到匹配字符竄。
var tpl = "Hello, my name is <%name%>. I"m <%age%> years old.
"; var regEx = /<%([^%>]+)?%>/g; var match; while(match = regEx.exec(tpl)) { console.log(match); //["<%name%>", "name", index: 21, input: "Hello, my name is <%name%>. I"m <%age%> years old.
", groups: undefined] //["<%age%>", "age", index: 35, input: "Hello, my name is <%name%>. I"m <%age%> years old.
", groups: undefined] }
這里要了解RegExp.exec()方法,在全局匹配中的特性:
調(diào)用全局的RegExp對(duì)象的exec()時(shí),它會(huì)在RegExp實(shí)例的lastIndex屬性指定的字符處開始檢索字符竄string
當(dāng)exec()找到了與表達(dá)式相匹配的文本時(shí), 在匹配后, 它將把RegExp實(shí)例的lastIndex屬性設(shè)置為匹配文本的最后一個(gè)字符的下一個(gè)位置。可以通過反復(fù)調(diào)用exec()方法來遍歷字符竄中的所有匹配文本。
==當(dāng)exec()再也找不到匹配的文本時(shí),它將返回null,并把lastIndex屬重置為0。==
var reg = /d/g; var r = reg.exec("a1b2c3"); console.log(r); console.log(reg.lastIndex); // 2 r = reg.exec("a1b2c3"); console.log(reg.lastIndex); // 4
var reg = /d/g; while (r = reg.exec("a1b2c3")) { console.log(r.index + ":" + r[0]) } //1:1 , 3:2, 5:3第二步,用數(shù)據(jù)替換在模板中匹配的字符竄片段
現(xiàn)在,變得有趣了!!
給函數(shù)傳遞一個(gè)真實(shí)的數(shù)據(jù)(JS對(duì)象格式)。
然后用數(shù)據(jù)替換匹配的字符竄片段。
能想到的最簡單的方法,就是使用String.prototype.replace()方法了。
我們可以這樣寫
function TemplateEngine(tpl, data){ var regEx = /<%([^%>]+)?%>/g, matchStrArr; while(matchStrArr = regEx.exec(tpl)) { tpl = tpl.replace(matchStrArr[0], data[matchStrArr[1]]) } return tpl; } var tpl = "Hello, my name is <%name%>. I"m <%age%> years old.
"; var personalInfo = { name: "Shaw", age: 18 } var htmlStr = TemplateEngine(tpl, personalInfo); console.log(htmlStr); //Hello, my name is Shaw. I"m 18 years old.
//運(yùn)行成功,可以使用。
測試,運(yùn)行成功!
但是這還不夠好,數(shù)據(jù)是非常簡單的JS對(duì)象,使用object["property"]對(duì)象的中括號(hào)語法,很容易去讀取對(duì)象的值。
但在實(shí)踐中,我們用到的數(shù)據(jù)中,可能有復(fù)雜的嵌套對(duì)象。
//嵌套對(duì)象 data = { name: "Krasimir Tsonev", profile: {age:29} }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/98366.html
摘要:函數(shù)執(zhí)行后應(yīng)該返回最終編譯的模板。到了這里,我們只需要?jiǎng)?chuàng)建函數(shù)并執(zhí)行它。 上文鏈接翻譯_只需20行代碼創(chuàng)造JavaScript模板引擎(一) 但是這還不夠好,數(shù)據(jù)是非常簡單的對(duì)象,并且很容易使用object[property]對(duì)象的中括號(hào)語法,去讀取對(duì)象的值。 但在實(shí)踐中,我們用到的數(shù)據(jù)中,可能有復(fù)雜的嵌套對(duì)象。 //嵌套對(duì)象 data = { name: Krasimir ...
摘要:置換型模板引擎的優(yōu)點(diǎn)實(shí)現(xiàn)簡單,缺點(diǎn)效率低,無法滿足高負(fù)載的應(yīng)用請(qǐng)求。用途百度詞條模板引擎可以讓網(wǎng)站程序?qū)崿F(xiàn)界面與數(shù)據(jù)分離,業(yè)務(wù)代碼與邏輯代碼的分離,提升開發(fā)效率,良好的設(shè)計(jì)也提高了代碼的復(fù)用性。前端模板的出現(xiàn)使得前后端分離成為可能。 模板引擎 模板引擎-百度詞條 什么是模板引擎?(百度詞條) 模板引擎(這里特指用于Web開發(fā)的模板引擎)是為了使用戶界面與業(yè)務(wù)數(shù)據(jù)分離而產(chǎn)生的,它可以生成...
摘要:譯者說于年月日發(fā)布,該版本正式支持的關(guān)鍵字,并且用舊版本編譯同樣可以使用這兩個(gè)關(guān)鍵字,這無疑是一種進(jìn)步。其次,這是最后一個(gè)支持和的版本了,在后續(xù)的版本了會(huì)移除對(duì)它們的兼容。 譯者說 Tornado 4.3于2015年11月6日發(fā)布,該版本正式支持Python3.5的async/await關(guān)鍵字,并且用舊版本CPython編譯Tornado同樣可以使用這兩個(gè)關(guān)鍵字,這無疑是一種進(jìn)步。其次...
閱讀 2964·2021-11-17 09:33
閱讀 3125·2021-11-16 11:52
閱讀 488·2021-09-26 09:55
閱讀 2983·2019-08-30 15:52
閱讀 1321·2019-08-30 15:44
閱讀 1268·2019-08-30 13:59
閱讀 806·2019-08-30 13:08
閱讀 1168·2019-08-30 10:50