【问题标题】:Generate HTML files through Express/EJS/FS and serve them through Nginx instead of express通过 Express/EJS/FS 生成 HTML 文件并通过 Nginx 而不是 express 提供它们
【发布时间】:2022-01-20 05:34:06
【问题描述】:

假设我们有一个 JSON:

[
  {
    "id": 1,
    "title": "Title 1",
    "description": "Description 1"
  },
  {
    "id": 2,
    "title": "Title 2",
    "description": "Description 2"
  },
  {
    "id": 3,
    "title": "Title 3",
    "description": "Description 3"
  }
]

还有一个名为 index.ejs 的 EJS 文件

<!DOCTYPE html>
<html lang="en">
  <body>
    <% data.forEach(item => { %>
    <h1><%- item.title %></h1>
    <p><%- item.description %></p>
    <% }) %>
  </body>
</html>

我可以简单地使用这个 javascript 代码通过 express 呈现数据:

const express = require("express");
const app = express();

const data = require("./data.json");

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

app.get("/", (req, res) => {
  res.render("index", { data });
});

app.listen(4000);

但是,如果我想创建 3 个 HTML 页面并通过 Nginx 提供它们怎么办? 我可以使用 fs 创建 html 文件。但问题是,如何使用 EJS 创建 3 个生成的页面,但通过 Nginx 而不是 node.js 的 app.get() 呈现页面?

【问题讨论】:

    标签: javascript node.js express nginx fs


    【解决方案1】:

    如果数据是静态的(预先知道并且不会更改),您可以通过编写使用 EJS 生成 HTML 文件的单独 nodejs 脚本然后保存来生成 HTML 页面作为某些构建过程的一部分生成的 HTML 文件到 nginx 特定目录,让 nginx 从那里提供静态网页。

    我为 github.io 网站做了类似的事情,我使用 nodejs 脚本和模板引擎预生成静态 HTML 页面,然后通过 github.io 提供这些页面。这让我可以使用模板的特性(通用页眉、通用页脚、通用样式等)来生成一组静态 HTML 页面。当我想更新网页时,我可以只更新模板并重新生成,而不是手动编辑每个 HTML 页面。

    如果数据是动态的,那么 nginx 不知道如何生成它们,因为它不直接支持这些类型的模板引擎(它们是为 Javascript 引擎设计的),所以你会坚持从 nodejs 提供 EJS 模板。

    【讨论】:

    • 非常感谢您的广泛回答,一旦发生更改,我想重建 HTML 页面,呈现的数据无论如何都是静态的。我在一个大型网站上工作,所以我认为通过 Nginx 将内容作为纯 HTML 文件提供比 express 快得多,每次加载页面时都会向数据库发出请求。能否请您详细说明如何将生成的 EJS 页面转换为本地 HTML 文件?
    • @CedricHadjian - 所有模板引擎都有一个 Javascript 接口,用于直接生成 HTML,而不是在 Express 中使用它们。有关如何在不使用 Express 的情况下从模板生成 HTML 的示例,请参阅 EJS doc。可能您创建自己的 nodejs 构建程序并使用ejs.renderFile(...),然后将生成的输出写入您选择的文件和目录,nginx 可以从中提供它们。您收集模板中的数据,然后将其与模板文件的路径一起传递给ejs.renderFile()
    • 谢谢,这非常有帮助!
    • 好的,谢谢。另外,看看这个链接,这正是我想要的:stackoverflow.com/questions/30976477/…
    • @CedricHadjian - 这就是概念。我认为使用ejs.renderFile() 会节省一些步骤。
    猜你喜欢
    • 2017-03-02
    • 2013-08-05
    • 2020-08-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 2012-07-23
    • 2017-06-04
    • 1970-01-01
    相关资源
    最近更新 更多