资讯专栏INFORMATION COLUMN

翻译_20行代码创造JavaScript模板引擎(一)

hiyang / 2685人阅读

摘要:翻译行代码创造模板引擎一想看博客原文链接,请点击下方一个非常好用的学习正则表达的网站正则表达式图文解说网站译文事情的起因,我想编写一个逻辑简单的模板引擎,它可以很好满足我现在的需求。,表示全局匹配。

翻译_20行代码创造JavaScript模板引擎(一) 想看博客原文链接,请点击下方

JavaScript template engine in just 20 lines

一个非常好用的学习正则表达的网站
正则表达式图文解说网站

译文

事情的起因,我想编写一个逻辑简单的模板引擎,它可以很好满足我现在的需求。

我知道不能找一些现有的引擎,因为它们绝大多数是基于NodeJS的,很难在浏览器中去实现它们。

而我希望用原生JavaScript去写,这样也可以在浏览器上运行。

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

我稍微改动了一下,缩减到20行。 这个脚本的工作原理,非常有趣。

在本文中, 将一步一步来创建这个引擎,这样你就体会到来自John的奇思妙想。

构思
functiom TemplateEngine(tpl, data) {
    //魔法细节在这里 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)); //按照构思,我们想实现的需要和想得到结果 应该是 "

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

"

一个简单的函数,接收两个参数:tpl(模板字符窜),data(JS对象格式);

第一步,匹配参数tpl(模板字符窜)中的动态模块

动态模块是指在 tpl(模板字符窜)中,你想要匹配并用数据替换的部分。

"<%string%>"

//举个例子
//tpl中的动态模块有两个:<%name%>和<%age%>。

var tpl = "

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

";

在这里,我决定用正则表达式去实现,正则表达式不是我的强项,所以有什么建议,尽管畅所欲言。

Tips: 其实正则没那么难,平时多练练就好了。 首先克服内心的恐惧,尝试着写,想不出来,多翻翻基础知识。

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

这个正则表达式是什么意思呢?

如果实在看不懂正则,可以看下这篇博客。 正则表达式-基础知识Review

在一个字符窜中,匹配以"<%"开头 和 "%>" 结尾的字符窜片段。

g,表示全局匹配。

在这里,我们需要用到正则表达式的exec()方法。

该方法用于正则表达式模式在字符窜中运行查找,如果exec()找到匹配的文本,则返回一个数组,否则返回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循环语句来依次得到匹配字符窜。

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()方法,在全局匹配中的特性:

调用全局的RegExp对象的exec()时,它会在RegExp实例的lastIndex属性指定的字符处开始检索字符窜string

当exec()找到了与表达式相匹配的文本时, 在匹配后, 它将把RegExp实例的lastIndex属性设置为匹配文本的最后一个字符的下一个位置。可以通过反复调用exec()方法来遍历字符窜中的所有匹配文本。

==当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
第二步,用数据替换在模板中匹配的字符窜片段

现在,变得有趣了!!

给函数传递一个真实的数据(JS对象格式)。

然后用数据替换匹配的字符窜片段。

能想到的最简单的方法,就是使用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.

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

测试,运行成功!

但是这还不够好,数据是非常简单的JS对象,使用object["property"]对象的中括号语法,很容易去读取对象的值。

但在实践中,我们用到的数据中,可能有复杂的嵌套对象。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/98366.html

相关文章

  • 翻译_只需20代码创造JavaScript模板引擎(二)

    摘要:函数执行后应该返回最终编译的模板。到了这里,我们只需要创建函数并执行它。 上文链接翻译_只需20行代码创造JavaScript模板引擎(一) 但是这还不够好,数据是非常简单的对象,并且很容易使用object[property]对象的中括号语法,去读取对象的值。 但在实践中,我们用到的数据中,可能有复杂的嵌套对象。 //嵌套对象 data = { name: Krasimir ...

    superw 评论0 收藏0
  • 浅谈web中前端模板引擎的使用

    摘要:置换型模板引擎的优点实现简单,缺点效率低,无法满足高负载的应用请求。用途百度词条模板引擎可以让网站程序实现界面与数据分离,业务代码与逻辑代码的分离,提升开发效率,良好的设计也提高了代码的复用性。前端模板的出现使得前后端分离成为可能。 模板引擎 模板引擎-百度词条 什么是模板引擎?(百度词条) 模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据分离而产生的,它可以生成...

    妤锋シ 评论0 收藏0
  • Tornado 4.3文档翻译: 用户指南-模板和UI

    摘要:译者说于年月日发布,该版本正式支持的关键字,并且用旧版本编译同样可以使用这两个关键字,这无疑是一种进步。其次,这是最后一个支持和的版本了,在后续的版本了会移除对它们的兼容。 译者说 Tornado 4.3于2015年11月6日发布,该版本正式支持Python3.5的async/await关键字,并且用旧版本CPython编译Tornado同样可以使用这两个关键字,这无疑是一种进步。其次...

    shiguibiao 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<