【问题标题】:EJS Scripts and Stylesheets sectionsEJS 脚本和样式表部分
【发布时间】:2014-03-29 18:12:14
【问题描述】:

我是来自 ASP.NET MVC 的 node、express 和 EJS 的新手。在 Razor 中,有一个称为“部分”的功能,它允许我在布局文件中为脚本和样式表之类的内容指定一个占位符,然后当这些视图需要特定的脚本和样式表时在我的个人视图中引用它们。这样,所有样式表都位于顶部,而所有脚本都位于底部。 EJS中是否有类似的功能?

【问题讨论】:

  • EJS 是一个相当“裸机”的实现,尽管它确实有部分内容,但我认为它不会干净地为您提供您想要的东西,因为它并不是真正以“布局”概念为模型的。您可能需要考虑将 Jade 视为模板引擎。它是 Express 的默认模板引擎,如果您还没有使用它,您可能很快就会使用它。请参阅Github page for Jade - 它在该页面上链接到的教程可以说是比jade-lang.com 上的官方文档更好的文档(那里也有链接)。
  • 谢谢@barry-johnson!如果您愿意,请发布该评论作为答案,我会接受它,以便您获得荣誉。
  • EJS 中没有块,但这里是块的模拟! github.com/dheeraj-br/ejs_layout_implementation

标签: node.js ejs


【解决方案1】:

根据您的建议发布作为答案。

EJS 是一个相当“裸机”的实现,尽管它确实有部分功能,但我认为它不会干净地为您提供您想要的东西,因为它并不是真正以“布局”概念为模型的。您可能需要考虑将 Jade 视为模板引擎。它是Express 的默认模板引擎,如果您还没有使用它,您可能很快就会使用它。

就个人而言,我发现我真的很喜欢 Jade。仅仅因为它非常简洁/简洁,所以在我看来要容易得多。

资源:

block 语法的使用是我认为您所描述的内容所需要的,我认为这些资源中没有很好地记录它,但这里有一个示例:

layout.jade

doctype html
html
  head
    title #{title} / #{version}
    link(rel='stylesheet', href='/css/site.css')
    script(src='/js/mygenericscript.js')
    block head

    body(class='foo')
        // the line below could be written as '#maincontent.bodyclass'
        div(id='maincontent', class='bodyclass')
          block content

template.jade

extends layout

block head
  // here I am including a page-specific script & stylesheet in the head section
  script(src='/js/mypagescript.js')
  link(rel='stylesheet', href='/css/crazypage.css')

block content
  div(class='page-specific-class')
    //etc, etc

【讨论】:

  • 完美!我认为块功能正是我正在寻找的。我想在我完成这个一次性项目后,我最终会改用 Jade。你说得对,我没有在 Jade 官方文档中看到积木。
  • github.com/RandomEtc/ejs-locals 或 github.com/Soarez/express-ejs-layouts 怎么样?在 OP 的场景中,这些 ejs 的可行选项是什么?我认为你回答得很好,但是关于 ejs 的问题没有直接解决。
  • @mg1075 我同意它不是直接响应的,并且首先作为评论发布。在 OP 询问时作为答案重新发布。您似乎没有维护这两个库。我看到了new EJS 2,你可以看到他们在用它做什么。虽然追随者人数很少,除非一个库对我来说具有独特/引人注目的方面,否则我通常会选择使用更广泛而不是狭窄使用的东西。它不一定是最受欢迎的/以任何方式使用的,但足够活跃的东西可以拥有美好的未来。如果您支持旧版 EJS,我会先检查 2.0。
  • @barry-johnson - 感谢您的洞察力。嘿,nunjucks 看起来是一个非常可行的选择。你玩过它吗? mozilla.github.io/nunjucks/templating.html#block
【解决方案2】:

我希望有一个可行的 ejs 解决方案,但根据 @barry-johnson 的回答,似乎没有。 ejs 的优点(从我的角度来看)是您仍然可以在代码中编写普通的 html,但我很难看到使用玉的另一个抽象的好处。

这是一个大问题,对我来说必须有,如果 ejs 不能很好地解决这个问题,那么 ejs 看起来不值得。

根据@barry-johnson 的评论寻找替代方案,也许真正可行的选择是nunjucks。它似乎是一个活跃的项目,在 github 上有超过一千颗星,block 选项似乎是答案,虽然我还没有尝试过任何东西。 (也许已经有的人可以确认。)

http://mozilla.github.io/nunjucks/templating.html#block

屏蔽

block 定义模板上的一个部分并用名称标识它。 这由模板继承使用。基本模板可以指定 块和子模板可以用新内容覆盖它们。看 模板继承。

{% block css %}
<link rel="stylesheet" href="app.css" />
{% endblock }

Nunjucks 部分使用{{ }} 语法,如果您也在使用 AngularJS,这应该是一个问题。但是,正如在 github 上向我指出的那样,您可以通过自定义 nunjucks 语法来解决这个问题,我认为这比更改 Angular 的绑定语法更可取。

https://mozilla.github.io/nunjucks/api.html#customizing-syntax

【讨论】:

  • FWIW,有些人真的不喜欢玉。我认为它处理空白的方式是一个问题,也是一个人对线宽的感受。撇开它的机制不谈,我还认为一个人的观点的一个重要因素是关于一个人用它创建的布局的重复性和独特性。对于重复的东西 - 例如CRUD 界面的表格和表格 - 我觉得它非常好。对于更复杂和不规则的布局概念,有时会增加更多复杂性来制定一个好的布局。 Nunjucks 看起来很受支持,下次我开始做某事时可能会检查一下。
猜你喜欢
  • 2012-02-08
  • 2021-07-16
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 2011-03-22
相关资源
最近更新 更多