前端开发--art-template模板引擎及实现原理

article/2025/11/9 16:27:27

#博学谷IT学习技术支持#

目录

简介

安装

使用步骤

​编辑 

art-template标准语法

值输出

原文输出

条件输出

 循环输出

 过滤器

模板引擎的实现原理

1.基本语法

2.分组

3.字符串的replace函数

4.多次replace

5.使用while循环replace

6.replace替换为真值

实现简易的模板引擎

1. 实现步骤

2. 定义模板结构

3. 预调用模板引擎

4. 封装template函数

5. 导入并使用自定义的模板引擎


简介

art-template 是一个简约、超快的模板引擎。
它采用作用域预声明的技术来优化模板渲染速度,从而获得接近 JavaScript 极限的运行性能,并且同时支持 NodeJS 和浏览器。

安装

在浏览器中访问 安装 - art-template (aui.github.io) 页面,找到下载链接后,鼠标右键, 选择“ 链接另存为 ”,将 art-template 下载到本地,然后,通过 <script> 标签加载到网页上进行使用。

使用步骤

① 导入 art-template
② 定义数据
③ 定义模板
④ 调用 template 函数
⑤ 渲染HTML结构
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><!-- 引入template-web.js --><script src="./node_modules/art-template/lib/template-web.js"></script>
</head>
<body><div id="container"></div><!-- 创建 script 标签创建模板,注意下面几点 --><!-- 1. type="text/该斜杠后可以是 html,template... 不是script即可)" --><!-- 2. 给 script 标签添加 id ,此 id 即为模板 id --><!-- 3.模板 script 标签必须在 template() 方法调用的 script 标签之前 --><script type="text/html" id="tpl">{{if user}}<h2>{{user.name}}</h2>{{/if}}</script><script>// 定义需要渲染的数据var user = {name: 'Template username'}var html = template('tpl', {user: user})var container = document.querySelector('#container');// 渲染HTML结构container.innerHTML = html;</script>
</body>
</html>

art-template标准语法

值输出

<script type="text/html" id="tpl-user"><h1>姓名:{{name}}  年龄:{{age}}</h1></script>var data = { name: '张三', age: 20}

在 {{ }} 语法中,可以进行变量的输出、对象属性的输出、三元表达式输出、逻辑或输出、加减乘除等表达式输出。

例如:

{{value}}

{{obj.key}}
{{obj['key']}}
{{a ? b : c}}
{{a || b}}
{{a + b}}

原文输出

<script type="text/html" id="tpl-user">{{@ test}}</script>var data = {test:'<h3>测试原文输出</h3>'}

如果要输出的 value 值中,包含了 HTML 标签结构,则需要使用 原文输出 语法,才能保证 HTML 标签被正常渲染。

条件输出

如果要实现条件输出,则可以在 {{ }} 中使用 if else if /if 的方式,进行按需输出。

<script type="text/html" id="tpl-user"><div>{{if flag === 0}} flag的值是0{{else if flag === 1}}flag的值是1{{/if}}</div></script>var data = {flag: 1}

 循环输出

如果要实现循环输出,则可以在 {{ }} 内,通过 each 语法循环数组,当前循环的索引使用 $index 进行访问, 当前的循环项使用 $value 进行访问

<script type="text/html" id="tpl-user"><ul>{{each hobby}}<li>索引是:{{$index}},循环项是:{{$value}}</li>{{/each}}</ul></script>var data = { hobby: ['吃饭', '睡觉', '写代码']}

 过滤器

{{value | filterName}}
过滤器语法类似 管道操作符 ,它的上一个输出作为下一个输入。
定义过滤器的基本语法如下:
template.defaults.imports.filterName = function(value){/*return处理的结果*/}
定义一个格式化时间的过滤器 dateFormat 如下:
<script type="text/html" id="tpl-user">
<div>注册时间:{{regTime | dateFormat}}</div></script>// 定义处理时间的过滤器template.defaults.imports.dateFormat = function (date) {var y = date.getFullYear()var m = date.getMonth() + 1var d = date.getDate()return y + '-' + m + '-' + d}

模板引擎的实现原理

1.基本语法

exec() 函数用于 检索字符串 中的正则表达式的匹配。
如果字符串中有匹配的值, 则返回该匹配值 ,否则返回 null
RegExpObject.exec(string)
示例代码如下:

var str = 'hello' var pattern = /o/ console.log(pattern.exec(str))// 输出的结果["o", index: 4, input: "hello", groups: undefined] 

2.分组

正则表达式中 ( ) 包起来的内容表示一个分组,可以通过分组来 提取自己想要的内容 ,示例代码如下:
var str = '<div>我是{{name}}</div>' 
var pattern = /{{([a-zA-Z]+)}}/ 
var patternResult = pattern.exec(str) 
console.log(patternResult) 
// 得到 name 相关的分组信息 
// ["{{name}}", "name", index: 7, input: "<div>我是{{name}}</div>",

3.字符串的replace函数

replace() 函数用于在字符串中 用一些字符 替换 另一些字符 ,语法格式如下:
var result = '123456'.replace('123', 'abc') 
// 得到的 result 的值为字符串 'abc456'
示例代码如下:
var str = '<div>我是{{name}}</div>' 
var pattern = /{{([a-zA-Z]+)}}/ 
var patternResult = pattern.exec(str) 
str = str.replace(patternResult[0], patternResult[1]) 
// replace 函数返回值为替换后的新字符串 
// 输出的内容是:<div>我是name</div> console.log(str)

4.多次replace

var str = '<div>{{name}}今年{{ age }}岁了</div>' 
var pattern = /{{\s*([a-zA-Z]+)\s*}}/ 
var patternResult = pattern.exec(str) 
str = str.replace(patternResult[0], patternResult[1]) 
console.log(str) // 输出 <div>name今年{{ age }}岁了</div> patternResult = pattern.exec(str) 
str = str.replace(patternResult[0], patternResult[1]) 
console.log(str) // 输出 <div>name今年age岁了</div> //多次替换直到输出null,表示没有要替换的了
patternResult = pattern.exec(str) c
onsole.log(patternResult) // 输出 null

5.使用while循环replace

var str = '<div>{{name}}今年{{ age }}岁了</div>' 
var pattern = /{{\s*([a-zA-Z]+)\s*}}/ var patternResult = null 
while(patternResult = pattern.exec(str)) { 
str = str.replace(patternResult[0], patternResult[1]) 
}
console.log(str) // 输出 <div>name今年age岁了</div>

6.replace替换为真值

var data = { 
name: '张三', age: 20 
} var str = '<div>{{name}}今年{{ age }}岁了</div>' 
var pattern = /{{\s*([a-zA-Z]+)\s*}}/ var patternResult = null 
while ((patternResult = pattern.exec(str))) {
str = str.replace(patternResult[0], data[patternResult[1]]) 
}console.log(str)
// <div>张三今年20岁了</div>

实现简易的模板引擎

1. 实现步骤

① 定义模板结构
② 预调用模板引擎
③ 封装 template 函数
④ 导入并使用自定义的模板引擎

2. 定义模板结构

<!-- 定义模板结构 --> 
<script type="text/html" id="tpl-user"> 
<div>姓名:{{name}}</div> 
<div>年龄:{{ age }}</div> 
<div>性别:{{ gender}}</div> 
<div>住址:{{address }}</div> 
</script>

3. 预调用模板引擎

<script> 
// 定义数据 
var data = { 
name: 'zs', 
age: 28, 
gender: '男', 
address: '北京顺义马坡' } 
// 调用模板函数 
var htmlStr = template('tpl-user', data) 
// 渲染HTML结构 
document.getElementById('user-box').innerHTML = htmlStr 
</script>

4. 封装template函数

 function template(id, data) {let str = document.getElementById(id).innerHTML;const reg = /{{\s*([a-zA-z]+)\s*}}/;let result = null;while (result = reg.exec(str)) {str = str.replace(result[0], data[result[1]])}return str;}

5. 导入并使用自定义的模板引擎

<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><!-- 导入自定义的模板引擎 --><script src="./js/template.js"></script>
</head>

http://chatgpt.dhexx.cn/article/0uJ1IT0C.shtml

相关文章

template.js——前端模板引擎

1. 什么情况下推荐使用template.js (1)在你的页面布局中存在一样的模块,可以提出公共的模块,便于维护 注:此处用到循环来减少工作量 对应代

jquery template.js前端模板引擎

1、加载模板引擎js&#xff08;jquery.tmpl.js&#xff09; 可下载链接&#xff1a;https://github.com/BorisMoore/jquery-tmpl 2、直接上代码 <script type"text/javascript" src"${ctxStatic}/web/js/jquery.tmpl.js"></script> <!--…

java 前端模板_前端模板引擎入门

模板引擎 模板引擎 起到 数据和视图分离的作用&#xff0c; 模板对应视图&#xff0c; 关注如何展示数据&#xff0c; 在模板外头准备的数据&#xff0c; 关注那些数据可以被展示。 后端模板引擎 freemarker 如下介绍&#xff0c; java后台的模板引擎&#xff0c; freemark介绍…

art-template前端模板引擎

目录 内容介绍一、使用方法二、主要API1、原文输出2、逻辑判断3、循环语句 三、代码四、页面显示五、其他1、pre标签2、code标签 内容介绍 今天我们要了解的是一款高性能的 art-template 前端模板引擎 —— template-web.js。 一、使用方法 定义容器元素通过type"text/…

前端模板引擎——handlebars

目录 一、代码二、页面显示 一、代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>handlebars 前…

ESLINT错误提示 no-unused-vars

ESLINT错误提示 no-unused-vars 使用ESLINT时遇到如下错误的提示 查阅资料得知&#xff0c;是需要使用插件 https://github.com/typescript-eslint/typescript-eslint/issues/941 全局按照 eslint-plugin-react npm install eslint-plugin-react -g 修改eslint的配置项 "e…

Jmeter书中不会教你的(2)——vars.get和${}引用区别

在上一篇中&#xff0c;我们了解了在beanshell中可以利用vars获取和设置新的变量&#xff0c;也知道了如何用log去查看日志&#xff0c;以及两种获取变量值的方法。没看过的可以点这里Jmeter书本中不会教你的&#xff08;1&#xff09;——beanshell用来获取变量和设置变量的va…

【Python报错-01】解决matplotlib在Pycharm中运行报错:vars()参数必须有__dict__属性

1 运行错误 &#xff08;1&#xff09;程序的原代码如下图所示&#xff1a; import matplotlib.pyplot as plt # 是可视化绘图工具 …… #省略了计算SSE的代码 plt.plot(range(1, 11), SSE) plt.xlabel("聚类数k", fontsize12) plt.ylabel("误差平方和SSE&…

Jmeter书中不会教你的(1)——beanshell用来获取变量和设置变量的vars

这几年Jmeter用的相对比较多&#xff0c;自己每次在做项目时也常会去翻看以前遇到的问题&#xff0c;记录的一些技巧&#xff0c;解决方案&#xff0c;也一直考虑把它整理出来&#xff0c;一来方便自己查找&#xff0c;二来也希望同行可以互相切磋。我写的这些文章不是针对Jmet…

eslint 配置no-unused-vars规则,TypeScript接口抛出“ no-unused-vars”报错

1.项目使用了typescript&#xff0c;并在.eslintrc.js中使用该配置&#xff0c;type类型接口形参检测报错 no-unused-vars: 检测未使用的变量&#xff0c;函数和函数的参数 type类型接口如下&#xff1a; 报错如下&#xff1a; 2.解决 将 “no-unused-vars” 替换成 “typesc…

mmdetection报错 TypeError: vars() argument must have __dict__ attribute

下载官方代码&#xff0c;安装好环境后第一个demo就报错 报错1、error: the following arguments are required: img, config, checkpoint 添加-- 报错2、manager_pyplot_show vars(manager_class).get("pyplot_show")TypeError: vars() argument must have __dict_…

Pycharm使用matplotlib报错:TypeError: vars() argument must have __dict__ attribute 解决方法

Pycharm使用matplotlib绘图时报错 问题描述 TypeError: vars() argument must have __dict__ attribute源程序&#xff1a; # -*- encoding: utf-8 -*-File : MaLearnTest01_1.py Time : 2023/03/03 09:39:05 Author : seveN1foR Version : 1.0 Contact : s…

JMeter常用内置对象:vars、ctx、prev

在前文 Beanshell Sampler 与 Beanshell 断言 中&#xff0c;初步阐述了JMeter beanshell的使用&#xff0c;接下来归集整理了JMeter beanshell 中常用的内置对象及其使用。 注&#xff1a;示例使用JMeter版本为5.1 1 vars 如 API 文档 所言&#xff0c;这是定义变量的类&am…

jmeter内置变量 vars 和props使用详解

vars和props都是jmeter的内置变量&#xff0c;且本质都是Map类型 用python语言来理解的话&#xff0c;就是字典格式 最主要两点的区别&#xff1a; vars 只能在当前线程组内使用&#xff0c;props 可以跨线程组使用 vars 只能保持String 或者Objec&#xff0c; props 是 Hash…

Ansible中vars(变量)定义

1、变量使用的原因 playbook的编写是使用yml的语法&#xff0c;虽然该语法规则较为简单&#xff0c;但是&#xff0c;同其他语法相同该语法也有变量、循环等机制的使用。变量的使用就是为了提高我们所写剧本的复用性&#xff08;当某个参数更改时&#xff0c;直接更改变量的赋…

vue3解决no-unused-vars报错

vue3解决no-unused-vars 前言添加配置 前言 在上一节&#xff0c;针对 vue3配置了ESLint&#xff0c;此时&#xff0c;App.vue 和 HelloWorld.vue 报了一个 no-unused-vars 的错误。 添加配置 vue3 是尤大写的&#xff0c;参考下尤大的配置&#xff1a;.eslintrc.js {no-u…

Jmeter内置变量vars和props

在使用jmeter作接口测试时&#xff0c;有些参数并不是明文直接传递的&#xff0c;须编码或加密后传输。此时可以使用BeanShell取样器、BeanShell前置和后置处理器等对参数进行加工处理。 vars和props都是jmeter的内置变量&#xff0c;不必先定义&#xff0c;可以直接使用 二者…

Jmeter 的 vars 和 props 用法

Jmeter 的 JSR223 控件是 代替 BeanShell 的新一代脚本控件&#xff0c;支持多种脚本语言&#xff0c;尤其是其中的 Groovy&#xff0c;更是重点推荐使用的脚本语言&#xff0c;本文研究其中的 vars 和 props 两种对象的用法。 props 和 vars 主要有两点区别&#xff1a; vars…

optistruct中的DRESP2响应设置

1.先编写自己的函数公式 函数名后面的括号中要有式中包含的变量 2.定义响应&#xff0c;类型选择为function&#xff0c;dequation选择刚才设置的函数 点击edit&#xff0c;输入函数表达式中变量对应的响应个数&#xff0c;并分别选择对应哪个响应 返回&#xff0c;点击cr…

结构优化设计with OPtiStruct

上手OptiStruct做结构优化设计&#xff0c;借助该软件强大的优化运算功能&#xff0c;已经成为行业的主流结构优化工具。因此&#xff0c;决定整理一下简要的操作步骤&#xff0c;以备后继之需。 我目前使用的是Hyper13.0版本。 首先是通过hypermesh进行网格划分&#xff0c;其…