为何express-ejs-layouts会自动包裹页面?Node.js路由学习疑问
express-ejs-layouts自动包裹页面的原因解析
问题背景
学习Node.js路由时,最初代码运行正常,但3天后遇到express-ejs-layouts自动包裹页面的问题。已找到解决方案(设置layout为false或指定对应布局),但想了解该工具自动包裹页面的原因。
原始代码
const expressLayouts = require('express-ejs-layouts'); const app = express(); // view engine app.use(expressLayouts); app.set('view engine', 'ejs') app.get('/', (req, res)=>{ res.render('welcome') }) const port = process.env.port || 5000; app.listen(port, console.log(`server is up on ${port}`));
解决代码
// 全局关闭自动布局(注:原代码中"layout register"应为笔误,正确参数名是"layout") app.set('layout', false); // 或针对单个路由指定布局 app.get('/', (req, res)=>{ res.render('welcome', {layout: 'welcome'}) })
自动包裹的原因
express-ejs-layouts的核心作用是为EJS提供布局复用能力,它的默认行为逻辑如下:
- 中间件会自动检测项目
views目录下是否存在名为layout.ejs的文件 - 当该文件存在时,它会作为全局默认布局,自动将
res.render()渲染的页面内容,插入到layout.ejs中<%- body %>标记的位置,实现页面自动包裹 - 最初代码运行正常,大概率是当时
views目录下还没有layout.ejs文件,中间件找不到全局布局模板,就直接渲染单个页面;3天后出现问题,应该是你新增了layout.ejs文件,或配置/依赖变化导致中间件检测到该布局文件,触发了自动包裹逻辑
如果不需要全局布局,可通过app.set('layout', false)全局关闭;也能在单个res.render()调用时,通过{layout: false}或指定具体布局文件名的方式,灵活控制页面是否使用布局。
内容的提问来源于stack exchange,提问作者binryNerd
相关产品推荐
相关产品推荐

