当前位置: 首页> 技术教程> 正文

模板引擎是什么,express框架的创建教程

宁旺春土特产品

在前后端架构尚未完全解耦的传统Web开发场景,以及对搜索引擎优化有明确要求的服务端渲染项目中,开发者往往需要将后端接口查询到的动态数据、业务逻辑判断结果与HTML页面结构结合,生成完整的可渲染页面返回给客户端浏览器,若是依靠手动拼接HTML字符串的方式实现这一过程,不仅开发效率极低,还极易出现标签闭合错误、特殊字符转义疏漏、跨站脚本攻击隐患等问题,模板引擎正是为了解决这类痛点诞生的工具。

模板引擎是什么,express框架的创建教程

简单来说,模板引擎是一类遵循特定语法规则,用于实现数据与视图分离的渲染工具,它允许开发者在预设的模板文件中通过占位符、逻辑标签标记出动态内容的位置与渲染规则,运行时接收后端传递的数据对象,经过语法解析、变量替换、逻辑执行等步骤,最终生成标准的静态HTML文档。相较于直接拼接字符串的开发方式,模板引擎的优势十分明显:一方面它实现了视图层与逻辑层的解耦,前端开发者可以专注于页面结构与样式的优化,后端开发者只需关注业务逻辑与数据传递,大幅提升了团队协作效率;另一方面模板引擎支持公共页面片段的复用,比如网站的导航栏、底部版权栏、侧边栏等通用模块只需编写一次,就能在所有页面中引入调用,避免了大量重复代码的冗余,也降低了后期维护的成本。目前主流的服务端模板引擎种类丰富,不同产品的语法风格与适用场景各有差异,比如贴近原生HTML语法、上手门槛极低的EJS,采用缩进式极简语法、代码量更少的Pug(原Jade),以及强调逻辑与视图分离、内置丰富辅助工具的Handlebars,都是Node.js生态中应用十分广泛的模板引擎。

说到Node.js生态的Web开发,就不得不提轻量灵活的Express框架,作为基于Node.js平台的极简、灵活的Web应用开发框架,它提供了一系列强大的特性帮助开发者快速搭建各种Web应用,并且天然支持与各类模板引擎的无缝集成,接下来我们就一步步演示如何创建一个Express项目,并在其中集成模板引擎实现动态页面渲染。

首先要确保本地已经安装了Node.js环境,开发者可以打开终端输入node -v与npm -v命令,若能正常输出版本号则说明环境配置完成,若未安装则需要前往Node.js官网下载对应操作系统的安装包完成配置。接下来创建项目文件夹,比如命名为express-template-demo,在终端中进入该文件夹后执行npm init -y命令,快速初始化一个Node.js项目,该命令会自动生成package.json配置文件,用于管理项目的依赖与脚本。之后执行npm install express命令安装Express框架,安装完成后在项目根目录下创建入口文件app.js,作为整个项目的启动入口。

在app.js文件中,首先引入express模块并创建应用实例,代码为const express = require('express'); const app = express();,随后设置服务的监听端口,比如3000端口,通过app.listen(3000, () => { console.log('服务已启动,访问http://localhost:3000查看效果'); })实现服务监听。此时我们可以先编写一个简单的测试路由,比如app.get('/', (req, res) => { res.send('Hello Express'); }),在终端执行node app.js命令启动服务后,在浏览器中访问对应地址就能看到返回的文本内容,说明基础的Express服务已经搭建完成。

接下来我们在项目中集成EJS模板引擎,首先执行npm install ejs命令安装EJS依赖,随后回到app.js文件中配置模板引擎相关参数:首先引入path模块用于处理文件路径,即const path = require('path');,随后通过app.set('view engine', 'ejs')设置项目默认的模板引擎为EJS,再通过app.set('views', path.join(__dirname, 'views'))设置模板文件的存放目录为项目根目录下的views文件夹,Express会默认从该目录下查找对应名称的模板文件。配置完成后,我们在根目录下创建views文件夹,并在其中新建index.ejs文件作为首页模板,EJS的语法与原生HTML几乎一致,只需要在需要插入动态数据的地方使用<%= 变量名 %>的语法即可,如果需要编写循环、条件判断等逻辑,则可以使用<% 逻辑语句 %>的语法,比如我们可以在index.ejs中编写包含基础HTML结构的代码,在body中插入

<%= pageTitle %>

,再添加一个
    标签,通过循环渲染后端传递的导航列表,即<% for(let nav of navList) { %> <% } %>。

    模板编写完成后,我们需要修改之前的首页路由,不再使用res.send返回文本,而是使用res.render方法渲染模板并返回,代码为app.get('/', (req, res) => { res.render('index', { pageTitle: 'Express模板引擎演示', navList: [{name: '首页'}, {name: '产品中心'}, {name: '关于我们'}, {name: '联系我们'}] }) }),这里的render方法第一个参数为模板文件名,不需要加后缀名,Express会自动根据配置的view engine匹配对应后缀的文件,第二个参数为传递给模板的数据对象,模板中所有的变量都需要从这个对象中获取。重启服务后刷新浏览器,就能看到渲染完成的动态页面,包含标题和导航列表。

    为了提升代码复用性,我们还可以把公共的页面片段拆分出来,比如在views目录下新建header.ejs存放导航栏代码,新建footer.ejs存放版权信息代码,然后在index.ejs中通过<%- include('header') %>与<%- include('footer') %>的方式引入,这里需要注意的是,<%= 语法会对输出的内容进行HTML转义,避免XSS攻击,而include引入的是HTML片段,需要使用<%- 语法进行非转义输出,否则HTML标签会被转义为普通文本显示。

    除了EJS之外,Express集成其他模板引擎的方式也基本一致,比如要使用Pug的话,只需要执行npm install pug安装依赖,再将app.set('view engine', 'ejs')修改为app.set('view engine', 'pug'),然后在views目录下编写.pug后缀的模板文件即可,Express的视图系统已经内置了对绝大多数主流模板引擎的适配,开发者可以根据项目需求和团队技术栈灵活选择。在实际开发中使用模板引擎也有不少需要注意的点,比如尽量不要在模板中编写复杂的业务逻辑,所有的数据处理、逻辑判断都应该在路由层或者业务逻辑层完成后再传递给模板,保持视图层的纯粹性;对于用户输入的内容一定要使用转义输出的语法,避免恶意代码注入带来的安全风险;公共模板的拆分要合理,既要减少重复代码,也要避免过度拆分导致的维护成本上升。

    尽管如今前后端分离的开发模式已经成为中大型项目的主流选择,Vue、React等前端框架也在很大程度上替代了传统模板引擎的地位,但模板引擎在轻量级项目、快速原型开发、对SEO要求较高的服务端渲染场景中依然有着不可替代的优势,而Express框架凭借其轻量、灵活、生态丰富的特点,与各类模板引擎的结合能够帮助开发者以极低的成本快速搭建完整的Web应用,对于想要入门服务端开发的前端开发者来说,掌握Express与模板引擎的使用,也是拓展技术边界、理解全栈开发逻辑的重要一步。

PC右下角
wap底部