现在前后端分离应用越来越广泛了,后端将数据以 JSON 方式传递给Javascript ,前端通过渲染模板完成界面输出。
介于传统拼接字符串非常难以维护,JS 模板引擎因此越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的 js 模板引擎。
那么 QueryPHP 提供与上述的模板引擎有何不同呢,区别那是相当地大,QueryPHP 放弃了 Javascript 本身作为模板引擎编译,而是采用 PHP 输出一个拼接字符串,然后根据这个字符串简单地处理一下输出到浏览器端。
1:HTML 模板中标记:
~~~
<script id="queryphp-js" type="text/html">
{{if condition="money > 5"}}
Thank U ! You {{goods}} is here !
{{/if}}
</script>
~~~
2:PHP 编译成 JS :
~~~
<script id="queryphp-js" type="text/html">
';
if( (money > 5) ) {
out += '
Thank U ! You ' + (goods) + ' is here !
';
}
out += '
</script>
~~~
注意:这是 PHP 编译后的js,这个代码左看右看挺别扭,而且肯定无法运行,这个时候 JS 是时候出场。
3:JS 模板引擎
~~~
/**
* JS 模板引擎
*
* @param string
* id ID、jquery对象或者DOM
* @param object
* $data 数据
* @returns
*/
template : function(id, $data) {
"use strict";
var str = 'var ', temp = [], out = '';
// 变量赋值
for ( var k in $data) {
temp.push(k + " = $data['" + k + "']");
}
str += temp.join(", ") + ";\n";
// 模板内容
if (typeof id == 'string') {
id = $('#' + id);
} else if (!(id instanceof jQuery)) {
id = $(id);
}
str += "out += '" + id.html() + "';";
// 去掉空格和回车换行
str = str.replace(/\s+/g, ' ') // 去掉多个空格
.replace(/[\r\n]/g, ""); // 去掉回车换行
// 调试语句
str = "try { "
+ str
+ "} catch ( e ) {"
+ "out = '<font color=\"red\">template error, see console</font>';"
+ "console.log('%c Query Yet Simple','color:gray;');"
+ "console.log('%c '+e.code + ': ' + e.message,'color:red;');"
+ "}";
// 执行编译
eval(str);
return out;
}
~~~
完整过程:将 $data 数据分解到变量中去,补全字符串,去掉空格和回车,eval 一下执行。
4:测试一下
~~~
<div id="queryphp-content"></div>
<script type="text/javascript">
$(function(){
var data = {
money : 10,
goods : '苹果'
};
var html = $.fn.queryphp('template','queryphp-js', data);
document.getElementById('queryphp-content').innerHTML = html;
});
</script>
~~~
注意:这个模板引擎已经被打包到 jquery.queryphp.js 中,所以这里用法为 $.fn.queryphp 这样子,后面会单独介绍,这里只做一些原理讲解。
浏览器得到如下结果:
![](https://box.kancloud.cn/02ed7956bd461e62c93771a79b2bd7a6_615x288.png)
模板引擎编译的 EVAL 打印如来如下:
~~~
try {
var money = $data['money']
, goods = $data['goods'];
out += ' ';
if ((money > 5) ) {
out += ' Thank U ! You ' + (goods) + ' is here ! ';
}
out += ' ';
} catch (e) {
out = '<font color="red">template error, see console</font>';
console.log('%c Query Yet Simple', 'color:gray;');
console.log('%c ' + e.code + ': ' + e.message, 'color:red;');
}
~~~
部分 PHP 编译器如下:
~~~
/**
* Javascript 编译器
*
* 采用 Node 编译器核心
*/
// 变量及表达式
public function jsvarCompiler(&$arrTemplate) {
$arrTemplate ['content'] = "' + " . $this->parseJsContent_ ( $arrTemplate ['content'] ) . " + '";
}
// if 编译器
public function ifJsCompiler(&$arrTemplate) {
$this->checkNode_ ( $arrTemplate, true );
$arrAttr = $this->getNodeAttribute_ ( $arrTemplate );
$arrAttr ['condition'] = $this->parseJsContent_ ( $arrAttr ['condition'] );
$sCompiled = "';
if( {$arrAttr['condition']} ) {
out += '" . $this->getNodeBody ( $arrTemplate ) . "';
}
out += '";
$arrTemplate ['content'] = $sCompiled;
}
~~~
OK 了,这里就是采用 PHP 和 Javascript 结合开发出来的模板引擎,比较适合特定 PHP 框架预编译模板的场景。
> 优点:不需要 Javascript 编译,只需要简单处理一下拼接字符串就 OK,运行速度快。
缺点:与 PHP 绑定了,只有在某个框架下面,而且必须使用该框架提供的模板引擎。
- 关于 QueryPHP
- 获取 QueryPHP
- 环境要求
- 许可协议 Free
- 执行流程 MVC
- 命名规范 $sName
- 目录结构 DIR
- 单一入口 index.php
- 响应客户端请求 URL
- 命名空间与自动载入 Autoload
- 路由
- 路由导入
- 批量导入
- 参数正则
- 分组定义
- 路由绑定
- 路由域名
- 分层控制器
- 默认和初始化APP
- 默认控制器和方法
- url 模式
- url 生成
- url 伪静态
- url 重写
- url 重定向
- 控制器绑定
- 方法器分层
- 控制器 __init
- 控制器方法交互
- 模板引擎语法
- C变量输出 $sName
- C变量支持函数和方法 $sName|trim
- C快捷输出 ~
- C标签简化 Css & Javascript
- C默认值 eq 三元运算符
- C变量运算符 +-
- 变量递增递减 ++--
- C循环数据 list
- N变量赋值 assign
- N循环数据 list
- N循环数据高级版 lists
- C循环数据 while
- N循环数据 while
- C循环数据 for
- N循环数据 for
- C条件判断 if
- N条件判断 if
- 标签嵌套无限层级
- N循环流程 break & continue
- N使用 PHP 代码
- N包含子模板 include
- J模板引擎 intro
- J条件判断 if
- J循环数据 each
- J变量 & 表达式
- J变量支持函数和方法 hello|test
- J默认值 eq 三元运算符
- J框架前端组件 jquery.queryphp.js
- J前端 CSS 规范
- J前端 JS 规范
- 保护标签自身 tagself
- 数据库
- 数据库配置
- 执行原生 sql 语句
- 数据库事务
- 数据库构造器 prefix
- 数据库构造器 table
- 数据库构造器 forceIndex
- 数据库构造器 where
- 数据库构造器 bind
- 数据库构造器 join
- 数据库构造器 union
- 数据库构造器 orderBy
- 数据库构造器 groupBy
- 数据库构造器 having
- 数据库构造器 distinct
- 数据库构造器 aggregate
- 数据库构造器 limit
- 数据库构造器 forUpdate
- 数据库构造器 columns
- 数据库构造器 reset
- 数据库集合查询
- 数据库查询数据 get
- 数据库查询多条数据 getAll
- 数据库查询单条数据 getOne
- 数据库查询聚合查询 aggregate
- 数据库写入数据 insert
- 数据库写入数据 insertAll
- 配置
- 配置格式
- 惯性配置
- 配置文件
- 读取配置
- 设置配置
- 删除配置
- 日志
- 日志配置参数
- 日志路径
- 日志过滤器
- 日志处理器
- 缓存
- 缓存配置参数
- 缓存路径
- 缓存指定时间
- COOKIE
- COOKIE 配置参数
- 开发调试
- 页面 trace