EJS + Express基本使用

EJS + Express基本使用

序:

在使用Node.js的Web框架Express时,经常会用到ejs作为模板引擎,使用Express+ejs主要是为了实现服务端渲染,利于SEO优化。所以,本篇博客仅仅是为了学习Express而写的,在真实的项目开发中不推荐使用这种方式。

EJS 是一套模板语言,用普通的 JS 代码生成 HTML 页面,即嵌入式JS模板引擎。

一、准备工作

1、安装ejsexpress

npm install ejs
npm i express

npm install ejs express nodemon -D

2、在views文件夹中新建一个ejs后缀的文件,在该文件里写正常的HTML代码

3、在app.js中设置默认模板引擎

app.set(“view engine”,“ejs”)

二、ejs语法(基于express搭建的后端环境)

1、方法

1.1、 template

编译字符串得到模板函数。

let template = ejs.compile(str, options);
template(data); // => 输出渲染后的 HTML 字符串
  • str:需要解析的字符串模板
  • data:数据
  • option:配置选项

例子:

/* 书写ejs */
let html = ejs.compile('<%=123 %>')();
/* 将写好的ejs进行渲染 */
res.send(html);
1.2、 render

直接渲染字符串并生成HTML

ejs.render(str, data, options); // => 输出渲染后的 HTML 字符串
  • str:需要解析的字符串模板
  • data:数据
  • option:配置选项

例子:

/* 书写ejs */
let people = ['geddy', 'neil', 'alex'],
  html = ejs.render('<%= people.join(", "); %>', {people: people});
/* 将写好的ejs进行渲染 */
res.send(html);
1.3、 renderFile

解析文件生成HTML

ejs.renderFile(filename, data, options, function(err, str){
    // str => 输出渲染后的 HTML 字符串
});
  • str:需要解析的字符串模板
  • data:数据
  • option:配置选项

例子:

let people = ['geddy', 'neil', 'alex'],
  html = ejs.renderFile('./test.ejs', (err, str) => {
    res.send(str);
  });
1.4 、参数

上面3个方法中的options可以选择的参数如下:

  • cache 缓存编译后的函数,需要指定 filename
  • filenamecache 参数用做键值,同时也用于 include 语句。
  • context 函数执行时的上下文环境。
  • compileDebug 当值为 false 时不编译调试语句。
  • client 返回独立的编译后的函数。
  • delimiter 放在角括号中的字符,用于标记标签的开与闭。
  • debug 将生成的函数体输出。
  • _with 是否使用 with() {} 结构。如果值为 false,所有局部数据将存储在 locals 对象上。
  • localsName 如果不使用 with ,localsName 将作为存储局部变量的对象的名称。默认名称是 locals
  • rmWhitespace 删除所有可安全删除的空白字符,包括开始与结尾处的空格。对于所有标签来说,它提供了一个更安全版本的 -%> 标签(在一行的中间并不会剔除标签后面的换行符)。
  • escape<%= 结构设置对应的转义(escape)函数。它被用于输出结果以及在生成的客户端函数中通过 .toString() 输出。(默认转义 XML)。
  • outputFunctionName 设置为代表函数名的字符串(例如 'echo''print')时,将输出脚本标签之间应该输出的内容。
  • async 当值为 true 时,EJS 将使用异步函数进行渲染。(依赖于 JS 运行环境对 async/await 是否支持)

2、标签含义

  • <% ‘脚本’ 标签,用于流程控制,无输出。
  • <%_ 删除其前面的空格符
  • <%= 输出数据到模板(输出是转义 HTML 标签)
  • <%- 输出非转义的数据到模板
  • <%# 注释标签,不执行、不输出内容
  • <%% 输出字符串 ‘<%’
  • %> 一般结束标签
  • -%> 删除紧随其后的换行符
  • _%> 将结束标签后面的空格符删除

3、引入其它文件

通过 include 指令将相对于模板路径中的模板片段包含进来。(需要提供 ‘filename‘ 参数。)

因为该项需要使用到fs所以只有在Node环境中才能生效,也就是说需要搭建一个Node后端服务器。

let people = ['geddy', 'neil', 'alex'],
  html = ejs.render(`<%- include('test.ejs') %>`, {filename: 'test.ejs'});

4、自定义分隔符

可针对单个模板或全局使用自定义分隔符:

let ejs = require('ejs'),
    users = ['geddy', 'neil', 'alex'];

// 单个模板文件
ejs.render('<?= users.join(" | "); ?>', {users: users},
    {delimiter: '?'});
// => 'geddy | neil | alex'

// 全局
ejs.delimiter = '$';
ejs.render('<$= users.join(" | "); $>', {users: users});
// => 'geddy | neil | alex'

5、 缓存

EJS 附带了一个基本的进程内缓存,用于缓在渲染模板过程中所生成的临时 JavaScript 函数。 通过 Node 的 lru-cache 库可以很容易地加入 LRU 缓存:

let ejs = require('ejs'),
    LRU = require('lru-cache');
ejs.cache = LRU(100); // 具有 100 条内容限制的 LRU 缓存

如果要清除 EJS 缓存,调用 ejs.clearCache 即可。如果你正在使用的是 LRU 缓存并且需要设置不同的限额,则只需要将 ejs.cache 重置为 一个新的 LRU 实例即可。

6、自定义文件加载器

默认的文件加载器是 fs.readFileSync,如果你想要的自定义它, 设置ejs.fileLoader 即可。

let ejs = require('ejs');
let myFileLoader = function (filePath) {
  return 'myFileLoader: ' + fs.readFileSync(filePath);
};

ejs.fileLoader = myFileLoad;

使用此功能,您可以在读取模板之前对其进行预处理。

7、布局(Layouts)

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

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

三、简单搭建一个复用模块

建一个views文件,下面有

  • header.ejs
  • footer.ejs
  • index.ejs
  • login.ejs

header.ejs

<h1>这是头部</h1>

footer.ejs

<h1>这是尾部</h1>

index.ejs

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
   <%- include("header")%>
    <p><%= name %></p>
    
    <!-- 商品列表页面 -->
    <ul>
        <% for (let i = (page-1)*4;i < page*4;i++) {%>
            <li><%= arr[i] %></li>  
        <%} %>
    </ul>

    <p>当前页码为:<%= page %></p>

    <% if(page == 1){ %>
    当前是首页
    <% }else if(page == 2){ %>
    当前是尾页
    <% }else{ %>
      当前页码有问题
    <% } %>
    
    <%- include("footer")%>
</body>
</html>

login.ejs

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <%- include("header") %> 
    欢迎来到登录页
    <%- include("footer") %> 
</body>
</html>

建一个入口函数app.js

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

//设置默认使用的模板引擎
app.set("view engine","ejs");

app.get("/list",(req,res)=>{
    //分页效果
    let {page} = req.query;
    let arr = ["华为Mate40Pro","华为Mate40RS","华为P40","华为P40 pro","华为 nova9","华为 畅享20e","华为 nova9 pro","华为 nova7",]
    res.render("index",{name:"lisi",arr,page});
})
app.get("/login",(req,res)=>{
    res.render("login");
})
app.get('/', (req, res) => res.send('Hello World!'))
app.listen(port, () => console.log(`Example app listening on port ${port}!`))

运行app.js,在浏览器中输入相应的路由,即可。

四、总结:

Nodejs搭建的后端中可能会用到EJS,但是前端项目一般不会使用EJS

EJS最方便的地方就是在于将项目给别人使用的时候,人家不用过多的去了解你的代码,直接修改配置文件就可以达到自己想要的效果。比如说Hexo中的配置都集中在_config.yml这个文件中,你根本不需要去一行一行的浏览源代码,就可以实现修改,达到你想要的效果。

参考:EJS官网

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个简单的示例代码,实现了一个基本的博客系统。 首先,我们需要创建一个新的node.js项目,并在项目中安装express和mysql模块。 ```bash mkdir blog cd blog npm init -y npm install express mysql --save ``` 然后,我们需要创建一个app.js文件,并在其中配置express应用程序。 ```javascript const express = require('express'); const mysql = require('mysql'); const app = express(); // 配置中间件 app.use(express.urlencoded({ extended: false })); app.use(express.json()); app.use(express.static('public')); // 连接数据库 const db = mysql.createConnection({ host: 'localhost', user: 'root', password: 'password', database: 'blog' }); db.connect((err) => { if (err) { console.error('error connecting: ' + err.stack); return; } console.log('connected as id ' + db.threadId); }); // 设置路由 app.get('/', (req, res) => { db.query('SELECT * FROM posts', (err, results) => { if (err) throw err; res.render('index.ejs', { posts: results }); }); }); app.get('/post/:id', (req, res) => { const id = req.params.id; db.query('SELECT * FROM posts WHERE id = ?', [id], (err, results) => { if (err) throw err; res.render('post.ejs', { post: results[0] }); }); }); app.get('/create', (req, res) => { res.render('create.ejs'); }); app.post('/create', (req, res) => { const title = req.body.title; const content = req.body.content; db.query('INSERT INTO posts SET ?', { title, content }, (err, results) => { if (err) throw err; res.redirect('/'); }); }); // 启动服务器 app.listen(3000, () => { console.log('Server started on port 3000'); }); ``` 在上面的代码中,我们使用ejs模板引擎来渲染HTML页面。我们需要在项目中创建一个views文件夹,并在其中创建index.ejs、post.ejs和create.ejs文件。 index.ejs: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Blog</title> </head> <body> <h1>Blog</h1> <ul> <% for (let post of posts) { %> <li> <a href="/post/<%= post.id %>"><%= post.title %></a> </li> <% } %> </ul> <a href="/create">Create a new post</a> </body> </html> ``` post.ejs: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title><%= post.title %></title> </head> <body> <h1><%= post.title %></h1> <p><%= post.content %></p> <a href="/">Back to index</a> </body> </html> ``` create.ejs: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Create a new post</title> </head> <body> <h1>Create a new post</h1> <form action="/create" method="POST"> <input type="text" name="title" placeholder="Title"> <textarea name="content" placeholder="Content"></textarea> <button type="submit">Create</button> </form> </body> </html> ``` 最后,我们需要在项目中创建一个public文件夹,并在其中创建一个style.css文件,来为页面添加样式。 ```css body { font-family: Arial, sans-serif; } h1 { font-size: 32px; font-weight: bold; } ul { list-style: none; padding: 0; } li { margin-bottom: 10px; } a { text-decoration: none; color: blue; } input[type="text"], textarea { display: block; width: 100%; margin-bottom: 10px; } button[type="submit"] { display: block; margin-top: 10px; } ``` 以上就是一个简单的node.js+express+mysql实现博客系统的示例代码,可以根据实际情况进行调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值