You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 19:24:55