05_模板引擎

模板引擎可以让将数据和HTML模板更加友好的结合,省去繁琐的字符串拼接,使代码更加易于维护。

1 EJS

文档地址:https://ejs.bootcss.com/#install

1.1 安装

npm install ejs

1.2 标签语法

  • <% ‘脚本’ 标签,用于流程控制,无输出。
  • <%_ 删除其前面的空格符
  • <%= 输出数据到模板(输出是转义 HTML 标签)
  • <%- 输出非转义的数据到模板
  • <%# 注释标签,不执行、不输出内容
  • <%% 输出字符串 ‘<%’
  • %> 一般结束标签
  • -%> 删除紧随其后的换行符
  • _%> 将结束标签后面的空格符删除
插值表达式
  • <%= key %> 可以把对应的key的值显示在页面上,可以直接把html标签内容展示 innerText
  • <%- key %> 可以把对应的key的值显示在页面上,会把html渲染 innerHTML
条件渲染
<% if (false) { %><div>条件为true时显示</div>
<% } else { %><div>条件为false时执行</div>
<% } %>
遍历渲染
<% for(let i = 0; i < arr.length; i++) { %>
<li><%= arr[i] %></li>
<% } %><% arr.forEach((item) => { %>
<li><%= item %></li>
<% }) %>
包含(include)
<%- include('user/show', {user: user}); %>
布局(Layouts)

EJS 并未对块(blocks)提供专门的支持,但是可以通过包含页眉和页脚来实现布局。

<%- include('header'); -%>
<h1>Title</h1>
<p>My page</p>
<%- include('footer'); -%>

1.3 前端使用

如果想要在前端使用ejs,需要引入ejs.js

ejs.compile

可以把模板字符串变成模板

let tHtml = `
<%= str %>
`;let template = ejs.compile(tHtml)
template()

template是ejs.compile调用后的返回值,它可以叫任意名字。

let html = template({str: "Hello World"})

html就是最终生成的HTML代码
ejs可以帮助我们更好的渲染对应的html,如果遇到渲染中需要有条件判断和循环,使用模板要比字符串拼接,更简单一些。

2 art-template

文档地址:https://aui.github.io/art-template/zh-cn/docs/

2.1 安装

npm install art-template

2.2 模板编译

通过调用模板引擎提供的template函数,告知模板引擎将特定模板和特定数据进行拼接,最终返回拼接结果。

// 模板引擎导入
const template = require('art-template');
// 模板编译
// 1.模板位置
// 2.向模板中传递要拼接的数据,对象类型,对象属性可以直接在模板中使用。
// result 拼接结果
const result = template('./views/index.html', {msg: 'Hello, art-template'});

2.3 模板语法

通过模板引擎提供的特殊语法,告知模板引擎数据和模板具体的拼接细节。

插值表达式

{{}},用来显式数据,将数据变量放入双大括号之中即可。

原始语法
// 标准语法: {{ 数据 }}
// 原始语法:<%= 数据 %>

插值表达式中可以进行运算,最终显式运算的结果。

<!-- 标准语法 -->
<h2>{{value}}</h2>
<h2>{{a ? b : c}}</h2>
<h2>{{a + b}}</h2><!-- 原始语法 -->
<h2><%= value %></h2>
<h2><%= a ? b : c %></h2>
<h2><%= a + b %></h2>
原文输出

如果数据中携带HTML标签,默认不会解析标签,会将其转义后输出。使用以下方式可以解析标签。

{{@ value }}
条件判断
<!-- 标准语法 --> 
{{if 条件}} ... {{/if}}
{{if v1}} ... {{else if v2}} ... {{/if}}<!-- 原始语法 -->
<% if (value) { %> ... <% } %>
<% if (v1) { %> ... <% } else if (v2) { %> ... <% } %>
数据循环
{{each target}}
{{$index}} {{$value}}
{{/each}}
<!-- 原始语法 -->
<% for(var i = 0; i < target.length; i++){ %>
<%= i %> <%= target[i] %>
<% } %>
子模板

使用子模板可以将网站公共区块(头部、底部)抽离到单独的文件中。

<!-- 标准语法 -->
{{include './header.art'}}<!-- 原始语法 -->
<% include('./header.art') %>
模板继承

使用模板继承可以将网站HTML骨架抽离到单独的文件中,其他页面模板可以继承骨架文件。

{{extend './layout.html'}}
{{block 'head'}} ... {{/block}}

3 不同的渲染方式

3.1 服务端渲染

优点

  • 可以更好的SEO优化
  • 前端耗时更少
  • 客户端资源占用少

缺点

  • 不便于前端后续维护
  • 压力都在服务器,导致服务器压力过大

渲染的过程

  • 浏览器 -> 向服务器发送请求 -> 服务器 -> 向数据库查询数据 -> 数据库
  • 数据库 -> 返回数据给服务器 -> 服务器 -> 将数据和模板进行渲染,返回给浏览器 -> 浏览器渲染

3.2 前端JS渲染

优点

  • 速度快
  • 压力均分给客户端
  • 前后端分离。前端专注UI,后端专注api开发。前端有更多选择性,不需要遵循后端特定的模板
  • 用户体验更好

缺点

  • 不能进行SEO优化

渲染的过程

  • 浏览器 -> 向服务器发送请求 -> 服务器 -> 向数据库查询数据 -> 数据库
  • 数据库 -> 返回数据给服务器 -> 服务器 -> 数据处理后,返回JSON给浏览器 -> 浏览器根据返回的数据,使用模板渲染页面

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

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

相关文章

【思维构造】Circle of Monsters—CF1334C

Circle of Monsters—CF1334C 思路 每一个怪兽都有两种死法&#xff1a; 直接被子弹打死先被上一个怪兽爆炸击伤&#xff0c;剩下的血量再用子弹打死 所以&#xff0c;很容易看出来第二种死法对于所有的怪兽都是最优死法&#xff08;消耗子弹最少的死法&#xff09;。我们需要…

什么测试自动化测试?

什么测试自动化测试&#xff1f; 做测试好几年了&#xff0c;真正学习和实践自动化测试一年&#xff0c;自我感觉这一个年中收获许多。一直想动笔写一篇文章分享自动化测试实践中的一些经验。终于决定花点时间来做这件事儿。 首先理清自动化测试的概念&#xff0c;广义上来讲&a…

如何搭建一个 websocket

环境: NodeJssocket.io 4.7.2 安装依赖 yarn add socket.io创建服务器 引入文件 特别注意: 涉及到 colors 的代码&#xff0c;请采取 console.log() 打印 // 基础老三样 import http from "http"; import fs from "fs"; import { Server } from &quo…

pytorch 数据载入

在PyTorch中&#xff0c;数据载入是训练深度学习模型的重要一环。 本文将介绍三种常用的数据载入方式&#xff1a;Dataset、DataLoader、以及自定义的数据加载器。 使用 Dataset 载入数据 方法&#xff1a; from torch.utils.data import Datasetclass CustomDataset(Dataset…

第九课 排序

文章目录 第九课 排序排序算法lc912.排序数组--中等题目描述代码展示 lc1122.数组的相对排序--简单题目描述代码展示 lc56.合并区间--中等题目描述代码展示 lc215.数组中的第k个最大元素--中等题目描述代码展示 acwing104.货仓选址--简单题目描述代码展示 lc493.翻转树--困难题…

JavaScript系列从入门到精通系列第十五篇:JavaScript中函数的实参介绍返回值介绍以及函数的立即执行

文章目录 一&#xff1a;函数的参数 1&#xff1a;形参如何定义 2&#xff1a;形参的使用规则 二&#xff1a;函数的返回值 1&#xff1a;函数返回值如何定义 2&#xff1a;函数返回值种类 三&#xff1a;实参的任意性 1&#xff1a;方法可以作为实参 2&#xff1a;将匿…

kafka与hbase的区别

Kafka 和 HBase 是两个不同的分布式数据存储系统&#xff0c;它们可以在大数据应用中发挥不同的作用。 Kafka 是一个高吞吐量的分布式发布订阅消息系统&#xff0c;主要用于处理实时数据流。它具有以下特点&#xff1a; 高性能&#xff1a;Kafka 能够以非常高的吞吐量和低延迟…

2023年全球市场数字干膜测量仪总体规模、主要生产商、主要地区、产品和应用细分研究报告

内容摘要 按收入计&#xff0c;2022年全球数字干膜测量仪收入大约149.2百万美元&#xff0c;预计2029年达到191.6百万美元&#xff0c;2023至2029期间&#xff0c;年复合增长率CAGR为 3.6%。同时2022年全球数字干膜测量仪销量大约 &#xff0c;预计2029年将达到 。2022年中国市…

【Spring Boot】创建一个 Spring Boot 项目

创建一个 Spring Boot 项目 1. 安装插件2. 创建 Spring Boot 项目3. 项目目录介绍和运行注意事项 1. 安装插件 IDEA 中安装 Spring Boot Helper / Spring Assistant / Spring Initializr and Assistant插件才能创建 Spring Boot 项⽬ &#xff08;有时候不用安装&#xff0c;直…

分布式事务 —— SpringCloud Alibaba Seata

文章目录 Seata 简介Seata 服务端Seata 客户端 Seata 简介 传统的单体应用中&#xff0c;业务操作使用同一条连接操作不同的数据表&#xff0c;一旦出现异常就可以整体回滚。随着公司的快速发展、业务需求的变化&#xff0c;单体应用被拆分成微服务应用&#xff0c;原来的单体…

【排序算法】冒泡排序

文章目录 一&#xff1a;排序算法1.1 介绍1.2 分类 二&#xff1a;冒泡排序2.1 基本介绍2.2 图解冒泡排序算法2.3 代码实现 三&#xff1a;算法性能分析3.1 时间复杂度3.2 空间复杂度 一&#xff1a;排序算法 1.1 介绍 排序也称排序算法(Sort Algorithm)&#xff0c;排序是将…

SpringCloud-消息组件

1 简介 了解过RabbitMQ后&#xff0c;可能我们会遇到不同的系统在用不同的队列。比如系统A用的Kafka&#xff0c;系统B用的RabbitMQ&#xff0c;但是没了解过Kafka&#xff0c;因此可以使用Spring Stream&#xff0c;它能够屏蔽地产&#xff0c;像JDBC一样&#xff0c;只关心SQ…

C# 给某个方法设定执行超时时间

C# 给某个方法设定执行超时时间在某些情况下(例如通过网络访问数据)&#xff0c;常常不希望程序卡住而占用太多时间以至于造成界面假死。 在这时、我们可以通过Thread、Thread Invoke&#xff08;UI&#xff09;或者是 delegate.BeginInvoke 来避免界面假死&#xff0c; 但是…

java ftputils 模拟测试方法 有效

前言: 最近需要开发相关ftp内进行文件的上传与下载的操作,需要使用java来实现,需要开发一个工具类进行处理; 具体代码如下: import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.slf4j.Logger; import org.slf4j.LoggerF…

el-table进阶(每条数据分行或合并)

最麻烦的还是css样式&#xff0c;表格样式自己调吧 <!-- ——————————————————————————————————根据数据拓展表格—————————————————————————————————— --> <div style"display: flex"&…

Java Spring Boot 目录结构介绍

Java Spring Boot 是一个用于简化Java应用程序开发的框架&#xff0c;它提供了一套灵活、易用的开发工具和约定&#xff0c;帮助开发者更快速地构建各种类型的Java应用程序。Spring Boot 的目录结构是一个重要的组成部分&#xff0c;它规定了如何组织和管理项目代码和资源文件。…

cpp primer笔记-010开始

下面的第5行代码可以写成第6行注释的代码#include<iostream> int main() {int v1{}, v2{};(std::cin >> v1) >> v2;//std::cin>>v1>>v2;(std::cout << v1) << " " << v2 << std::endl;return 0; }char类型在有…

oralce配置访问白名单的方法

目录 配置sqlnet.ora文件 重新加载使配置生效 注意事项 Oracle数据库安全性提升&#xff1a;IP白名单的配置方法 随着互联网的发展&#xff0c;数据库安全问题也越来越严重。Oracle是目前使用较为广泛的一款数据库管理系统&#xff0c;而IP白名单作为提升数据库安全性的有效…

深度学习——权重衰减(weight_decay)

深度学习——权重衰减&#xff08;weight_decay) 文章目录 前言一、权重衰减1.1. 范数与权重衰减1.2. 高维线性回归1.3. 从零开始实现1.3.1.初始化模型参数1.3.2. 定义L₂范数惩罚1.3.3. 定义训练代码实现1.3.4. 不管正则化直接训练1.3.5. 使用权重衰减 1.4. 简洁实现 总结 前言…

vue 项目打包性能分析插件 webpack-bundle-analyzer

webpack-bundle-analyzer 是 webpack 的插件&#xff0c;需要配合 webpack 和 webpack-cli 一起使用。这个插件可以读取输出文件夹&#xff08;通常是 dist&#xff09;中的 stats.json 文件&#xff0c;把该文件可视化展现&#xff0c;生成代码分析报告&#xff0c;可以直观地…