NodeJs 中的 HTML 模板

news2025/1/12 4:09:00
  • 💂 个人网站:【海拥】【摸鱼游戏】【神级源码资源网】
  • 🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】
  • 💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】

HTML 模板是一种允许我们创建基本 HTML 结构并使用占位符根据从 JSON 文件或数据库中检索到的数据动态生成内容的技术。

让我们考虑一个假设实例,其中我们的网站包含许多产品卡,每个卡都包含从 JSON 文件中检索到的特定产品详细信息。

现在,如果我们要从 JSON 文件中添加或删除任何产品,我们将如何在前端动态更新相应的卡片?

考虑到我们基于内容的数据存储在 JSON 文件中,我们可以继续从现有的 HTML 代码创建可重用的模板。

第 1 步:构建模板

作为开发人员,您可能熟悉提供动态 Web 内容的概念。实现这一目标的一种方法是使用模板。

我们将创建两个 HTML 模板,一个用于产品概览页面,一个用于单个产品卡片。

第一个模板template-card.html用作单个产品卡片的蓝图,第二个模板template-overview.html用作概览页面的蓝图。这些模板包含占位符,当用户请求页面时,这些占位符将被替换为实际内容。

确保您的占位符不包含任何属于 HTML 代码的符号。占位符的常用语法是{%PLACEHOLDER_NAME%}.

这是template-card.html我们的第一个模板,用作根据需要动态创建尽可能多的卡片的蓝图。

<figure class="card">
    <div class="card__emoji">{%IMAGE%}{%IMAGE%}</div>
    <div class="card__title-box">
      <h2 class="card__title">{%PRODUCTNAME%}</h2>
    </div>

    <div class="card__details">
      <div class="card__detail-box">
          <h6 class="card__detail card__detail 
               {%NOT_ORGANIC%}"> Organic!</h6>
      </div>

      <div class="card__detail-box">
        <h6 class="card__detail">{%QUANTITY%} per 📦</h6>
      </div>

      <div class="card__detail-box">
        <h6 class="card__detail card__detail--price"> 
            {%PRICE%}€</h6>
      </div>
    </div>

    <a class="card__link" href="/product?id={%ID%}">
      <span>Detail <i class="emoji-right">👉</i></span>
    </a>
  </figure>

由于此卡片将用作模板,因此其中包含的信息也应替换为占位符。添加占位符后,卡片将类似于以下内容:

<figure class="card">
    <div class="card__emoji">🥦🥦</div>
    <div class="card__title-box">
      <h2 class="card__title">Apollo Broccoli</h2>
    </div>

    <div class="card__details">
      <div class="card__detail-box">
          <h6 class="card__detail card__detail--organic">Organic!</h6>
      </div>

      <div class="card__detail-box">
        <h6 class="card__detail">3🥦 per 📦</h6>
      </div>

      <div class="card__detail-box">
        <h6 class="card__detail card__detail- 
              price">5.50</h6>
      </div>
    </div>

    <a class="card__link" href="/product?id=">
      <span>Detail <i class="emoji-right">👉</i></span>
    </a>
  </figure>

锚标记包含一个 href 链接,其中包含一个 ID 的占位符。这表明我们的 JSON 文件中的每张卡或产品都有一个不同的 ID。这些 ID 是唯一的,将用于在路由过程中识别每个产品。

此外,当我们需要根据元素的类别设置元素样式时,CSS 类和 ID 可以用占位符代替,就像在图像示例中所做的那样。这种方法在这种情况下特别有用。

<body>
  <div class="container">
    <h1>🌽 Node Farm 🥦</h1>

    <div class="cards-container">
      {%PRODUCT_CARDS%}
    </div>
  </div>
</body>

在此示例中,我们已将模板卡片替换为占位符。请务必记住,我们将使用这个单一模板卡片动态生成多张卡片。

注意:这是我们的第二张模板卡,template-overview.html

第 2 步:填充模板

有趣的部分来了,通过用实际内容替换我们的占位符来填充我们的模板。

当用户请求 URL 时,代码会同步读取相关模板文件(或者template-overview.htmltemplate-card.html),用 JSON 文件中的内容动态填充它,并将相关内容作为响应发回给用户。

这是通过使用函数实现的replaceTemplate,该函数用实际内容替换模板中的占位符。

// SECOND STEP:
const replaceTemplate = (temp, product) => {
    let output = temp.replace(/{%PRODUCTNAME%}/g, product.productName);
    output = output.replace(/{%IMAGE%}/g, product.image);
    output = output.replace(/{%PRICE%}/g, product.price);
    output = output.replace(/{%ID%}/g, product.id); 
     // /g is a regex global flag
    return output;
}

// FIRST STEP:
const tempOverview = fs.readFileSync(`${__dirname}/templates/template-overview.html`, 'utf-8');
const tempCard = fs.readFileSync(`${__dirname}/templates/template-card.html`, 'utf-8');
const data = fs.readFileSync(`${__dirname}/dev-data/data.json`, 'utf-8');
const dataObj = JSON.parse(data);

// THIRD STEP:
const server = http.createServer((req, res) => {
    const pathName = req.url;

    //FOURTH STEP:
    //Here is the Overview
    if(pathName === '/' || pathName === '/overview') {
        res.writeHead(200, {'Content-type': 'text/html'});
        const cardsHtml = dataObj.map(el => replaceTemplate(tempCard, el)).join('');
        const output = tempOverview.replace('{%PRODUCT_CARDS%', cardsHtml);

        res.end(output);

        //API
    } else if(pathName === '/api') {
        res.writeHead(200, {'Content-type': 'application/json'});
        res.end(data);
    // Not Found
    } else {
            res.writeHead(404, {
            'Content-type': 'text/html', //standard header
            'my-header': 'hello-world'
        });
        res.end('<h1>This page cannot be found.</h1>');
    }
});

server.listen(8000, '127.0.0.1', () => {
    console.log('Listening to requests on port 8000');
});
    res.writeHead(404, {
            'Content-type': 'text/html', //standard header
            'my-header': 'hello-world'
        });
        res.end('<h1>This page cannot be found.</h1>');
    }
});

server.listen(8000, '127.0.0.1', () => {
    console.log('Listening to requests on port 8000');
});

别担心,我们将仔细研究上面的大块代码,并用更简单的术语弄清楚它的作用。

  • 首先,读取两个 HTML 模板文件和存储在 JSON 文件中的产品数据
  • 其次,定义一个函数,用特定于产品的数据替换模板中的占位符。在这里,我们的函数被命名为replaceTemplate
  • 第三、监听传入的 HTTP 请求并检查请求 URL 的路径名
  • 第四,如果路径名为//overview,则使用replaceTemplatefunction和JSON文件中的产品数据替换tempCard模板中的占位符,为每个产品卡生成HTML代码。
  • 然后连接每张卡片的结果 HTML 以创建字符串cardsHtml。然后修改模板tempOverview以包含 cardsHtml 字符串,并将生成的 HTML 代码作为响应发回。
  • 此外,如果路径名是,/api它会以 JSON 格式发回产品数据作为响应
  • 最后,如果路径名是其他任何内容,则发回 404 错误消息。

哇,那段代码看起来确实很多,但如果我们仔细看,一步一步来,它并没有那么复杂。

它所做的只是用真实信息替换一些特殊词并将其发送回网站,以便人们可以看到它!

HTML 模板的好处

HTML 模板提供了几个好处,使其成为 Web 开发人员的热门选择:

  • 通过使用 HTML 模板,我们将内容与表示分离,允许开发人员生成可重复使用的模板,这些模板可以处理来自多个来源的不同数量的数据,并维护类似代码的多个副本。
  • HTML 模板为呈现数据、改善用户体验和轻松导航站点提供了标准结构。
  • 模板的灵活性使得修改底层数据变得更加容易。这节省了时间和精力,因为开发人员不需要手动更改 HTML 代码。
  • 由于 HTML 模板可重复使用,因此更易于维护和更新。可以在不修改模板代码的情况下对基础数据进行更改,从而降低出错的可能性。
  • HTML 模板可以在不影响性能的情况下处理大量数据。这使其成为具有大量动态内容的网站的理想选择。

总之,HTML 模板是一种高效、一致、灵活且可扩展的技术,可简化动态 Web 内容的开发和维护。

通过将内容与表示分离,HTML 模板使开发人员能够创建可重用的模板,这些模板可以处理不同数量的数据,而无需将内容硬编码到每个页面中。

拓展部分:

Node.js 中还有其他几个可用的模板引擎,例如 EJS、Pug(以前称为 Jade)、Handlebars 和 Mustache 等。

要在 Node.js 中使用模板引擎,您需要通过 npm 安装它,然后在您的代码中需要它。这些引擎提供了一种通过将数据插入模板内的占位符来生成 HTML 的方法。

⭐️ 好书推荐

《特效师手册:影视剪辑与特效制作从入门到精通(剪映版)》

在这里插入图片描述

【内容简介】

本书根据作者多年的特效制作经验,结合目前年轻人喜爱的短视频特效,设计、讲解了 11 章内容,包括影视剪辑与特效基础、画面特效与人物特效、使用蒙版合成画面、混合模式合成效果、用关键帧制作特效、掌握剪映抠图特效、剪辑影视解说视频、制作影视字幕特效,以及制作热门的武侠类特效、仙侠类特效和科幻类特效等,帮助读者在较短的时间内,从新手成为剪映影视剪辑和特效制作高手。本书既讲解了如何在剪映电脑版中进行影视剪辑与特效制作,也讲解了剪映手机版的案例制作步骤,让读者买一本书精通剪映的两个版本,轻松玩转剪映电脑版 + 手机版,随时随地制作出精彩的影视混剪与特效视频。

📚 京东自营购买链接:《特效师手册:影视剪辑与特效制作从入门到精通(剪映版)》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/379745.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

信息系统基本知识(二)

大纲 信息系统与信息化信息系统开发方法常规信息系统集成技术软件工程新一代信息技术信息系统安全技术信息化发展与应用信息系统服务管理信息系统服务规划企业首席信息管及其责任 1.3 常规信息系统集成技术 系统集成&#xff1a;是指将计算机软硬件、网络通信等技术和产品集…

金三银四,助力你的大厂梦,2023年软件测试经典面试真题(1)(共3篇)

前言 金三银四即将到来&#xff0c;相信很多小伙伴要面临面试&#xff0c;一直想着说分享一些软件测试的面试题&#xff0c;这段时间做了一些收集和整理&#xff0c;下面共有三篇经典面试题&#xff0c;大家可以试着做一下&#xff0c;答案附在后面&#xff0c;希望能帮助到大…

如何实现双轮差速底盘躲避悬崖的功能?

1. 功能说明 本实验使用的样机为R023样机小型双轮差速底盘。在样机前方安装3个近红外传感器 &#xff0c;实现机器人躲避悬崖、在某平台上移动时不会掉下去的效果。 2. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板Basra&…

C/C++每日一练(20230301)

目录 1. 冒泡排序法排序 ★ 2. 有效的数独 ★★ 3. 不同的二叉搜索树 II ★★ 附录 二叉搜索树 1. 冒泡排序法排序 输入n&#xff08;1≤n≤10&#xff09;个整数&#xff0c;用冒泡排序法对其从小到大排序&#xff0c;共进行n-1趟&#xff0c;要求输出每一趟的排序情…

操作系统页表

页和段的区别 页式&#xff0c;一个程序的各页是根据你的程序空间连续编址的&#xff0c;程序地址空间只有一维&#xff1b; 而段式&#xff0c;一个程序拆分成各段&#xff0c;独立编址&#xff08;各段都从零开始编址&#xff09;&#xff0c;程序地址空间有两维。 例如一…

人工智能高等数学--微积分_导数意义_求导公式_绝对值函数_relu函数_导数物理意义_几何意义---人工智能工作笔记0025

实际上这里看了看,这些数学的概念,有一定作用,但是综合来看,也可以先把人工智能课程都看一遍,大概知道怎么回事, 带着目的再来看人工智能的高等数学部分,这里,这些内容很花时间... 首先看人工智能用到的数学中的微积分~ 首先看这里的导数是什么意思? 其实就是,导数的公式是…

Ajax学习笔记01

引入 翻译成中文就是“异步的Javascript和XML”。即使用Javascript语言与服务器进行异步交互&#xff0c;传输的数据为XML&#xff08;当然&#xff0c;传输的数据不只是XML&#xff09;。 AJAX 不是新的编程语言&#xff0c;而是一种使用现有标准的新方法。 AJAX 最大的优点…

word中运行Mathtype报错、以及WordCmds.dot报错问题解决方案

1. 首先&#xff0c;先把电脑里的Mathtype卸载干净&#xff0c;然后重新安装。也可以尝试直接覆盖安装。 2. 安装之后将Mathtype里面的以下几个文件拷出来安装到不同的文件夹中&#xff1a; Office Support文件夹中&#xff1a; MathType Commands 2016.dotm WordCmds.dot …

【Leedcode】栈和队列必备的面试题(第三期)

【Leedcode】栈和队列必备的面试题&#xff08;第三期&#xff09; 文章目录【Leedcode】栈和队列必备的面试题&#xff08;第三期&#xff09;一、题目&#xff08;用两个栈实现队列&#xff09;二、思路图解1.定义两个栈2.初始化两个数组栈3. 将数据放入pushST数组栈中4.删除…

指标体系—北极星指标体系

北极星指标体系 每个产品都有很多指标,每个指标都反映了对应业务的经营情况。但是在实际业务经营中,却要求我们在不同的产品阶段寻找到合适的指标,让这个指标可以代表当前产品阶段的方向和目标,让这个指标不仅对业务经营团队,而且对产品的用户、对产品的价值都能有很好的…

③【Java 组】蓝桥杯省赛真题 [黄金连分数][马虎的算式]持续更新中...

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 蓝桥杯真题--持续更新中...一、黄金连分数&…

echarts图表设置关于图例legend,限制图例可点击时最少保留显示一个图例

echarts图表设置关于图例legend&#xff0c;限制图例可点击时最少保留显示一个图例 echarts图表设置关于图例legend&#xff0c;限制图例可点击时最少保留显示一个图例&#xff0c;亲测有效&#xff1b; 代码如下&#xff1a; // 初始化ecahrts let echartsWrapper this.$e…

【Leedcode】栈和队列必备的面试题(第二期)

【Leedcode】栈和队列必备的面试题&#xff08;第二期&#xff09; 文章目录【Leedcode】栈和队列必备的面试题&#xff08;第二期&#xff09;一、题目&#xff08;用两个队列实现栈&#xff09;二、思路图解1.定义两个队列2.初始化两个队列3.往两个队列中放入数据4.两个队列出…

Linux 自带按键驱动

目录 一、内核检查 二、驱动文件 三、设备树 四、验证 一、内核检查 内核一般默认已经使能了 KEY 驱动&#xff0c;但是还是要检查一下。按照如下路径找到相应的配置选项&#xff1a; Device Drivers -> Input device support -> Generic in…

WebRTC拥塞控制原理解析

WebRTC包含三种拥塞控制算法&#xff0c;GCC、BBR和PCC。其中&#xff0c;BBR一开始是针对TCP的拥塞控制提出来的。它的输入为ACK/SACK&#xff0c;输出为拥塞窗口(congestion_window)发送速度(pacing_rate)。BBR是怎样运用到UDP&#xff0c;甚至运用到实时流媒体传输之上的&am…

Java-封装、继承、多态

封装 访问控制权限又成为“封装”&#xff0c;是面向对象三大特征中的一种。核心是&#xff0c;只对需要的类可见。 继承 继承是所有OOP&#xff08;Object Oriented Programming&#xff09;语言和Java语言都不可或缺的一部分。 只要创建一个类&#xff0c;就隐式继承自Obje…

【计算机组成原理】计算机硬件的基础组成、认识各个硬件部件

计算机组成原理&#xff08;一&#xff09; 计算机内部是通过电信号传递数据 电信号&#xff1a;分为高电平和低电平&#xff0c;分别代表1/0 数字、文字、图像如何用二进制表示? CPU如何对二进制数进行加减乘除? 如何存储这些二进制数的? 如何从内存中取出想要的数…

RuoYi-Flowable-Plus搭建(若依)

项目简介 1.本项目基于 RuoYi-Vue-Plus 进行二次开发&#xff0c;采用 Flowable 扩展工作流应用场景&#xff0c;支持在线表单设计和丰富的工作流程设计能力。2.本项目主要针对Flowable工作流场景开发&#xff0c;采用MIT开源协议&#xff0c;完全免费给个人及企业使用。3.环境…

(小甲鱼python)函数笔记合集七 函数(IX)总结 函数的递归、递归和迭代的区别详解

一、基础复习 函数的基本用法 创建和调用函数 函数的形参与实参等等函数的几种参数 位置参数、关键字参数、默认参数等函数的收集参数*args **args 解包参数详解函数中参数的作用域 局部作用域 全局作用域 global语句 嵌套函数 nonlocal语句等详解函数的闭包&#xff08;工厂函…

华为OD机试题【有效子字符串】用 C++ 进行编码 (2023.Q1)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明有效子…