如何使用EJS模板化您的节点应用程序

来自菜鸟教程
跳转至:导航、​搜索

介绍

在快速创建 Node 应用程序时,有时需要一种快速模板化应用程序的方法。

Jade 是 Express 默认模板引擎,但对于许多用例来说,Jade 语法可能过于复杂。

嵌入式 JavaScript 模板 (EJS) 可用作替代模板引擎。

在本文中,您将学习如何将 EJS 应用到 Express 应用程序、包括站点的可重复部分以及将数据传递给视图。

先决条件

如果您想继续阅读本文,您将需要:

  • Node.js 的本地开发环境。 关注【X7X】如何安装Node.js并创建本地开发环境【X76X】。

本教程最初是为 express v4.17.1 和 ejs v3.1.5 编写的。 已通过 Node v16.0.0、npm v7.11.1、express v4.17.1 和 ejs v3.1.6 验证。

第 1 步 — 设置项目

首先,打开终端窗口并创建一个新的项目目录:

mkdir ejs-demo

然后,导航到新创建的目录:

cd ejs-demo

此时,您可以初始化一个新的 npm 项目:

npm init -y

接下来,您需要安装 express 软件包:

npm install express@4.17.1

然后安装ejs包:

npm install ejs@3.1.6

此时,您已经准备好使用 Express 和 EJS 的新项目。

第 1 步 — 使用 server.js 进行配置

安装完所有依赖项后,让我们将应用程序配置为使用 EJS 并为 Index 页面和 About 页面设置路由。

创建一个新的 server.js 文件并使用代码编辑器打开它并添加以下代码行:

服务器.js

var express = require('express');
var app = express();

// set the view engine to ejs
app.set('view engine', 'ejs');

// use res.render to load up an ejs view file

// index page
app.get('/', function(req, res) {
  res.render('pages/index');
});

// about page
app.get('/about', function(req, res) {
  res.render('pages/about');
});

app.listen(8080);
console.log('Server is listening on port 8080');

此代码定义应用程序并侦听端口 8080

此代码还将 EJS 设置为 Express 应用程序的视图引擎,使用:

`app.set('view engine', 'ejs');`

请注意代码如何使用 res.render() 向用户发送视图。 需要注意的是,res.render() 将在 views 文件夹中查找视图。 所以你只需要定义pages/index,因为完整路径是views/pages/index

接下来,您将使用 EJS 创建视图。

第 2 步 — 创建 EJS 部分

就像您构建的许多应用程序一样,会有很多代码被重用。 这些被认为是部分。 在此示例中,将在索引页面和关于页面上重复使用三个部分:head.ejsheader.ejsfooter.ejs。 现在让我们制作这些文件。

新建views目录:

mkdir views

然后,创建一个新的 partials 子目录:

mkdir views/partials

在此目录中,创建一个新的 head.ejs 文件并使用您的代码编辑器打开它。 添加以下代码行:

意见/部分/head.ejs

<meta charset="UTF-8">
<title>EJS Is Fun</title>

<!-- CSS (load bootstrap from a CDN) -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.5.2/css/bootstrap.min.css">
<style>
  body { padding-top:50px; }
</style>

此代码包含 HTML 文档的 head 的元数据。 它还包括 Bootstrap 样式。

接下来,创建一个新的 header.ejs 文件并使用代码编辑器打开它。 添加以下代码行:

视图/部分/header.ejs

<nav class="navbar navbar-expand-lg navbar-light bg-light">
  <a class="navbar-brand" href="/">EJS Is Fun</a>
  <ul class="navbar-nav mr-auto">
    <li class="nav-item">
      <a class="nav-link" href="/">Home</a>
    </li>
    <li class="nav-item">
      <a class="nav-link" href="/about">About</a>
    </li>
  </ul>
</nav>

此代码包含 HTML 文档的导航,并使用 Bootstrap 中的几个类进行样式设置。

接下来,创建一个新的 footer.ejs 文件并使用代码编辑器打开它。 添加以下代码行:

视图/部分/footer.ejs

<p class="text-center text-muted">&copy; Copyright 2020 The Awesome People</p>

此代码包含版权信息并使用 Bootstrap 中的几个类进行样式设置。

接下来,您将在 index..ejsabout.ejs 中使用这些分音。

第 3 步 — 将 EJS 部分添加到视图中

您定义了三个部分。 现在你可以在你的视图中include它们。

使用 <%- include('RELATIVE/PATH/TO/FILE') %> 将 EJS 部分嵌入到另一个文件中。

  • 连字符 <%- 而不是 <% 告诉 EJS 呈现原始 HTML。
  • 部分路径是相对于当前文件的。

然后,创建一个新的 pages 子目录:

mkdir views/pages

在此目录中,创建一个新的 index.ejs 文件并使用您的代码编辑器打开它。 添加以下代码行:

视图/页面/index.ejs

<!DOCTYPE html>
<html lang="en">
<head>
  <%- include('../partials/head'); %>
</head>
<body class="container">

<header>
  <%- include('../partials/header'); %>
</header>

<main>
  <div class="jumbotron">
    <h1>This is great</h1>
    <p>Welcome to templating using EJS</p>
  </div>
</main>

<footer>
  <%- include('../partials/footer'); %>
</footer>

</body>
</html>

保存对此文件的更改,然后运行应用程序:

node server.js

如果您在网络浏览器中访问 http://localhost:8080/,您可以观察到 Index 页面:

接下来,创建一个新的 about.ejs 文件并使用代码编辑器打开它。 添加以下代码行:

视图/页面/about.ejs

<!DOCTYPE html>
<html lang="en">
<head>
  <%- include('../partials/head'); %>
</head>
<body class="container">

<header>
  <%- include('../partials/header'); %>
</header>

<main>
<div class="row">
  <div class="col-sm-8">
    <div class="jumbotron">
      <h1>This is great</h1>
      <p>Welcome to templating using EJS</p>
    </div>
  </div>

  <div class="col-sm-4">
    <div class="well">
      <h3>Look I'm A Sidebar!</h3>
    </div>
  </div>
</div>
</main>

<footer>
  <%- include('../partials/footer'); %>
</footer>

</body>
</html>

此代码添加了一个 Bootstrap 侧边栏,以演示如何构建部分组件以跨不同模板和页面重用。

保存对此文件的更改,然后运行应用程序:

node server.js

如果您在网络浏览器中访问 http://localhost:8080/about,您可以通过侧边栏观察“关于”页面:

现在您可以开始使用 EJS 将数据从 Node 应用程序传递到视图。

第 4 步 - 将数据传递给视图和部分

让我们定义一些基本变量和一个要传递给索引页面的列表。

在代码编辑器中重新访问 server.js 并在 app.get('/') 路由中添加以下代码行:

服务器.js

var express = require('express');
var app = express();

// set the view engine to ejs
app.set('view engine', 'ejs');

// use res.render to load up an ejs view file

// index page
app.get('/', function(req, res) {
  var mascots = [
    { name: 'Sammy', organization: "DigitalOcean", birth_year: 2012},
    { name: 'Tux', organization: "Linux", birth_year: 1996},
    { name: 'Moby Dock', organization: "Docker", birth_year: 2013}
  ];
  var tagline = "No programming concept is complete without a cute animal mascot.";

  res.render('pages/index', {
    mascots: mascots,
    tagline: tagline
  });
});

// about page
app.get('/about', function(req, res) {
  res.render('pages/about');
});

app.listen(8080);
console.log('Server is listening on port 8080');

此代码定义了一个名为 mascots 的数组和一个名为 tagline 的字符串。 接下来,让我们在index.ejs中使用它们。

在 EJS 中渲染单个变量

要回显单个变量,您可以使用 <%= tagline %>

在代码编辑器中重新访问 index.ejs 并添加以下代码行:

视图/页面/index.ejs

<!DOCTYPE html>
<html lang="en">
<head>
  <%- include('../partials/head'); %>
</head>
<body class="container">

<header>
  <%- include('../partials/header'); %>
</header>

<main>
  <div class="jumbotron">
    <h1>This is great</h1>
    <p>Welcome to templating using EJS</p>

    <h2>Variable</h2>
    <p><%= tagline %></p>
  </div>
</main>

<footer>
  <%- include('../partials/footer'); %>
</footer>

</body>
</html>

此代码将在索引页面上显示 tagline 值。

在 EJS 中循环数据

要循环数据,您可以使用 .forEach

在代码编辑器中重新访问 index.ejs 并添加以下代码行:

视图/页面/index.ejs

<!DOCTYPE html>
<html lang="en">
<head>
  <%- include('../partials/head'); %>
</head>
<body class="container">

<header>
  <%- include('../partials/header'); %>
</header>

<main>
  <div class="jumbotron">
    <h1>This is great</h1>
    <p>Welcome to templating using EJS</p>

    <h2>Variable</h2>
    <p><%= tagline %></p>

    <ul>
      <% mascots.forEach(function(mascot) { %>
        <li>
          <strong><%= mascot.name %></strong>
          representing <%= mascot.organization %>,
          born <%= mascot.birth_year %>
        </li>
      <% }); %>
    </ul>
  </div>
</main>

<footer>
  <%- include('../partials/footer'); %>
</footer>

</body>
</html>

保存对此文件的更改,然后运行应用程序:

node server.js

如果您在网络浏览器中访问 http://localhost:8080/,您可以使用 mascots 观察索引页面:

在 EJS 中将数据传递给 Partial

EJS 部分可以访问与父视图相同的所有数据。 不过要小心。 如果您在部分中引用变量,则需要在使用部分的每个视图中定义它,否则将引发错误。

您还可以在包含语法中定义变量并将其传递给 EJS 部分,如下所示:

视图/页面/about.ejs

...
<header>
  <%- include('../partials/header', {variant: 'compact'}); %>
</header>
...

但是您需要再次小心假设已定义变量。

如果你想在一个可能并不总是定义的部分中引用一个变量,并给它一个默认值,你可以这样做:

视图/部分/header.ejs

...
<em>Variant: <%= typeof variant != 'undefined' ? variant : 'default' %></em>
...

在上面的行中,EJS 代码将渲染 variant 的值(如果已定义),如果未定义则渲染 default

结论

在本文中,您学习了如何将 EJS 应用于 Express 应用程序、包含站点的可重复部分以及将数据传递给视图。

EJS 允许您在不需要额外复杂性时构建应用程序。 通过使用局部变量并能够轻松地将变量传递给您的视图,您可以快速构建一些出色的应用程序。

有关特性和语法的更多信息,请参阅 EJS 文档 。 参考 Comparing JavaScript Templating Engines: Jade, Mustache, Dust and More 了解不同视图引擎的优缺点。