js模版引擎—nodetpl

这个是公司内部使用的一个模版引擎,主要应用在pc。

根据模版,返回一个js文件。大概是这个样子的js。

(function(N, undefined){
  var PATH = ‘http://core.pc.lietou-static.com/tpls/common/plugins/localdata/city.js‘;
  if(!N || !N._tpls) return false;
N._tpls[PATH] = N._tpls[PATH] ||{......};
})(window.NodeTpl);

其实也就是传入了全局的NodeTpl变量。并且给path赋值了。path赋值是模版引擎做的事情。

如果NodeTpl中的模版缓存中已经有了这个路径了,那就直接取得,不然就需要再定义个对象出来。这个对象要包含整个模版文件中的不同模版对象。每个都是个方法。

通常是通过main主模版方法,在里面可能会用到子模版的方法。。。

传给这些方法的有$data数据, 和guid(模版的id)。这里目前有个疑惑。。。

这个对象中有个template方法,在pc端根据不同浏览器确定是数组拼接还是字符串拼接,m端和以后就不需要这个了,直接字符串拼接就好。因为浏览器js引擎对字符串拼接做了优化,字符串更快。

这里除了guid,还用了dguid,是数据的id。

然后开始了css代码的处理,其实就是每个前面都加上了模版对应都guid,对js也进行了封装炒作,(怎么感觉做了很多不是模版引擎应该干的事情呢)

js添加的代码如下:

‘(function(window, document, undefined){\n‘);
    template.push(‘  var $ROOT = $("#‘+ guid +‘");\n‘);
    template.push(‘  var $TPLS = NodeTpl._tpls["‘+ PATH +‘"];\n‘);
    template.push(‘  var $DATA = NodeTpl._data["‘+ dguid +‘"];\n‘);

进行了封装,并且定义了三个变量,这三个变量用来作区分。

这个还有个require方法,可以用来获得子模版的内容。解析require之后的代码如下:

container.html($TPLS[\‘view-hwgat\‘]($DATA, "‘+ guid +‘"));\n‘);

目前为止,这个模版引擎实现的功能如下:

1 解析出模版本身

2 对css进行加id处理

3 对js封装处理

4 要可以通过require方法引入子模版,m端跟其他插件方法冲突,应该会修改成其他名字。比如include

至此,模版要做的事情就明确了。

下面再看看模版引擎是怎么实现的。

从入口开始看起:

window[moduleName].render = function (html, data, callback) {

var path = this.rguid(),
    that = this,
   cache = that._tpls;

if (typeof data === ‘function‘) {
      callback = data, data = {};
    }
    (new Function(renderTools.templete(path, renderTools.precompile(html))))();
    typeof callback === ‘function‘ && typeof cache[path] === ‘object‘ && typeof cache[path].main === ‘function‘ && callback.call(that, cache[path].main(data));
    return that;
  };

先看底下,如果有callback,以及模版缓存会给你一个对象,并且这个对象的main方法是个函数,其实我们解析出来正确的结果就是这个样子的。就调用来callback方法,传递给nodetpl对象,以及模版main方法渲染后的片段

再看如何生成对应的模版缓存对象。通过new Function方法。具体再看里面的renderTools.templete方法。

这个方法干什么用的,代码如下:

templete: function (path, tpl) {
        var html = "",
          tpls = [];

    ..........
        html += "(function(N, undefined){\n";
        html += "  var PATH = ‘" + path + "‘;\n";
        html += "  if(!N || !N._tpls) return false;\n";
        html += "  N._tpls[PATH] = N._tpls[PATH] ||\n{\n";
        html += tpls.join(‘,\n‘);
        html += ‘\n};‘;
        html += "\n})(window.NodeTpl);";
        return html;
      }

传给它的是我们的模版引擎renderid,以及对应的模版内容,里面可能有多个子模版。 然后分别进行解析,这里解析主要是生成方法,文件中的css,js,html处理都在precompile中完成了。最终返回的就是我们的js文件。

这个path最终怎么成路径,目前还没看出来。

这个tpl传进去的就已经是预编译之后的来,调用来precompile方法,里面又用到compile方法。主要就是对css,js, html都做来处理,算是主要内容。这个主要内容大体就是正则替换

艾马,这么一边写边分析,果然比直接看代码容易理解多了

时间: 2024-10-31 09:40:03

js模版引擎—nodetpl的相关文章

js模版引擎handlebars.js实用教程

一.为什么选择Handlebars.js 据小菜了解,对于java开发,涉及到页面展示时,比较主流的有两种解决方案: 1. struts2+vo+el表达式. 这种方式,重点不在于struts2,而是vo和el表达式,其基本思想是:根据页面需要的信息,构造出一个实体,这个实体中包含了界面需要的所有属性,通常这个实体是由N个表中的字段构成的,俗称vo.由于vo的属性可以是String.List.Map等等等,又可以vo套vo,因此这种方式非常灵活,也非常好用. 在后台对vo进行赋值,通过strut

js模版引擎开发实战以及对eval函数的改进

简介 前段时间,想着自己写一个简单的模版引擎,便于自己平时开发demo时使用,同时也算是之前学习的知识的一种总结吧! 首先我们先了解一下模版引擎的工作原理吧! 1. 模版引擎其实就是将指定标签的内容根据固定规则,解析为可执行语句字符串: 2. 执行可执行解析后的语句字符串,即生成我们想要的页面结构. 具体实现方法: 1. 最终效果 1 /* 解析前 2 <ul> 3 {{for(var i = 0; i < data.todos.length; ++i)}} 4 {{if(data.to

handlebars.js模版引擎随记

前台的模版引擎有许多种,相比较而言 我个人更觉得handlebars更为轻便 首先github上下载自新版本的handelbars.js http://handlebarsjs.com 下载下来之后呢 我们需要在页面引入js 1 <script type="text/javascript" src="script/jquery.js"></script> 2 <script type="text/javascript"

使用localstorage及js模版引擎 开发 m站设想

目前 m站开发的方式,依然请求完整的html,这样造成的问题就是每次请求的数据量过大过多,在没有wifi的情况下,导致页面打开的速度很慢,耗费的流量也较多:访问m站的多是移动端设备,其浏览器的版本都较高,所以其html5属性localstorage支持性也较好,并且m站页面较为简单,结构性较好,如果使用localstorage+js解析模版+json数据的方式来实现m的结构,其访问速度应该会大幅度提升. 具体实现方式如下: 1.把页面的html节点存储在localstorage中,因为m站结构简

为什么要使用JS模板引擎

我之前在写一个输入联想控件的时候,改过好几个版本,每个版本不是因为性能不好就是因为代码凌乱而被推翻,最后用了understore模板引擎,效果有明显改善.整好这两天在研究互联网技术架构,发现很多的开发框架前端都是使用js模板引擎,感悟真的是大道至简,殊途同归啊,哈哈. 关于为什么使用js模板引擎,在博客园发现园友的一片文章<js模版引擎handlebars.js实用教程——为什么选择Handlebars.js>,该文已经做了详细解答.下面内容转自该文: 据小菜了解,对于java开发,涉及到页面

如何在前端模版引擎开发中避免使用eval函数

前段时间,想着自己写一个简单的模版引擎,便于自己平时开发demo时使用.于是根据自己对模版引擎的理解,定义自己的模版格式,然后,根据自己定义的格式,编写处理函数,将模版标签中的字符串,解析成可执行的字符串,然后再用eval函数执行该可执行的字符串. 然后问题就出现了!eval等价于evil! 为什么呢?各大js权威书籍上都不提倡使用eval.下面我详细的解释一下为什么不提倡. 首先,大家需要知道,js并不是一门解释型语言.它和其他大家熟知的编程语言(c,java,c++)一样,是编译型语言.但是

doT.js 模板引擎的使用

模版引擎之前在介绍mustache时已经提到了.doT.mustache各有优势吧,如果用于JS环境,doT的性能更胜一筹,并且套语句更方便些.现在公司的mobile页面已经被我替换成doT了. doT source: https://github.com/olado/doTDocs: http://olado.github.com/doT/ doT上手比较容易,但之前熟悉了mustache,改用doT时有点不习惯,但用两次就好了. 下载doT.js(里面有个doU.js不要用,doU.js是为

Express模版引擎hbs备忘

最近几天折腾了下express,想找个合适的模版引擎,下面是一些折腾过程的备忘 选择标准 选择一门模版语言时,可能会考虑的几点 语法友好(micro tmpl那种语法真是够了) 支持模版嵌套(子模版的概念) 支持模版继承(extend) 前后端共用 有容错处理(最好定位到具体出错位置) 支持预编译(性能好) 注意到hbs,似乎满足大部分的需求:https://github.com/donpark/hbs getting started demo地址:https://github.com/chyi

Symfony2模版引擎使用说明手册

一.基本使用 {{ demo }}输出一个demo变量; {{% func %}}通常是包含一个twig函数例如 for; 举个for循环的例子: {{% for i in 0..10 %}} <em>{{ i }}</em> {{% endfor %}} 当然也可以打印对象,例: {{% for user in users %}} <span>user.username</span> {{% endfor %}} 注:users是从控制器中传来的对象参数