我看到Jeff已经在 Twitter 上为你回答了这个问题,但为了 StackOverflow 我会在这里再次为你回答。
Jade 提供对“块”的支持,其工作方式类似于包含,但允许您传递 Jade 块。将块视为“块级包含”,它能够产生传递给它的玉块的内容,只是具有独特的语法。
在您的layout.jade
中,您可以这样做:
html
head
block head
title My Website
body
block content
而在你的index.jade
,你可以这样做:
extends layout
block head
title A Specific Page of My Website
block content
p Hello World!
当你 render 时会发生什么index.jade
,它会“看到”它扩展layout.jade
(第 1 行),然后看到它block head
后面跟着一些内容,所以它会搜索layout.jade
并block head
用它自己的内容替换它在那里找到的内容。
根据您的 Roots 项目的设置方式,这可能有效,也可能无效。当前的 Roots 稳定版本为默认的 Roots 模板提供了自己的包含系统,该模板与任何模板引擎无关。
这个默认的 Roots 模板是$ roots new projectname
.
我不确定是否可以覆盖项目的当前模板,或者当前是否可以更改模板引擎的工作方式(无论是使用 Roots 包含系统还是它自己的),但我知道的是与一起使用的最小根模板$ roots new projectname --min
将使块包含工作。
因此,您可以在此处执行以下两项操作之一:
- 与 Jeff 联系,看看是否可以将包含系统更改为 Jade
- 或使用重新创建项目
$ roots new <projectname> --min
仅供参考,Jeff 和我都将--min
其用作我们的首选模板,但我已将其扩展为包括各种跨浏览器 polyfill。
编辑:
现在,您可能想知道是否仅仅为了更改块中某处的标签内容而替换整个块是否效率低下 - 从维护的角度来看效率低下 - 我无法真正评论处理速度。但是如果您还记得在 Jade 中,您可以定义变量,并且在 Jade 中,您可以将任何东西放在一个块中 - 并且将这两个结构结合起来 - 它们会变得更加有用。
例如,如果我知道我将在一个项目中广泛使用 Jade,我将创建一个configuration.jade
文件,在其中将所有配置/设置变量作为一个块列出。然后,我将在我的主布局中包含该文件(为简单起见,这仅包括设置标题):
config.jade
:
- var siteTitle = "My Cool Website";
layout.jade
:
block config
include config
html
head
title #{siteTitle}
body
block content
p Hello World
我们include
的配置文件而不是仅仅在新布局的顶部定义的原因仅仅是因为某些项目需要多个布局,因此将存储配置变量的责任转移到不同的文件是有意义的,这样我们就include
可以在我们想要的任何布局中。但是请注意,我们的include
配置文件位于block config
. 这允许我们用文件中的配置变量替换该块,所以 - 如果我有一个博客页面,我从 扩展layout
,我可以这样写:
blog.jade
extends layout
block config
- var siteTitle = "Blog - My Cool Website";
block content
each post in posts
p #{post.content}
看看这有多简单?:)