使用Express+Eta开发Web应用:布局无法渲染模板内容求助
解决Eta布局与Partial无法渲染的问题
核心问题:块级指令标签不匹配
你在Eta配置中仅修改了插值标签为{{ }},但Eta的块级指令(如layout、include)默认使用<% %>标签。因此你写的{{ layout('./incl/layout') }}并没有被识别为布局指令,只是被当作普通插值内容处理,导致布局逻辑未执行。
解决方案一:使用默认块标签编写指令
修改src/views/index.eta中的布局指令为默认块标签格式:
<% layout('./incl/layout') %> <div id="content"> Hello world </div>
同时,布局文件中需要用不转义插值输出模板内容(避免HTML被转义),修改src/views/incl/layout.eta:
<!DOCTYPE html> <html lang="en"> <head> <title>{{ it.title }}</title> </head> <body> <%= it.body %> <footer>Copyright SomeCo, Inc.</footer> </body> </html>
解决方案二:统一配置块标签与插值标签
如果你想继续使用{{ }}作为所有标签的格式,修改src/services/etaSingleton.ts中的Eta配置,明确指定块标签和不转义插值标签:
eta.configure({ tags: { open: '{{', // 转义插值开标签 close: '}}', // 转义插值闭标签 blockOpen: '{{', // 块级指令开标签 blockClose: '}}', // 块级指令闭标签 openUnescaped: '{{=',// 不转义插值开标签 closeUnescaped: '}}' // 不转义插值闭标签 }, views: __dirname + '/../views', });
此时布局指令可以保留{{ layout('./incl/layout') }}的写法,同时布局文件中需要用不转义插值输出内容:
<!DOCTYPE html> <html lang="en"> <head> <title>{{ it.title }}</title> </head> <body> {{= it.body }} <footer>Copyright SomeCo, Inc.</footer> </body> </html>
关于Partial无法引入的补充解决
针对你之前尝试的Partial引入问题,同样遵循上述标签规则:
- 若用默认块标签:
<% include('./incl/head') %> - 若用统一
{{ }}标签:{{ include('./incl/head') }}
如果需要预定义全局Partial,可以在Eta单例中添加:
// 在configure之后添加 const headTemplate = readFileSync(__dirname + '/../views/incl/head.eta', 'utf8'); eta.templates.define('head', eta.compile(headTemplate));
之后在模板中通过<% include('head') %>或{{ include('head') }}调用(取决于标签配置)。
内容的提问来源于stack exchange,提问作者someRandomName
相关产品推荐
相关产品推荐

