【扯淡】我的模板引擎

asp.net 又完善了自己的正则文件替换模板引擎,解析一个20KB的页面在5~20毫秒之内(未连接数据库的情况下)。
该引擎不使用服务器端控件和MVC框架,而仅仅使用主模板+子模板+变量集合+文件缓存的形式来生成页面。捕获页面请求,从主模板中获取完整的页面模板,然后后台脚本生成一个临时变量集和,传递给页面生成对象,产生最终的输出页面文本,发送给客户端。


自己以前公开过这个模板引擎v1.0的代码(已删除),主要就是应用 Regex.Replace 来进行关键字替换,分为页面模板生成与页面变量替换两个部分。而大型的表和数据采用文本碎片缓存的形式,在输出时动态的载入替换到页面文本内的形式。

如有兴趣可以到我的百度博客上看备份文档(最原始的1.0版):
http://hi.baidu.com/clso/blog/item/9463c4951fe96347d0135e63.html
http://hi.baidu.com/clso/blog/item/44a79c5284b0a1020cf3e38b.html
http://hi.baidu.com/clso/blog/item/ab9d77892cf2ebbf0e244464.html
或下载工程示例:
http://files.cnblogs.com/clso/ClsoTemplateDemo.zip

这个版本缺点不少,不够实用,在并发安全性上没有做任何处理,所以仅供参考。
随着自己对正在做的一个网页项目的深入,渐渐发现原来1.0版本的各种弊端,所以在这个基础上慢慢编写了这个引擎的2.0版本,主要加入了并发访问的读写锁,更安全的处理模板、缓存文件。在这之上,加入了自定义变量解析委托,用以处理意外的变量请求,更加细化了模板目录的分类等等等等...

2.0版刚写完不久,更多的想法涌入心头,这个模板因为只能进行变量替换和缓存替换,并不灵活,但加入流程判断又违背了我设计这个模板引擎的初衷(只是为了敏捷、快速、无冗余地输出页面),所以考虑再三,我只为新版本加入了Each循环功能,因为Each会循环集合内所有的元素,并不关心计数器变量和流程控制。


最后的3.0版本,这个模板引擎已经将模板框架细分为“主模板”、“子模板”、“模板缓存”、“超级模板缓存”、“文件缓存碎片”、“动态缓存碎片”、“最终输出缓存”等细节。
在模板输出对象的处理上,除了原来的“变量替换”、“变量委托”、“文件缓存替换”,还增加了“自定义函数委托”和上面提到的“Each循环”,以及“最终输出变量”。


目前这个模板引擎能做的工作:
从主模板中加载依赖的子模板,生成一个模板文本。这个模板文本可以存储到内存缓存中,或者保存到模板缓存中。
可以通过模板文本、传递变量集和或委托方法,给模板输出对象,产生一个完整的输出页面。
可以通过模板文本、传递变量集和或委托方法,给模板输出对象,忽略“最终输出变量”,产生一个非完整输出页面,称之为“超级模板缓存”。这个缓存可以在最短时间内,只替换“最终输出变量”而生成一个完整的输出页面。
一些实时性不高的缓存操作,可以即由计划任务来生成,或者由用户动作来生成。


实际上我的这个模板引擎非常简陋,以至于它很难处理一些非常复杂的任务。
它比不上nvelocity灵活强大,没有高级流程、不能利用反射来解析变量、也没有Emit动态编译。
但是上面说了,我的初衷就是要一个敏捷迅速、能全透明地输出变量、有效利用缓存的模板。
如果我需要那些高级功能,为什么我不直接用.aspx页面呢?
因为对我来说,它们既臃肿又缓慢...
posted @ 2011-05-10 06:22 夜闻香 阅读(257) 评论(1) 编辑 收藏

(c)2009-2012 CLE 夜闻香
版权所有,翻版不究,盗版可耻。
cnblogs.com & clso.tk