首页 > 其他分享 >js模板引擎1--制定规则

js模板引擎1--制定规则

时间:2023-08-30 17:12:34浏览次数:38  
标签:-- js 语法 引擎 规则 字符串 模板

本系列文章是学习art-templatetemplate.js的总结。

js模板引擎的用法大致如下:

  1. 模板
<ul id="list"></ul>
<script id="test" type="text/template">
    <% for(var i = 0; i < list.length; i++) { %>
        <li><%=list[i].title %></li>
    <% } %>
</script>
  1. js代码
var data = {
    list: [
        {title: 'One'},
        {title: 'Two'},
        {title: 'Three'}
    ]
};
var listHtml = template('test',data);
document.getElementById('list').innerHTML = listHtml;

上面例子中的

<% for(var i = 0; i < list.length; i++) { %>
    <%=list[i].title %>
<% } %>

就是模板语法规则。

约定:

  • 变量渲染使用 <%=变量名称%> 语法;
  • 条件判断使用 <% if(expr) { %> <% } %>js语法;
  • 列表渲染使用 <% for(var i = 0; i < expr; i++) { %> <% } %> js语法;
  • 模板注释使用 <%# %>;

观察模板字符串,以及经过模板引擎处理后输出的结果,可以发现如下规律:

  1. 模板字符串中的html标签被原封不动的输出了;
  2. 模板语法语句被当做js代码执行了;

鉴于此,模板引擎需要完成一下工作:

  1. 识别出模板字符串中的非语法规则部分,标记为字符串;
  2. 识别出模板字符串中的语法规则部分,转换为js代码;
  3. 将前两步得到的结果拼接为可执行的js代码,并注入模板数据;

在制定模板语法规则时,使用了特殊字符标记了语法规则部分,所以使用正则表达式就能很容易地找到模板字符串中的语法规则部分和非语法规则部分。

语法规则部分本来使用的就是js的语法,可以直接作为js代码使用。

关键是最终如何构造可执行的js代码和模板数据的绑定。

下面我们开始一步步的实现一个js模板引擎,来看一看其中的奥秘。

标签:--,js,语法,引擎,规则,字符串,模板
From: https://www.cnblogs.com/fogwind/p/17667739.html

相关文章

  • 构建nginx镜像的知识点
    1、如何进入nginx容器// 通过exec命令可以进入到镜像里面。docker exec -it nginx-alpine /bin/sh// 退出镜像exit这里需要注意下,如果是标准的nginx镜像,一般是通过dockerexec-itnginx01bash来进入到镜像里面。所以当通过bash进不去的时候,可换成其他命令......
  • C#定时任务
    C#中可以使用定时任务来执行一些定时的操作。你可以使用`System.Timers.Timer`类或者`System.Threading.Timer`类来创建定时任务。以下是一个使用`System.Timers.Timer`类的示例代码:```csharpusingSystem;usingSystem.Timers;publicclassProgram{privatestaticTimer......
  • C++ 数组排序 查找。数值排序、冒泡排序以及顺序查找的方法
    #include<iostream>#include<cstring>#include<algorithm>#include<ctime>#defineMAX8usingnamespacestd; intmain() {   inta[MAX]={1,5,9,6,3,1,4,6};  for(inti=0;i<MAX;i++)   cout<<a[i]<<"";    ......
  • ThreadLocal的介绍及其使用
    privatestaticfinalThreadLocal<Integer>THREAD_LOCAL=newThreadLocal<>();@TestvoidthreadLocalTest(){Assertions.assertDoesNotThrow(()->{//线程1存储数据Threadt1=newThread(()->{......
  • Quartz.Net来实现C#中的定时任务
    首先,你需要通过NuGet包管理器或手动下载并添加Quartz.Net库到你的项目中。 usingQuartz;usingQuartz.Impl;publicclassMyJob:IJob{publicTaskExecute(IJobExecutionContextcontext){//在这里编写你的任务逻辑Console.WriteLine("任......
  • Install elasticsearch-head: – for Elasticsearch 5.x
    RunningasapluginofElasticsearchInstallelasticsearch-head:–forElasticsearch5.x:sitepluginsarenotsupported.Runelasticsearch-head asastandaloneserverRunningwithbuiltinserverenable cors byadding http.cors.enabled:true inelasticsearc......
  • MindSponge分子动力学模拟——定义一个分子系统(2023.08)
    技术背景在前面两篇文章中,我们分别介绍了分子动力学模拟软件MindSponge的软件架构和安装与使用教程。这里我们进入到实用化阶段,假定大家都已经在本地部署好了基于MindSpore的MindSponge的编程环境,开始用MindSponge去做一些真正的分子模拟的工作。那么分子模拟的第一步,我们就需要......
  • Scrum敏捷开发工具:高效企业必备
    ​随着软件开发行业的不断发展和进步,Scrum敏捷开发工具逐渐成为了备受关注的话题。Scrum是一种灵活且高效的项目管理方法,旨在提高团队协作和交付效率,使团队能够更快地响应变化和需求。本文将深入探讨Scrum敏捷开发工具的基本概念、使用方法、优势以及实际应用案例。一、Scrum......
  • ReentrantLock的介绍及其用法
    Reentrantlock默认是非公平锁privatestaticReentrantLocklock=newReentrantLock();若想实现公平锁,只需在构造器的fair参数传入trueprivatestaticReentrantLocklock=newReentrantLock(true);公平锁会按照线程请求锁的顺序进行获取,遵循先到先得的原则。而非公平锁则......
  • shell数组
    数组概述1数组中可以存放多个值。BashShell只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与PHP类似)。2与大部分编程语言类似,数组元素的下标由0开始。3Shell数组用括号来表示,元素用”空格”符号分割开,语法格式如下:4my_array=(value1value2…value......