ejs的使用

news2024/12/21 21:59:49

EJS

模板引擎

是分离用户界面(HTML)和业务数据(JS)的一种技术。这里的JS特指服务端的JavaScript

EJS语法

  • <%= ... %> 用于输出转义后的 HTML 内容。
  • <%- ... %> 用于输出未经转义的内容。
  • <% ... %> 用于执行任意 JavaScript 代码,但不输出任何东西。
  • <%_ ... _%> 用于移除所有空格和换行符。

示例

代码结构

myapp/
├── node_modules/          # 安装的 npm 模块
├── public/                # 静态资源文件夹 (CSS, JavaScript, images)
│   └── css/
│       └── style.css
├── app.js                 # 主应用程序文件
└── package.json           # 项目配置文件
安装依赖

代码示例

未使用模板引擎时,代码的耦合性。

// app.js
const ejs = require('ejs');

// 字符串 展示耦合性
let name = '张三';

let str = `我的名字是${name}`;

console.log(str);

使用ejs

const ejs = require('ejs');

// 字符串
let name = '张三';

// let str = `我的名字是${name}`;

// console.log(str);
// 解耦
const result = ejs.render('我的名字是<%= name %>', { name }); // <%= ... %> 用于输出转义后的 HTML 内容。

console.log(result);

继续分离

代码结构
myapp/
├── node_modules/          # 安装的 npm 模块
├── public/                # 静态资源文件夹 (CSS, JavaScript, images)
│   └── css/
│       └── style.css
├── app.js                 # 主应用程序文件
├── views/                # 静态资源文件夹 (CSS, JavaScript, images)
│   └── index.html
└── package.json           # 项目配置文件
安装依赖
代码示例
// index.html
<!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>
    <h2>我的名字是<%= name %></h2>
</body>
</html>

实现解耦

// index.js
const ejs = require('ejs');
const fs = require('fs');
// 字符串 展示耦合性
let name = '张三';

// let str = `我的名字是${name}`;

// console.log(str);

const html = fs.readFileSync('./index.html').toString();

const result = ejs.render(html, { name });

console.log(result); // 完整打印html
列表循环代码示例

未使用ejs

const express = require('express');
const app = express();
const port = 3000;

// 设置静态文件目录
app.use(express.static('public'));

// 用户数据
const users = [
    { id: 1, name: '张三' },
    { id: 2, name: '李四' },
    { id: 3, name: '王五' }
];

// 路由处理器
app.get('/', (req, res) => {
    // 构建 HTML 内容
    let html = `
        <!DOCTYPE html>
        <html lang="zh-CN">
        <head>
            <meta charset="UTF-8">
            <title>用户列表</title>
            <link rel="stylesheet" href="/css/style.css">
        </head>
        <body>
            <h1>用户列表</h1>
            <ul>
    `;

    // 循环添加每个用户的 HTML
    for (let user of users) {
        html += `<li>${user.name}</li>`;
    }

    // 结束 HTML
    html += `
            </ul>
        </body>
        </html>
    `;

    // 发送响应
    res.send(html);
});

// 启动服务器
app.listen(port, () => {
    console.log(`服务器运行在 http://localhost:${port}`);
});

通过ejs解耦实现

// index.js
// 用户数据
const users = [
    { id: 1, name: '张三' },
    { id: 2, name: '李四' },
    { id: 3, name: '王五' }
];

const html = fs.readFileSync('./index.html').toString();

const result = ejs.render(html,{users});

<% ... %>是可以解析JS

// index.html
    <h1>用户列表</h1>
    <ul>
        <% users.forEach(function(user) { %>
            <li><%= user.name %></li>
        <% }); %>
    </ul>
条件判断代码示例
// index,js

const ejs = require('ejs');
const fs = require('fs');

let isLogin = true;

// EJS实现
let html = fs.readFileSync('./index.html').toString();

let result = ejs.render(html, { isLogin });

console.log(result);
// index.html

<% if(isLogin){ %>
<span>欢迎</span>
<% }else { %>
<button>登录</button>
<% } %>
在express中如何实现ejs
myapp/
├── node_modules/          # 安装的 npm 模块
├── public/                # 静态资源文件夹 (CSS, JavaScript, images)
│   └── css/
│       └── style.css
├── app.js                 # 主应用程序文件
├── views/                # 静态资源文件夹 (CSS, JavaScript, images)
│   └── index.ejs
└── package.json           # 项目配置文件
// app.js
const express = require('express');

const app = express();

const path = require('path');

// 1.设置模板引擎
app.set('view engine', 'ejs'); // pug twing ...

// 2.设置模板文件存放位置
//  2.1 views是文件目录
app.set('views', path.resolve(__dirname, './views'));

app.get('/home', (req, res) => {
    //3.render响应
    // 变量
    let title = 'express中如何使用ejs';
    res.render('index', { title });

});

app.listen(3000, () => {
    console.log('服务已经启动....');
})
// index.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>
    <p>hi ejs</p>
    <p><%= title %></p>
</body>
</html>
题外

学ejs的时候,会想到vue的模板引擎。

EJS (Embedded JavaScript)

用途上一般:

  • EJS 主要用于服务器端渲染(SSR),常与 Node.js 和 Express 一起使用。
  • 它适合生成静态内容或需要在服务器端处理数据的情况。

特点上就是简单易用,学习曲线平缓,然后支持条件语句、循环、函数调用等,适用于简单的动态内容生成,
但不支持组件化开发。

Vue 模板引擎

用途上一般:

  • Vue 是一个前端框架,其模板引擎主要用于客户端渲染。
  • 适合构建复杂的单页应用(SPA)和交互式用户界面。

特点:

  • 响应式数据绑定:Vue 会自动更新视图以反映数据的变化。
  • 组件化开发:可以创建可复用的组件。
  • 虚拟 DOM:提高性能,减少直接操作 DOM 的开销。
  • 双向数据绑定:通过 v-model 实现表单输入和应用状态之间的双向同步。
  • 支持自定义指令、过滤器、计算属性等高级功能。

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

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

相关文章

安全企业邮箱优势与局限,密码策略反馈

密码策略是什么呢&#xff1f;如何设置出安全可靠的密码策略呢&#xff1f;企业邮箱安全始于密码策略&#xff0c;包括复杂性、长度、更新频率、重用限制和两步验证。实施需全员培训、密码管理工具、审计与监控。一文为你详细介绍密码策略。 一、如何设置好的密码策略&#xff…

【JavaScript】JavaScript开篇基础(3)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…

【微信小程序_11_全局配置】

摘要:本文介绍了微信小程序全局配置文件 app.json 中的常用配置项,重点阐述了 window 节点的各项配置,包括导航栏标题文字、背景色、标题颜色,窗口背景色、下拉刷新样式以及上拉触底距离等。通过这些配置可实现小程序窗口外观的个性化设置,提升用户体验。 微信小程序_11_全…

总看别人写贪吃蛇,自己也来写一个吧

贪吃蛇是一个流行度非常高的游戏&#xff0c;玩法十分简单&#xff0c;从最初的方块机上就有这个游戏了&#xff0c;后来出现的手机中也是加入了这个游戏&#xff0c;无聊的时候可以打发时间玩一会。这个游戏可谓是非常的简单&#xff0c;容易上手&#xff0c;所以直到现在&…

番外篇 | 常用的激活函数汇总 | 20+种激活函数介绍及其公式、图像等

前言:Hello大家好,我是小哥谈。激活函数(Activation Function)是神经网络中的一种重要概念,用于控制神经网络中神经元的激活方式。在传统的神经网络中,激活函数被用来将神经元的输出从数值转换为可以被神经网络其他部分理解的非数值形式。激活函数通常被定义为神经元的输…

电能表预付费系统-标准传输规范(STS)(2)

5. 标准传输规格参考模型 5.1 一般付费电表功能参考图 In a single-device payment meter all the essential functions are located in a single enclosure as depicted in Figure 1 above, while in a multi-device payment meter it is possible for the TokenCarrierToMe…

Pagehelper获取total错误

前言 在使用若依框架的pagehelper时&#xff0c;给分页表设置数据的时候前端只收到了分页的那一页的数据&#xff0c;总记录数不符合要求 我想要的效果如下&#xff0c;可以实现分页&#xff0c;和显示总记录数 但是实际情况为 但是我的数据库有11条记录&#xff0c;他这里明…

【python学习】1-2 配置python系统环境变量

1.点击“我的电脑”右键&#xff0c;点击属性&#xff0c;点击“高级系统设置”&#xff0c;再点击环境变量。 2.选择“系统变量”中的Path后&#xff0c;点击编辑。 3.点击新建&#xff0c;添加如图两个路径&#xff0c;即是python安装的路径位置后&#xff0c;点击确定。

前端脚手架插件安装总结(axios,element-ui,bootstrap,echarts等)

1.打开前端项目终端 输入命令 vue ui 进入图形化界面 a.选择插件 b.选择添加插件 c.安装插件 d.完成安装

手写mybatis之完善ORM框架,增删改查操作

前言 目前这个框架中所提供的 SQL 处理仅有一个 select 查询操作&#xff0c;还没有其他我们日常常用的 insert、update、delete&#xff0c;以及 select 查询返回的集合类型数据。 其实这一部分新增处理 SQL 的内容&#xff0c;也就是在 SqlSession 需要定义新的接口&#xff…

Java 读取word , 作为私有知识库做RAG答疑

检索与生成的技术&#xff08;RAG)&#xff0c;可以提升文本精准度与企业数据相关性 检索增强生成 (RAG) 是一种技术&#xff0c;它结合了检索模型和生成模型&#xff0c;旨在通过私有或专有的数据源来辅助文本生成。在使用大模型时&#xff0c;一个常见问题是模型可能会产生“…

利用Spring Boot优化企业知识管理

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…

【Java SE】数组的应用

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 数组的概念 1.1 为什么存在数组 1.2 数组是什么 1.3 数组的创建 1.4 数组的初始化 1.4.1 动态初始化 1.4.2 静态初始化 1.4.3 默认值 1.5 数组的使…

【最新华为OD机试E卷-支持在线评测】英文输入法(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

AD之Layout设计规则

设计规则&#xff1a; 间距 线宽 过孔 铺铜 其他 1.添加类 这里建立了PWR类&#xff0c;与电源相关的网络 2.间距规则:6mil的成本低 3.线宽规则&#xff1a;PWR的优先级排第一&#xff0c;否则不起作用 4.过孔规则&#xff1a;8mil<大小<12mil 4.铺铜规则

音视频开发:FFmpeg库的使用

文章目录 一、FFmpeg的介绍二、FFmpeg的安装三、FFmpeg的使用1.ffplay&#xff1a;播放音视频2.ffprobe&#xff1a;查看视频信息3.ffmpeg&#xff1a;处理视频(1)格式转换(2)帮助 四、参考资料 一、FFmpeg的介绍 FFmpeg 是使用广泛的多媒体框架&#xff0c;是一个强大的音视频…

LeetCode讲解篇之740. 删除并获得点数

文章目录 题目描述题解思路题解代码题解链接 题目描述 题解思路 首先对于这题我们如果将所有点数装入一个切片f中&#xff0c;该切片f中的i号下标表示所有点数为i的点数之和 那么这题就转换成了打家劫舍这道题&#xff0c;也就是求选择了切片中某个下标的元素后&#xff0c;该…

观察者模式和发布-订阅模式的区别

观察者模式是&#xff0c;当被观察者的数据发生变化时&#xff0c;调用被观察者的 notify 方法&#xff0c;去通知所有观察者执行 update 方法进行更新&#xff1b; 对于发布-订阅模式&#xff0c;首先发布者与订阅者互相并不知道彼此的存在&#xff0c;他们是通过事件中心来进…

Element中el-table组件设置max-height右侧出现空白列的解决方法

之前就出现过这个情况&#xff0c;没理过&#xff0c;因为不影响啥除了不美观...但今天看着实在是难受&#xff0c;怎么都不顺眼(可能是我自己烦躁--) 试了很多网上的方法&#xff0c;都不得行&#xff0c;后面发现了这篇文章&#xff0c;解决了! 感谢&#xff01; Element中t…

微知-Mellanox 网卡和NVIDIA Bluefield DPU如何备份firmware?

某些场合需要从网卡或者DPU上读取网卡的firmware 备份命令&#xff1a; flint -d 06:00.0 ri 1.bin实操&#xff1a; 注意&#xff1a; 有些网卡不支持到处firmware