前端模板预编译技术

什么是前端模板预编译

前端模板预编译通过预编译技术让前端模板突破浏览器限制,实现后端模板一样的同步“文件”加载能力。它采用目录来组织维护前端模板,从而让前端模板实现工程化管理,最终保证前端模板在复杂单页 web 应用下的可维护性。同时预编译输出的代码经过多层优化,能够在最大程度节省客户端资源消耗。

按文件与目录组织模板

template('tpl/home/main', data)

模板支持引入子模板

{{include '../public/header'}}

  

TmodJS 一经启动,就无需人工干预,每次模板创建与更新都会自动编译,引入一个 js 即可使用template(path)接口调用本地模板文件,直到正式上线都无需对代码进行任何修改,整个过程简单自然。

强大之处

  1. 编译模板为不依赖引擎的 js 文件
  2. 前端模板按文件与目录组织
  3. 模板之间支持引入外部模板
  4. 使用同步模板加载接口
  5. 可选多种规范的模块输出:AMD、CMD、CommonJS
  6. 支持作为 GruntJS 的插件构建项目
  7. 模板目录可被前后端共享
  8. 支持检测修改即时编译
  9. 支持模板运行时调试
  10. 配置文件支持多人共享

使用tmodJS

全局安装

npm install -g tmodjs

编写模板

TmodJS 的前端模板不再耦合在业务页面中,而是和后端模板一样有专门的目录管理。目录名称只支持英文、数字、下划线的组合,一个模板对应一个.html文件。

模板语法

和artTemplate一脉相承,建议协同使用。

表达式

{{ 与 }} 符号包裹起来的语句则为模板的逻辑表达式。

输出表达式

对内容编码输出:

{{content}}

不编码输出(编码可以防止数据中含有 HTML 字符串,避免引起 XSS 攻击)

{{#content}}

条件表达式

{{if admin}}<p>admin</p>
{{else if code > 0}}<p>master</p>
{{else}}<p>error!</p>
{{/if}}

遍历表达式

无论数组或者对象都可以用 each 进行遍历。

{{each list as value index}}<li>{{index}} - {{value.user}}</li>
{{/each}}

亦可以被简写:

{{each list}}<li>{{$index}} - {{$value.user}}</li>
{{/each}}

模板包含表达式

用于嵌入子模板:

{{include 'template_name'}}

子模板默认共享当前数据,亦可以指定数据:

{{include 'template_name' news_list}}

include 路径规范约定

  1. 路径不能带后缀名
  2. 路径不能够进行字符串运算
  3. 路径不能使用变量代替
  4. 必须使用以.开头的相对路径

辅助方法

{{time | dateFormat:'yyyy-MM-dd hh:mm:ss'}}

支持传入参数与嵌套使用:

{{time | say:'cd' | ubb | link}}

为了模板可维护,模板本身是不能随意访问外部数据的,它所有的语句都将运行在一个沙箱中。如果需要访问外部对象可以注册辅助方法,这样所有的模板都能访问它们。

新建一个辅助方法文件配置 
在模板目录新建一个 config/template-helper.js 文件,然后编辑 package.json 设置”helpers”: “./config/template-helper.js”。

编写辅助方法 
在 config/template-helper.js 中声明辅助方法。

以日期格式化为例:

template.helper('dateFormat', function (date, format) {date = new Date(date);var map = {"M": date.getMonth() + 1, //月份 "d": date.getDate(), //日 "h": date.getHours(), //小时 "m": date.getMinutes(), //分 "s": date.getSeconds(), //秒 "q": Math.floor((date.getMonth() + 3) / 3), //季度 "S": date.getMilliseconds() //毫秒 };format = format.replace(/([yMdhmsqS])+/g, function(all, t){var v = map[t];if(v !== undefined){if(all.length > 1){v = '0' + v;v = v.substr(v.length-2);}return v;}else if(t === 'y'){return (date.getFullYear() + '').substr(4 - all.length);}return all;});return format;
});

调用:

{{time | dateFormat:'yyyy-MM-dd hh:mm:ss'}}

编译模板

只需要运行tmod这个命令即可,默认配置参数可以满足绝大多数项目。

tmod [模板目录] [配置参数]

注意:模板目录必须是模板的根目录,若无参数则为默认使用当前工作目录,tmodjs 会监控模板目录修改,每次模板修改都会增量编译。

配置参数

  • --debug 输出调试版本
  • --charset value 定义模板编码,默认utf-8
  • --output value 定义输出目录,默认./build
  • --type value 定义输出模块格式,默认default,可选cmdamdcommonjs
  • --no-watch 关闭模板目录监控
  • --version 显示版本号
  • --help 显示帮助信息

注意:配置参数将会保存在模板目录配置文件中,下次运行无需输入配置参数(–no-watch 与 –debug 除外)。

举个例子

tmod ./tpl --output ./build

使用模板

根据编译的 type 的配置不同,会有两种不同使用方式:

使用默认的格式

TmodJS 默认将整个目录的模板压缩打包到一个名为 template.js 的脚本中,可直接在页面中使用它:

<script src="tpl/build/template.js"></script>
<script>var html = template('news/list', _list);document.getElementById('list').innerHTML = html;
</script>

RequireJS、SeaJS、NodeJS 加载 在线实例 http://aui.github.io/tmodjs/test/index.html

指定格式(amd / cmd / commonjs)

此时每个模板就是一个单独的模块,无需引用 template.js:

var render = require('./tpl/build/news/list');
var html = render(_list);

注意:模板路径不能包含模板后缀名

演示

TmodJS 源码包中test/tpl是一个演示项目的前端模板目录,基于默认配置。切换到源码目录后,编译:

tmod test/tpl

编译完毕后你可以在浏览器中打开 test/index.html 查看如何使用编译后的模板。

配置

TmodJS 的项目配置文件保存在模板目录的 package.json 文件中:

{"name": "template","version": "1.0.0","dependencies": {"tmodjs": "1.0.0"},"tmodjs-config": {"output": "./build","charset": "utf-8","syntax": "simple","helpers": null,"escape": true,"compress": true,"type": "default","runtime": "template.js","combo": true,"minify": true,"cache": false}
}

这里写图片描述

gulp配置

让 TmodJS 作为 Gulp 的一个插件使用:

npm install gulp-tmod --save-dev

由@lichunqiang开发,项目主页:https://github.com/lichunqiang/gulp-tmod

常见Q&A

问:TmodJS 需要部署到服务器中吗?

不需要,这是本地工具,基于 NodeJS 编写是为了实现跨平台。

问:如何将每个模板都编译成单独的 amd/cmd 模块输出?

指定 type 参数即可,如–type cmd则可以让每个模板都支持 RequireJS/SeaJS 调用。

问:如何将模板编译成 NodeJS 的模块?

指定 type 参数即可,如–type commonjs。

问:线上运行的模板报错了如何调试?

开启 debug 模式编译,如–debug,这样会输出调试版本,可以让你快速找到模板运行错误的语句以及数据。

问:如何不压缩输出 js?

编辑配置文件,设置”minify”: false。

问:如何修改默认的输出目录?

指定 output 参数即可,如–output ../../build

如何让模板访问全局变量?

具体参考上面的 辅助方法

问:可以使用使用类似 tmpl 那种的 js 原生语法作为模板语法吗?

可以。编辑配置文件,设置”syntax”: “native”即可,目前 TmodJS 默认使用的是 simple 语法。

问:如何兼容旧版本 atc 的项目?

编辑配置文件,分别设置”type”: “cmd”、”syntax”: “native”、”output”: “./”

问:如何迁移原来写在页面中的 artTemplate 模板,改为 TmodJS 这种按按文件存放的方式?

参考 《页面中的模板迁移指南》

问:我需要手动合并模板,如何让 tmodjs 不合并输出?

编辑配置文件,设置combo:false。

转载于:https://www.cnblogs.com/jiaxinjie/p/6185985.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/456699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python如何生成windows可执行的exe文件

打包工具 pyinstaller 安装pyinstaller 如果你的网络稳定&#xff0c;通常直接使用下面的命令安装即可&#xff1a; pip install pyinstaller 当然了&#xff0c;你也可以下载pyinstaller源码包&#xff0c;然后进入包目录执行下面的命令&#xff0c;同样可以安装&#xff…

招商银行信用卡中心华泰证券暑期实习软开笔试小结

白菜自动化小硕一枚&#xff0c;18届&#xff0c;下学期就正式要找工作了&#xff0c;没有实习经验&#xff0c;感觉心慌慌。现在学校里已经开始各种提前招实习&#xff0c;内推了&#xff0c;so暑假想提前试试水&#xff0c;投一投暑期实习。 看到心水的单位就投一投&#xff…

理想的程序猿

出处 | http://guoze.me 最近看到的一篇不错的文章&#xff0c;分享一下。 我算是靠坑蒙拐骗进了程序员的门&#xff0c;然后一路狂奔。26岁之前几乎没有任何写代码的经验&#xff0c;研究生毕业却意外选择了一家不可能提供培训的初创公司&#xff0c;在每日担忧公司倒闭、害…

node08-express

目录&#xff1a;node01-创建服务器 node02-util node03-events node04-buffer node05-fs node06-path node07-http node08-express node09-cookie express模块&#xff1a; 1 /*2 * express是一个应用框架3 * 1、路由4 * 2、中间件5 * 3、模板引擎6 * */7 8 var express requ…

【python】1. 两数之和

给定一个整数数组 nums 和一个目标值 target&#xff0c;请你在该数组中找出和为目标值的那 两个 整数&#xff0c;并返回他们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;你不能重复利用这个数组中同样的元素。 示例: 给定 nums [2, 7, 11, 15], t…

The user specified as a definer (#39;root#39;@#39;%#39;) does not exist

&#xfeff;&#xfeff;通常是因为root用户对全局host无訪问权限。因此仅仅要给root用户加入一个訪问权限就可以。解决的方法&#xff1a; 登陆mysql 。运行 mysql -u root -pPasswd mysql >grant all privileges on *.* to root"%" identified by "Passwd…

Java基础常见笔试题总结

以下是自己总结的一些Java常见的基础知识题&#xff0c;答案仅供参考&#xff0c;如有异议请指出。一直保持更新状态。 1.什么是Java虚拟机&#xff1f;为什么Java被称作是“平台无关的编程语言”&#xff1f; Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编…

ThreadLocal的练习代码

场景: 有三个小孩儿,买了一个变形金刚玩具(Transformer).... 三个小孩都争着玩这个玩具....没有一个人可以玩... 第一种方式:每个人各玩一会.... 第二种方式:再买两个玩具,一个人玩一个. 每个小孩都当成一个线程.三个小孩就有三个线程. Child.java 2 3 import java.util.Random…

nginx+uwsgi部署Django

本篇文章主要介绍了解决nginxuwsgi部署Django的所有问题(小结)&#xff0c;小编觉得挺不错的&#xff0c;现在分享给大家&#xff0c;也给大家做个参考。一起跟随小编过来看看吧 最近&#xff0c;自己暑假写的小项目也算完毕了&#xff0c;想着投放到自己云服务器上&#xff0…

$(document).scrollTop()与$(window).scrollTop()

$(document).scrollTop() 获取垂直滚动的距离 即当前滚动的地方的窗口顶端到整个页面顶端的距离 要获取顶端 只需要获取到scrollTop()0的时候 就是顶端了 要获取底端 只要获取$(document).scrollTop()>(document).height()−(window).height() 就可以知道已经…

各种机器学习开源项目精选TOP30

8800个机器学习开源项目为你精选TOP30&#xff01; 授权自AI科技大本营&#xff08;ID: rgznai100) 本文共图文结合&#xff0c;建议阅读5分钟。 本文为大家带来了30个广受好评的机器学习开源项目。 最近&#xff0c;Mybridge发布了一篇文章&#xff0c;对比了过去一年中机…

Python中is与==的使用区别详解

>>> a 1000 >>> b 1000 >>> print(id(a),id(b)) 2689566689904 2689566688880 >>> a ,b 1000,1000 >>> print(id(a),id(b)) 2689566689968 2689566689968 一行执行的用一个id地址 分行执行用两个地址

解决:Please specify a different SDK name--PyCharm报错

这个问题出现的原因是因为PyCharm中存在相同名字的虚拟环境变量。 本人的出错原因是&#xff0c;一直使用PyCharm的默认设置来建立工程&#xff0c;所以每个工程都建立了自己独立的虚拟环境。 我个人删除了一些工程后&#xff0c;又建立相同名字的工程。所以才会出现存在相同…

Tomcat控制台输出到文件

为什么80%的码农都做不了架构师&#xff1f;>>> 修改startup.bat call "%EXECUTABLE%" start %CMD_LINE_ARGS% 为 call "%EXECUTABLE%" run %CMD_LINE_ARGS% >> ..\logs\test.log 转载于:https://my.oschina.net/cccyb/blog/886047

常见算法详解(原理及代码实现Python版本)

文章目录前言1、冒泡排序2、选择排序3、插入排序4、希尔排序5、快速排序6、归并排序7、二分法查找总结前言 最近复习了下常见的算法&#xff0c;在这里手动再写一遍&#xff0c;权当加深自己的印象。代码实现用的是python3.6版本。 1、冒泡排序 原理&#xff1a; 冒泡排序&a…

解决:pycharm运行程序时在Python console窗口中运行 һ����ң�������1�����

解决&#xff1a;pycharm运行程序时在Python c 问题&#xff1a; 在pycharm中右键点击run运行程序&#xff0c;发现没有打开run窗口运行&#xff0c;而是在Python console窗口中运行的。 解决方法&#xff1a; 打开菜单栏 run->edit configurations&#xff0c; 把下图中的…

Autowire异常

Autowire异常主要由三个情况发生的 1. 你的ServiceImpl必须以Service或Component注解才行。 2. 自动写入的时候把接口写成实现类了&#xff0c;例如 Autowired private BrandServiceImpl brandServiceImpl; 应该是 Autowired private BrandService brandService; 3. 在Dao 类上…

[转载] 全方位提升网站打开速度:前端、后端、新的技术

原文地址&#xff1a;Building a Shop with Sub-Second Page Loads: Lessons Learned原文作者&#xff1a;Erik Witt译文出自&#xff1a;掘金翻译计划译者&#xff1a;luoyaqifei校对者&#xff1a;Romeo0906&#xff0c;L9m全方位提升网站打开速度&#xff1a;前端、后端、新…

20个顶级大数据软件应用程序

目录1. Domo2. Teradata Database3. Hitachi Vantara4. TIBCO公司的Statistica5. Panoply6. IBM Watson Analytics7. SAS Visual Analytics8. Sisense商业智能软件9. Talend的大数据工作室10. Cloudera11. MongoDB12. Vertica Analytics Platform13. SAP Vora14. Oracle Big Da…

python完成‘21点游戏’

完成‘21点游戏’ 人机对战&#xff1a; 输入玩家姓名&#xff1a;玩家可以多次要牌&#xff0c;其中JQK&#xff0c;大小王是半点&#xff0c;其他是正常点数&#xff0c;玩家每要一次牌就打印下当前点数和系统点数。可以设置系统&#xff1a;只要大于等于21点就不要牌了&am…