写一个迷你模板引擎

一直想写一个模板引擎用在自己的代码上,因为之前用的一个开源的产品,每次需要变通的时候都会遇到一些局限性,不如自己写的实在,想改哪就改哪,于是今天花了一点时间造了一个很小的模板引擎,核心功能已经存在,其他的待到以后慢慢的扩充。

模板引擎说白了,就是找到页面上的占位符,然后替换掉,再插入到页面中,不管功能还是实现方法都极其简单。

占位符也就两个地方能够出现的:

  1. 文本节点
  2. 属性值

通过childNodes能够找到文本节点,通过attributes能够找到该元素下的所有存在属性值,所以请看代码,以下代码实现了查找占位符的功能

function eachNode(ele) {
    //看看自身属性是否有需要转换属性
    var attrs = ele.attributes;
    var childNodes = ele.childNodes;
    //遍历当前元素的属性节点
    for(var a = 0,aLen = attrs.length;a<alen;a++) {
        //判断attrs[a].value中是否有用{{}}包裹的值
        if (/\{\{.*?\}\}/.test(attrs[a].value)) {
            //如果不会正则,也可以通过这种方法
            //attrs[a].value.indexof("{{") != -1 && attrs[a].value.indexof("}}",attrs[a].value.indexof("{{"))
            //--------------------------------//
            //这里执行求值表达式
        }
    }
    //遍历当前元素的子节点
    for(var c = 0,cLen = childNodes.length;a<clen;a++) {
        //如果当前子节点是文本节点,并且有内容是被{{}}包裹
        if (childNodes[c].nodeType === 3 && /\{\{.*?\}\}/.test(childNodes[c].data)) {
            //这里执行求值表达式
        }else if(childNOdes[c].nodeType !== 8) {
            //跳过注释节点
            eachNode(childNOdes[c])
        }
    }
}

通过上面这段代码就能找到某个元素下面所有需要转换的数据,如果需要查找整个 html 需要转换的数据只需要传入 html 节点: eachNode(document.documentElement) ,

找到这两种需要转换数据的节点中需要转换的数据之后,

需要对它们进行转换,就需要一个与它们有一个一一对应的值,

一般情况下会有一个对象,用于赋值给该节点下需要转换的占位符,它们一一对应这这个对象中的属性;

下面这段代码能够让你替换掉原来的占位符,那么一个迷你的模板引擎就开发出来了。

//不管什么方式,都需要有一些值跟页面上的占位符一一对应,
// 下面是一个对象保存着这些值
var obj = {
    test:1,
    textNode:"hello world!",
    class:"body"
}

//通过上面遍历的结果
//一般可以获得这种数据
//javascript {{textNode}}
//我需要把textNode转换成hello world
function replace(text) {
    //使用replace方法替换占位符
    text = text.replace(/\{\{.*?\}\}/g,function(m){
        // m === {{textNode}}
        return obj[m.replace(/\{\{|\}\}/g,function(m){
            return "";
        })];
    })
    console.log(text);
    //打印之后就会发现已经把原来的占位符都替换成了对象中的值
}
//试着在控制台打印这段文字
//var text = "javascript {{textNode}} + {{class}} === {{test}}";
//replace(text)

好了,至此已经把一个简单的迷你版模板引擎搭建起来,其余的如果不涉及计算,通过此方法也能够举一反三造出轮子来。

而且以上所有的正则表达式都可以模拟出来

替换占位符(非正则方法,通过这个方法举一反三)

var arr = [];
function getPlace(text) {
    var start = text.indexOf("{{");
    var end = text.indexOf("}}");
    //如果字符串内既有{{又有}}
    if (start != -1 && end != -1) {
        //截取字符串并保存起来
        arr.push(text.substring(start,end+2));
        //如果截取之后后面依然还有{{
        //继续回调一遍,把后面的占位符也保存到arr内
        if (text.indexOf("{{",end+2) != -1){
            getPlace(text.substr(text.indexOf("{{",end+2)));
        }
    }
}
getPlace("传{{入}}需要替换的字符{{吧}}");
//遍历替换字符串
for (var i =0,ilen = arr.length;i<ilen;i++) {
    text = text.replace(arr[i],function(m){
        return "替换的字符";
    })
}

至此一个迷你版的模板引擎就开发出来了。可以在github上看一个强大一点点具备计算能力的模板引擎,满打满算估计只有60行代码。

传送门

时间: 2024-12-09 04:49:47

写一个迷你模板引擎的相关文章

js模板引擎原理,附自己写的简洁模板引擎

js处理DOM交互非常普遍,但DOM结构单纯用js字符串拼接简直难以维护,不方便理解和扩展. 下面展现了js模板引擎的实现原理: html中的模板 <script id="mytpl"> <div> 我的名字是:$name$ <br/> 今年$age$了! </div> </script> 因为script不会被浏览器解析和渲染,最大限度节省了浏览器资源,textarea标签同样可以达到效果.Template标签就是这样的目的

利用epoll写一个&quot;迷你&quot;的网络事件库

epoll是linux下高性能的IO复用技术,是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率.另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了.epoll除了提供select/poll那种IO事件的水平触发(Level Triggered)外,还提供了边缘触发(Edge Triggered),这就使得用户空间程序有可能缓存I

JSX什么鬼(一起来写一个JSX渲染引擎)

原文地址:https://jasonformat.com/wtf-is-jsx/ JSX 实际上很简单:读完这篇文章,你就会完全了解这个可选择的模版引擎 副标题:"和JSX共处" 注解 你在每个文件和每个函数里定义这个,告诉转译器(如:Babel)每个节点在运行时阶段需要调用的函数名. 在下面的例子里,我们称之为"对每个节点,插入调用h()函数的调用" /**@jsx h*/ 转译 如果你还没有使用过转译器,你应该尝试使用.因为用es6/ES2015写,调试,测试或

写一个TT模板自动生成spring.net下面的配置文件。

这个是目标. 然后想着就怎么开始 1.

Epii.js 一个极其简单的Js模板引擎

Epii.js 简约而不简单的JavaScript模板引擎 项目地址 https://github.com/epaii/epii.js 极低门槛,拿来即用,别忘记star 特性 一个轻量级模板引擎,可快速实现数据与ui绑定(数据变动,UI自动变动),快速实现事件绑定和处理,不依赖任何第三方库,仅仅8k. 可快速应用于web开发,native+webapp开发,h5微网页开发,不与其它框架冲突. 让开发者更多关注与应用本身,而不用花费大量时间实现数据与ui的,和事件处理.效率大幅度提升. 名字由来

JavaScript模板引擎

JavaScript模板引擎实例应用 在之前的一篇名为<移动端基于HTML模板和JSON数据的JavaScript交互>的文章中,我向大家说明了为什么要使用JavaScript模板以及如何使用,文末还提到了laytpl.artTemplate.doT.baiduTemplate.kissyTemplate等模板引擎. 本文将举实例向大家讲解几个常用模板引擎的简单使用. 演示地址:模板引擎示例http://demo.52fhy.com/jstemp/ 准备工作 演示数据:blog.json结构:

只需一句话就能搞定NVelocity模板引擎,源码+解析+文档+资料+注释

好长时间不发技术方面的动态了,今天无聊就发篇关于NVelocity的技术文章吧,这门技术来源于java开源项目Velocity,比较好用,其他的我也不过多介绍了,没听过的在文章末尾会有介绍,下面我们就实战吧~ 咱们直接上最简单的方法,一句话搞定: DNTNvelocityHelper.NvelocityTemplate(context.Request.MapPath("~/NVelocity/templates/"), context, "Templater_index.dn

Smarty模板引擎

Smarty模板引擎是一个完全由PHP程序写出来的模板引擎,优点如下: 速度:Smarty模板引擎相比其他的模板引擎速度更快 继承技术:在Smarty里面可以定义一个父模板,让子模板来继承父模板 缓存技术:可以让一个不怎么变化但是偶尔会变化的页面缓存起来.下一次客户端请求的时候直接将缓存文件给它

前端模板引擎入门

模板引擎 模板引擎 起到 数据和视图分离的作用, 模板对应视图, 关注如何展示数据, 在模板外头准备的数据, 关注那些数据可以被展示. 后端模板引擎 freemarker 如下介绍,  java后台的模板引擎, freemark介绍,其图能很好标明这种关系. http://freemarker.org/ Apache FreeMarker is a template engine: a Java library to generate text output (HTML web pages, e