讲师中心 微信公众号
AI工具推荐 视频效率加速

EJS模板渲染指南:深入理解

云涛君_3236

云涛君_3236

发布时间:2025-09-21 09:55:27

|

945人浏览过

|

来源于php中文网

原创

EJS模板渲染指南:深入理解<%与<%=标签的正确用法

本文旨在解决EJS模板中变量未正确渲染的问题。核心在于区分(控制流标签)和(输出标签)的用法。通过实例代码,我们将展示如何正确地将动态数据嵌入到HTML中,避免常见的渲染错误,确保EJS模板按预期工作。

EJS模板引擎简介

ejs(embedded javascript)是一个流行的javascript模板引擎,它允许开发者在html文件中嵌入纯javascript代码,从而动态生成html内容。它以其简洁的语法和强大的功能,在node.js生态系统中被广泛应用于构建动态web页面。然而,初学者在使用ejs时,常常会遇到变量无法正确渲染的问题,其中最常见的原因是对ejs标签的误用。

理解EJS标签:控制流与输出

EJS提供了多种标签类型,每种都有其特定的用途。正确区分和使用这些标签是避免渲染错误的关键。

  1. Scriptlet标签 (): 这种标签用于嵌入JavaScript控制流代码,例如条件语句(if/else)、循环语句(for/forEach)等。它不会将内部的JavaScript表达式的结果输出到HTML中。

    示例用途:

    <% if (user.isAdmin) { %>
        <p>欢迎,管理员!</p>
    <% } else { %>
        <p>欢迎,<%= user.name %>!</p>
    <% } %>
    
    <% for (let item of items) { %>
        <li><%= item %></li>
    <% } %>
  2. 输出标签 (): 这是用于将JavaScript表达式的结果输出到HTML中的标签。当你需要显示一个变量的值、一个函数调用的结果或任何JavaScript表达式的计算结果时,都应该使用此标签。EJS会自动对输出内容进行HTML转义,以防止跨站脚本(XSS)攻击。

    示例用途:

    <h1>今天的日期是:<%= new Date().toLocaleDateString() %></h1>
    <p>用户名称:<%= userName %></p>
  3. 非转义输出标签 (): 与输出标签类似,但它不会对输出内容进行HTML转义。当你知道内容是安全的,或者需要输出包含HTML标记的字符串(例如,从数据库中获取的富文本内容)时,可以使用此标签。使用时务必谨慎,以避免安全漏洞。

    示例用途:

    <div><%- rawHtmlContent %></div>

常见错误:变量未渲染的问题

许多初学者在尝试显示变量时,错误地使用了Scriptlet标签,而非输出标签。

错误示例:

假设你有一个名为KindOfDay的变量,期望在EJS模板中显示它的值。

<body>
    <h1>Its a <%KindOfDay%> </h1>
</body>

在上述代码中,KindOfDay被放置在标签内。由于这是一个Scriptlet标签,它会尝试将KindOfDay视为一个要执行的JavaScript语句,但它不会将其值输出到HTML。因此,在浏览器中,你可能会看到Its a后面没有任何内容,或者在某些情况下,如果KindOfDay不是一个有效的JavaScript语句,可能会导致解析错误。

jm-jsjkxyjs02-zlm-405
jm-jsjkxyjs02-zlm-405

使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。

下载

正确的解决方案

要正确地将变量KindOfDay的值渲染到HTML中,应该使用输出标签。

正确示例:

<body>
    <h1>Its a <%= KindOfDay %> </h1>
</body>

通过将KindOfDay包裹在中,EJS会解析这个表达式,获取KindOfDay变量的当前值,并将其安全地输出到HTML页面上。

完整示例:动态显示日期类型

以下是一个完整的Node.js Express应用示例,演示了如何使用EJS正确地将动态数据渲染到页面。

1. 项目设置

首先,确保你的项目已安装必要的依赖:Express和EJS。

npm init -y
npm install express ejs body-parser

2. app.js (Express服务器代码)

创建 app.js 文件,配置Express服务器,设置EJS为视图引擎,并定义一个路由来传递数据给EJS模板。

const express = require("express");
const bodyParser = require("body-parser");
const path = require("path"); // 引入 path 模块

const app = express();

// 设置视图引擎为 EJS
app.set('view engine', 'ejs');
// 设置视图文件所在的目录
app.set('views', path.join(__dirname, 'views'));

// 使用 body-parser 中间件(如果需要处理 POST 请求体)
app.use(bodyParser.urlencoded({ extended: true }));
// 静态文件服务(如果需要)
app.use(express.static('public'));

app.get("/", (req, res) => {
    const today = new Date();
    const currentDayOfWeek = today.getDay(); // 获取星期几,0为周日,6为周六

    let dayType = "";

    if (currentDayOfWeek === 0 || currentDayOfWeek === 6) {
        dayType = "Weekend"; // 周末
    } else {
        dayType = "Weekday"; // 工作日
    }

    // 使用 res.render 渲染 EJS 模板,并传递数据对象
    res.render("list", { KindOfDay: dayType });
    console.log(`当前日期类型: ${dayType}`);
});

const port = 3000;
app.listen(port, () => {
    console.log(`Server Running on port ${port}`);
});

3. views/list.ejs (EJS模板文件)

在项目根目录下创建 views 文件夹,并在其中创建 list.ejs 文件。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Today's Status</title>
</head>
<body>
    <h1>Its a <%= KindOfDay %> </h1>
    <p>欢迎来到我们的动态页面!</p>
</body>
</html>

4. 运行应用

在终端中运行 app.js:

node app.js

然后访问 http://localhost:3000,你将看到页面上正确显示 "Its a Weekend" 或 "Its a Weekday",取决于当前的日期。

注意事项与最佳实践

  • 视图引擎配置: 确保在Express应用中正确配置了EJS作为视图引擎:app.set('view engine', 'ejs'); 和 app.set('views', path.join(__dirname, 'views'));。
  • 数据传递: res.render() 方法的第二个参数必须是一个对象,EJS会将其属性作为变量在模板中可用。
  • VS Code EJS扩展: 在VS Code中安装EJS语法高亮扩展(如 EJS language support by DigitalBrainstem),可以帮助你更好地识别EJS标签,避免语法错误。
  • 调试: 如果遇到问题,可以在app.js中通过console.log()打印传递给模板的数据,确保数据是正确的。
  • 安全性: 除非你完全信任内容来源,否则应始终优先使用进行输出,以防止XSS攻击。只有在明确需要输出未转义的HTML时才使用。

总结

正确理解和使用EJS模板引擎的标签是构建动态Web应用的基础。用于控制流,而则用于输出变量或表达式的值。通过遵循本文提供的指南和示例,你可以有效地避免EJS渲染中的常见错误,并充分利用EJS的强大功能来创建灵活且响应式的用户界面。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
Node.js后端开发与Express框架实践
Node.js后端开发与Express框架实践

本专题针对初中级 Node.js 开发者,系统讲解如何使用 Express 框架搭建高性能后端服务。内容包括路由设计、中间件开发、数据库集成、API 安全与异常处理,以及 RESTful API 的设计与优化。通过实际项目演示,帮助开发者快速掌握 Node.js 后端开发流程。

781

2026.02.10

php中foreach用法
php中foreach用法

本专题整合了php中foreach用法的相关介绍,阅读专题下面的文章了解更多详细教程。

818

2025.12.04

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1858

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

3004

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6284

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

6249

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7814

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

11894

2024.04.29

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

0

2026.11.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WEB前端教程【HTML5+CSS3+JS】
WEB前端教程【HTML5+CSS3+JS】

共101课时 | 21.3万人学习

JS进阶与BootStrap学习
JS进阶与BootStrap学习

共39课时 | 4.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn