nodejs express ejs 模板引擎

官网

简单的视图渲染示例

下面我们通过一个简单示例回顾下 EJS 渲染过程:

var express = require("express");
var path = require("path");
var app = express();

app.set("view engine", "ejs");

app.set("views", path.resolve(__dirname, "views"));

app.get("/", function(req, res) {
    res.render("index");
});

app.listen(3000);

复杂的视图渲染
下面我们看一个更为复杂的示例,其中会同时用到两个视图引擎 Pug 和 EJS:

var express = require("express");
var path = require("path");
var ejs = require("ejs");
var app = express();
app.locals.appName = "Song Lyrics";
app.set("view engine", "jade");
app.set("views", path.resolve(__dirname, "views"));
app.engine("html", ejs.renderFile);
app.use(function(req, res, next) {
    res.locals.userAgent = req.headers["user-agent"];
    next();
});
app.get("/about", function(req, res) {
    res.render("about", {
        currentUser: "india-arie123"
    });
});
app.get("/contact", function(req, res) {
    res.render("contact.ejs");
});
app.use(function(req, res) {
    res.status(404);
    res.render("404.html", {
        urlAttempted: req.url
    });
});
app.listen(3000);
  1. 紧接着,我们将会设置是否启用视图缓存。其实视图缓存并不是缓存视图实际上它缓存的视图路径。例如,它会将 views/my_views.ejs 路径缓存起来并绑定到 EJS 引擎上。

Express 通过两种方式来决定是否对视图文件进行缓存:
 
文档记录方式:通过调用 app.enabled(“view cache”) 开启。在开发模式下默认是被禁用的,但是你可以在正式生产环境中开启。当然,你可以通过 app.disable(“view cache”) 手动关闭。
 
非文档记录方式:根据第一步上下文中的 cache 对象是否为 true 来决定是否缓存该文件。这样你就可以对每一个文件进行自定义设置了。

  • Express 给客户端默认响应的内容是 HTML。虽然大多数时候这没什么问题,但是有时可能需要返回的是纯文本、XML、JSON 等格式。此时,你可以通过修改参数 res.type 进行自定义设置:
app.get(/, function(req, res) { 
  res.type(“text”); 
  res.render(“myview”, { 
   currentUser: “Gilligan” 
  }); 
} 

EJS 语法

除了用做 HTML 模版之外,它还能应用于字符串和纯文本中。请看 EJS 是如何对下面文本模版进行渲染的
/* 注意这里有个bug 当变量没有定义时 不能直接用if 语句,要加上locals 例:locals */ 参考

Hi <%= name %>!
You were born in <%= birthyear %>, so that means you're <%= (new Date()).getFullYear() - birthyear %> years old.
<% if (career) { -%>
  <%=: career | capitalize %> is a cool career!
<% } else { -%>
  Haven't started a career yet? That's cool.
<% } -%>
Oh, let's read your bio: <%- bio %> See you later!

将下面的 JSON 数据传入上面摸板中:

{
    name: "Tony Hawk",
    birthyear: 1968,
    career: "skateboarding",
    bio: "<b>Tony Hawk</b> is the coolest skateboarder around."
}

在已有 EJS 文件中嵌入其他 EJS 模版
EJS 引擎允许你在当前模版中使用另一个 EJS 模版。这样我们就能对整个进行组件拆分复用。例如,将 HTML 的头部和尾部拆分为 header 和 footer 模块,然后在其他模版中进行组合复用。

示例如下:首先我们创建 header.ejs 并拷贝代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <link rel="stylesheet" href="/the.css">
    <title><%= appTitle %>/title>
</head>
<body>
    <header>
        <h1><%= appTitle %></h1>
    </header>

紧接着创建 footer 组件 footer.ejs 并拷贝代码:

<footer>
    All content copyright <%= new Date().getFullYear() %> <%= appName %>.
</footer>
</body>
</html>

最后,我们通过 include 语法进行组件嵌入操作:

<% include header %>
    <h1>Welcome to my page!</h1>
    <p>This is a pretty cool page, I must say.</p>
<% include footer %>

假设,你现在需要实现一个展示用户信息的组建,那么你可以创建 userwidget.ejs 文件并拷贝

<div class="user-widget">
    <img src="<%= user.profilePicture %>">
    <div class="user-name"><%= user.name %></div>
    <div class="user-bio"><%= user.bio %></div>
</div>

那么,在渲染当前用户时可以这样使用该模版:

<% user = currentUser %>
<% include userwidget %>

或者在渲染用户列表时:

<% userList.forEach(function(user) { %>
  <% include userwidget %>
<% } %>

添加你自己的过滤器
Express 内置的 22 个过滤器,其中包括对数组和字符串的常用操作。通常情况下,它们能过满足你的需求,但是有时你不得不添加自己的过滤器。

假设,现在你已经引入了 EJS 模块并将其保存到名为 ejs 变量中。那么你可以为按照下面的方式为 ejs.filters 拓展一个用于数组求和的过滤器。

ejs.filters.sum = function(arr) {
  var result = 0;
  for (var i = 0; i < arr.length; i++) {
    result += arr[i];
  }
  return result;
};

然后,你就可以在代码中使用该过滤器了:

<%=: myarray | sum %>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值