国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

翻譯_20行代碼創(chuàng)造JavaScript模板引擎(一)

hiyang / 2764人閱讀

摘要:翻譯行代碼創(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

相關(guān)文章

  • 翻譯_只需20代碼創(chuàng)造JavaScript模板引擎(二)

    摘要:函數(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 ...

    superw 評(píng)論0 收藏0
  • 淺談web中前端模板引擎的使用

    摘要:置換型模板引擎的優(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)生的,它可以生成...

    妤鋒シ 評(píng)論0 收藏0
  • Tornado 4.3文檔翻譯: 用戶指南-模板和UI

    摘要:譯者說于年月日發(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)步。其次...

    shiguibiao 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<