node.js---EJS 模板引擎

什么是模板引擎

模板引擎是分离 用户界面和业务数据 得一种技术

什么事 EJS

EJS 是一个高效的 JavaScript 得模板殷勤

EJS 初体验

下载:

npm i ejs --save

引用

const ejs = require('ejs')

配置

app.set("views",__dirname+"/view");//设置视图的路径
app.set(" view engine","ejs")//引擎
app.set("views",__dirname+"/view");
app.engine("html",myejs.__express)
app.set(" view engine","html")

注:ejs不能直接进入,必须通过拦截,通过response.render()进行视图显示

const ejs = require('ejs')

let str = 'hello'
let word = `${str} world`
let person = ['anna', 'bob', 'lily']

let result = ejs.render('hello <%= word%>', { str: str })

// ==> hello world

EJS 常用标签
  • <%-%>:输出没有转译后的变量值
  • <%%>:对应语法
  • <%=变量名%>读取变量值
列表渲染
const person = ['anna', 'bob', 'lily']

// let str = '<ul>'
// person.foreach(item => {
//   str += `<li>${item}</li>`
// })

// str += '</ul>'

// console.log(str)

// ejs 实现
let result = ejs.render(`<ul>
  <% person.foreach(item => { %>
    <li><%= item %></li>
  <% }) %>
</ul>`, { person: person })

抽离:

<ul>
  <% person.foreach(item => { %>
    <li><%= item %></li>
  <% }) %>
</ul>
const person = ['anna', 'bob', 'lily']

let fs = require('fs')
let personFile = fs.readFileSync('./person.html').toString()
// ejs 实现
let result = ejs.render(personFile, { person: person })
条件渲染
let isLogin = false
let result = ejs.render(`
  <% if(isLogin){ %>
  <span>欢迎回来</span>
  <% }else{ %>
  <button>登录</button>
  <% } %>
`, { isLogin: isLogin })
express 中使用 ejs
const express = require('express')
const app = express()
const path = require('path')
// 设置模板引擎
app.set('view engine', 'ejs')
// 设置模板文件存放位置  模板文件:具有模板语法内容的文件
app.set('views', path.resolve(__dirname, './views'))

app.get('/home', (req, res) => {
  // render 响应
  let title = 'title'
  res.render('home', {title})
  // 创建模板文件
  
})

views/home.ejs

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <h1><%= title %></h1>
</body>

</html>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯刷题(二分)

前言&#xff1a; 最近学校的学业有点重&#xff0c;好多课的作业一下布置导致我时间紧张&#xff0c;今天好不容易找到了整块的时间来刷刷题&#xff0c;不过有几道题难度对我来说有一点大了&#xff0c;所以到现在为止也没做几道&#xff0c;希望自己在后面能更勤奋一点吧。 …

探索 MySQL 递归查询,优雅的给树结构分页!

一、概述 递归查询是一种在数据库中处理具有层级结构数据的技术。它通过在查询语句中嵌套引用自身&#xff0c;以实现对嵌套数据的查询。递归查询在处理树状结构、父子关系或层级关系的数据时非常有用。 在MySQL中&#xff0c;递归查询可以使用WITH RECURSIVE语句来实现。该语…

利用HubSpot出海CRM和人工智能技术提升出海业务的效率和效果

在当今数字化时代&#xff0c;智能化营销已经成为企业获取客户和扩大市场份额的关键策略。特别是对于出海业务而言&#xff0c;利用智能化营销技术来应对不同文化、语言和市场的挑战&#xff0c;已经成为企业竞争的关键优势。今天运营坛将带领大家探讨如何利用HubSpot CRM和人工…

隐式提交的引申之DB/SAP LUW

1、写在前面 之前发表过《聊聊更新表时的隐式提交》一文&#xff0c;向大家介绍隐式提交&#xff0c;对于数据库操作的作用。 有粉丝看过后&#xff0c;提出了自己的疑问&#xff1a; 首先解释一下&#xff0c;该粉丝大致的问题和代码含义为&#xff1a; 在创建销售订单增强…

力扣-160. 相交链表(双指针)

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&a…

一道有深度的面试题:本地悲观锁实现计数器需要加 volatile 吗?

故事背景 团队内部前几天讨论了一个面试题&#xff0c;在本地用乐观锁和悲观锁实现计数器需要volatile关键字吗&#xff1f;毫无疑问&#xff0c;使用乐观锁一定是需要的。但使用悲观锁需要呢&#xff1f; 张三&#xff1a;不需要吧&#xff0c;每次不都是一个线程访问变量吗&a…

什么是字节码?采用字节码的好处是什么?

在 Java 中&#xff0c;JVM 可以理解的代码就叫做字节码&#xff08;即扩展名为 .class 的文件&#xff09;&#xff0c;字节码是一种中间代码&#xff0c;它是由源代码经过编译生成的一种二进制表示形式。字节码通常不针对特定的硬件平台&#xff0c;而是针对虚拟机设计的&…

antd vue Tabs控件的使用

Ant Design Vue-------Tabs标签页 今天就讲讲Ant Design Vue下的控件----tabs 标签页 结合项目中的需求&#xff0c;讲一下该控件如何使用&#xff0c;需求&#xff1a; &#xff08;1&#xff09;竖排样式 &#xff08;2&#xff09;如何使用v-for绑定数据源 &#xff08;3…

蓝桥杯专题 bfs习题详解

1.离开中山路 #include<iostream> #include<cstring> #include<queue> #include<algorithm> #include<string> using namespace std; int x1,x2,y1,y2; int n,n1,m1; const int N1010;typedef pair<int,int> PII; queue<PII> q;int …

CTP-API开发系列之九:行情登录及订阅代码

CTP-API开发系列之九&#xff1a;行情登录及订阅代码 前情回顾全局配置参数行情初始化代码行情登录行情订阅行情接收注意事项 前情回顾 CTP-API开发系列之一&#xff1a;各版本更新说明&#xff08;持续更新&#xff09; CTP-API开发系列之二&#xff1a;问题汇总&#xff08;…

(done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW

一个视频&#xff1a;https://www.bilibili.com/video/BV1mb4y1y7EB/?spm_id_from333.337.search-card.all.click&vd_source7a1a0bc74158c6993c7355c5490fc600 这里有个视频&#xff0c;讲解得更加生动形象一些 总得来说&#xff0c;词袋模型(Bow, bag-of-words) 是最简…

fs模块 文件写入 之 流式写入

一、流式写入&#xff08;createWriteStream &#xff09;与 文件的同步异步写入&#xff08;writeFile &#xff09;的区别&#xff1a; 1》程序打开一个文件是需要耗费资源的&#xff0c;流式写入可以减少打开关闭文件的次数。 2》文件的流式写入方式适用于大文件写入或者频…

ChatGPT国内能用吗?中国用户怎么才能使用ChatGPT?

与ChatGPT类似的国内网站&#xff0c;他们都能提供和ChatGPT相似的能力&#xff0c;而且可以在国内直接使用。 点击直达方式 百科GPT官网&#xff1a;baikegpt.cn ChatGPT是基于GPT-3.5架构的语言模型的一个实例&#xff0c;由OpenAI开发。以下是ChatGPT的发展历史&#xff1…

《ElementPlus 与 ElementUI 差异集合》el-button 属性 type=“text“ 被删除

差异 element-ui el-button中&#xff0c;属性 type"text" 定义文字按钮&#xff0c;也是链接按钮&#xff1b;element-plus el-button中&#xff0c;改为新增属性 link 并与其它 type 值配合使用&#xff1b; // element-ui <el-button type"text"&g…

(Linux学习九)管道、重定向介绍

FD:文件描述符。 0,1,2,3&#xff0c;&#xff0c;&#xff0c;。进程打开文件所用。 0标准输入 1 标准输出 2 标准错误输出 3普通文件 一、管道 | 命令 | tee | xargs | 命令1的输出&#xff0c;作为命令2的输入&#xff0c;命令2的输出作为命令3的输入 | tee 三通&#xff…

Qt+FFmpeg+opengl从零制作视频播放器-3.解封装

解封装:如下图所示,就是将FLV、MKV、MP4等文件解封装为视频H.264或H.265压缩数据,音频MP3或AAC的压缩数据,下图为常用的基本操作。 ffmpeg使用解封装的基本流程如下: 在使用FFmpeg API之前,需要先注册API,然后才能使用API。当然,新版本ffmpeg库不需要再调用下面的方法…

原型模式(Clone)——创建型模式

原型模式(clone)——创建型模式 什么是原型模式&#xff1f; 原型模式是一种创建型设计模式&#xff0c; 使你能够复制已有对象&#xff0c; 而又无需依赖它们所属的类。 总结&#xff1a;需要在继承体系下&#xff0c;实现一个clone接口&#xff0c;在这个方法中以本身作为拷…

技术方案|某工业集团PaaS容灾方案

在当今快速发展的数字化时代&#xff0c;业务的连续性和稳定性已成为企业核心竞争力的重要组成部分。然而&#xff0c;由于各种原因&#xff0c;企业常常面临着数据丢失、系统瘫痪等潜在风险。因此&#xff0c;制定一套科学、高效的容灾方案至关重要。本文将围绕某全球领先的工…

WRF模型运行教程(ububtu系统)--III.运行WRF模型(官网案例)

创建DATA目录 1、创建一个DATA目录用于存放数据&#xff08;一般为fnl数据&#xff0c;放在Build_WRF目录下&#xff09;。 mkdir DATA 2、将数据放在DATA文件夹里。 3、链接数据 cd ~/Build_WRF/WPS/ ./link_grib.csh ~/Build_WRF/DATA/data/fnl ln -sf ungrib/Variab…

数据结构02:线性表 顺序表习题01[C++]

图源&#xff1a;文心一言 考研笔记整理~&#x1f95d;&#x1f95d; 之前的博文链接在此&#xff1a;数据结构02&#xff1a;线性表[顺序表链表]_线性链表-CSDN博客~&#x1f95d;&#x1f95d; 本篇作为线性表的代码补充&#xff0c;供小伙伴们参考~&#x1f95d;&#x1…