如何在Vue.js项目中实现EJS的partials功能及Node.js视图相关疑问
Node.js Views 相关知识及问题解答
1. Node.js 中 Views 基础概念
Node.js 生态下(通常搭配Express、Koa这类web框架)的views层对应MVC架构中的视图层,核心作用是将后端获取的业务数据填充到模板中,渲染为HTML内容返回给客户端。如果使用EJS作为模板引擎,框架会默认从项目根目录的views文件夹中查找对应的.ejs模板文件。
- 常规服务端渲染流程:路由匹配请求后,控制器层从数据库读取商品数据,调用框架内置的渲染方法传入模板名和数据,框架自动完成模板填充,最终返回完整HTML页面。
2. 现有实现思路的问题梳理
你当前的方案存在核心架构矛盾:如果使用Vue.js做前端项目,默认是前后端分离架构,EJS是服务端渲染模板,和Vue的客户端渲染体系不兼容,你预想的带CSS、功能的EJS partial没法直接在Vue项目中复用。
现有思路遗漏了两个核心环节:
- 前后端分离场景下,EJS的服务端渲染逻辑和Vue的响应式渲染逻辑是两套独立体系,强行混用会大幅提升开发维护成本
- Axios请求默认用于获取结构化数据,返回EJS渲染的HTML片段和Vue的结合效率远低于直接使用原生Vue组件
3. Axios请求的两种响应方案
方案1:返回JSON数据(更适合Vue项目,推荐)
后端不需要使用EJS做渲染,直接返回结构化的商品数据即可,示例代码(Express框架):
// 商品接口控制器逻辑 app.get('/api/goods', async (req, res) => { const { goodsId } = req.query let result try { if (goodsId) { // 获取单个商品 result = await GoodsModel.findById(goodsId) } else { // 获取商品列表 result = await GoodsModel.find() } res.json({ code: 200, data: result, msg: '请求成功' }) } catch (err) { res.status(500).json({ code: 500, msg: '数据查询失败' }) } })
前端Axios拿到数据后直接传给Vue组件即可,Vue的单文件组件本身完全覆盖了EJS partial的复用能力,自带模板、样式、交互逻辑,适配Vue的响应式特性。
方案2:返回EJS渲染的HTML片段(仅适合多页应用混合场景,不推荐和Vue混用)
如果确实需要返回渲染完成的商品HTML片段,可以直接调用render方法渲染你的partial模板,示例代码:
app.get('/api/goods-partial', async (req, res) => { try { const goodsList = await GoodsModel.find() // 渲染views目录下的goods-partial.ejs模板,传入商品数据 res.render('goods-partial', { goodsList }, (err, htmlStr) => { if (err) return res.status(500).json({ msg: '模板渲染失败' }) res.send(htmlStr) }) } catch (err) { res.status(500).json({ msg: '查询失败' }) } })
前端Axios拿到HTML字符串后可以通过v-html指令插入到Vue页面中,但该方式返回的内容无法和Vue的响应式逻辑打通,样式、事件都需要在EJS模板中独立完成,仅适合非交互的静态片段场景。
4. Vue中实现EJS partials等效功能的方案
你不需要在Vue项目中引入EJS,直接封装Vue组件即可实现完全一致的复用能力:
- 将单个商品的样式、模板、交互逻辑封装为
GoodsItem.vue公共组件,对应你原本计划写的单个商品EJS partial - 将商品列表封装为
GoodsList.vue组件,内部循环调用GoodsItem组件,对应你原本计划的多商品EJS partial - 需要使用的页面直接导入组件传入商品数据即可,复用逻辑和EJS partial完全一致,且适配Vue的技术体系。
内容的提问来源于stack exchange,提问作者daniel sas
相关产品推荐
相关产品推荐

