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

資訊專欄INFORMATION COLUMN

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

hiyang / 2759人閱讀

摘要:翻譯行代碼創(chuàng)造模板引擎一想看博客原文鏈接,請點擊下方一個非常好用的學(xué)習(xí)正則表達的網(wǎng)站正則表達式圖文解說網(wǎng)站譯文事情的起因,我想編寫一個邏輯簡單的模板引擎,它可以很好滿足我現(xiàn)在的需求。,表示全局匹配。

翻譯_20行代碼創(chuàng)造JavaScript模板引擎(一) 想看博客原文鏈接,請點擊下方

JavaScript template engine in just 20 lines

一個非常好用的學(xué)習(xí)正則表達的網(wǎng)站
正則表達式圖文解說網(wǎng)站

譯文

事情的起因,我想編寫一個邏輯簡單的模板引擎,它可以很好滿足我現(xiàn)在的需求。

我知道不能找一些現(xiàn)有的引擎,因為它們絕大多數(shù)是基于NodeJS的,很難在瀏覽器中去實現(xiàn)它們。

而我希望用原生JavaScript去寫,這樣也可以在瀏覽器上運行。

我是從John Resig的博客[](https://johnresig.com/blog/ja...。

我稍微改動了一下,縮減到20行。 這個腳本的工作原理,非常有趣。

在本文中, 將一步一步來創(chuàng)建這個引擎,這樣你就體會到來自John的奇思妙想。

構(gòu)思
functiom TemplateEngine(tpl, data) {
    //魔法細節(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)思,我們想實現(xiàn)的需要和想得到結(jié)果 應(yīng)該是 "

Hello, my name is Shaw. I"m 18 years old.

"

一個簡單的函數(shù),接收兩個參數(shù):tpl(模板字符竄),data(JS對象格式);

第一步,匹配參數(shù)tpl(模板字符竄)中的動態(tài)模塊

動態(tài)模塊是指在 tpl(模板字符竄)中,你想要匹配并用數(shù)據(jù)替換的部分。

"<%string%>"

//舉個例子
//tpl中的動態(tài)模塊有兩個:<%name%>和<%age%>。

var tpl = "

Hello, my name is <%name%>. I"m <%age%> years old.

";

在這里,我決定用正則表達式去實現(xiàn),正則表達式不是我的強項,所以有什么建議,盡管暢所欲言。

Tips: 其實正則沒那么難,平時多練練就好了。 首先克服內(nèi)心的恐懼,嘗試著寫,想不出來,多翻翻基礎(chǔ)知識。

var regEx = /<%([^%>]+)?%>/g

這個正則表達式是什么意思呢?

如果實在看不懂正則,可以看下這篇博客。 正則表達式-基礎(chǔ)知識Review

在一個字符竄中,匹配以"<%"開頭 和 "%>" 結(jié)尾的字符竄片段。

g,表示全局匹配。

在這里,我們需要用到正則表達式的exec()方法。

該方法用于正則表達式模式在字符竄中運行查找,如果exec()找到匹配的文本,則返回一個數(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] */

得到了正則表達式在字符竄中匹配的字符竄片段。

只得到一個匹配的字符竄片段!

可是我們需要所有匹配的字符竄片段。

這時,我們需要一個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對象的exec()時,它會在RegExp實例的lastIndex屬性指定的字符處開始檢索字符竄string

當(dāng)exec()找到了與表達式相匹配的文本時, 在匹配后, 它將把RegExp實例的lastIndex屬性設(shè)置為匹配文本的最后一個字符的下一個位置。可以通過反復(fù)調(diào)用exec()方法來遍歷字符竄中的所有匹配文本。

==當(dāng)exec()再也找不到匹配的文本時,它將返回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ù)傳遞一個真實的數(shù)據(jù)(JS對象格式)。

然后用數(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.

//運行成功,可以使用。

測試,運行成功!

但是這還不夠好,數(shù)據(jù)是非常簡單的JS對象,使用object["property"]對象的中括號語法,很容易去讀取對象的值。

但在實踐中,我們用到的數(shù)據(jù)中,可能有復(fù)雜的嵌套對象。

//嵌套對象
data = {
    name: "Krasimir Tsonev",
    profile: {age:29}
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/98366.html

相關(guān)文章

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

    摘要:函數(shù)執(zhí)行后應(yīng)該返回最終編譯的模板。到了這里,我們只需要創(chuàng)建函數(shù)并執(zhí)行它。 上文鏈接翻譯_只需20行代碼創(chuàng)造JavaScript模板引擎(一) 但是這還不夠好,數(shù)據(jù)是非常簡單的對象,并且很容易使用object[property]對象的中括號語法,去讀取對象的值。 但在實踐中,我們用到的數(shù)據(jù)中,可能有復(fù)雜的嵌套對象。 //嵌套對象 data = { name: Krasimir ...

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

    摘要:置換型模板引擎的優(yōu)點實現(xiàn)簡單,缺點效率低,無法滿足高負載的應(yīng)用請求。用途百度詞條模板引擎可以讓網(wǎng)站程序?qū)崿F(xiàn)界面與數(shù)據(jù)分離,業(yè)務(wù)代碼與邏輯代碼的分離,提升開發(fā)效率,良好的設(shè)計也提高了代碼的復(fù)用性。前端模板的出現(xiàn)使得前后端分離成為可能。 模板引擎 模板引擎-百度詞條 什么是模板引擎?(百度詞條) 模板引擎(這里特指用于Web開發(fā)的模板引擎)是為了使用戶界面與業(yè)務(wù)數(shù)據(jù)分離而產(chǎn)生的,它可以生成...

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

    摘要:譯者說于年月日發(fā)布,該版本正式支持的關(guān)鍵字,并且用舊版本編譯同樣可以使用這兩個關(guān)鍵字,這無疑是一種進步。其次,這是最后一個支持和的版本了,在后續(xù)的版本了會移除對它們的兼容。 譯者說 Tornado 4.3于2015年11月6日發(fā)布,該版本正式支持Python3.5的async/await關(guān)鍵字,并且用舊版本CPython編譯Tornado同樣可以使用這兩個關(guān)鍵字,這無疑是一種進步。其次...

    shiguibiao 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<