如何在nunjucks中定义全局变量?

11
使用 nunjucks,我该如何定义在所有模板中始终可用的全局变量?
理想情况下,它们应该在环境或配置选项中的某个位置指定,并且不需要在每次调用 nunjucksEnvironment.render 时将其合并到上下文字典中。

如果您正在使用Express,可以使用app.locals来存储全局变量。 - robertklep
@robertklep:没有Express,只有Connect。 - mpen
实际上,我也想在客户端使用这些模板,因此...解决方案不能依赖于服务器端技术。 - mpen
3个回答

10

这可能对某些人很有帮助。在处理nunjucks中的全局变量时,可以避免编写任何js代码。

您需要创建一个_globals.html文件,其中包含所有全局变量。

{% set some_var1 = "Foo" %}
{% set some_var2 = "Bar" %}

然后在需要使用全局变量的任意页面中包含_globals.html。例如:somePage.html

{% import '_globals.html' as globals %}

<span>{{globals.some_var1 }}</span>
<span>{{globals.some_var2 }}</span>

更多信息请查看http://mozilla.github.io/nunjucks/templating.html#set

(意思是,获取更多信息请点击链接)

这应该是被接受的答案。使用这种方法,除非您的全局数据“需要”基于JavaScript,否则无需重新构建您的js或gulpfile。 - klewis

5

虽然它没有记录(或者可能不被建议),但这是可行的:

var njglobals = require('nunjucks/src/globals');
njglobals.someVar = 'someValue';

现在你可以在模板中使用someVar

但请确保不要覆盖njglobals对象的任何现有属性(对于nunjucks@1.0.1,它们是rangecyclerjoiner)。


不确定为什么不建议使用全局变量。例如,我想设置一个“调试”环境变量,以有条件地包含实时重新加载和压缩文件。 Translated text: 不确定为什么不建议使用全局变量。例如,我想设置一个“调试”环境变量,以有条件地包含实时重新加载和压缩文件。 - mpen
1
并不是说不建议这样做,而是因为似乎没有公共API,所以需要重新使用模块的内部部分 :) - robertklep

5

我刚刚在寻找这个内容并来到了这里。看起来现在有一种推荐的方法,最近在版本1.0.6中添加了。

请参见Environment.addGlobal


太好了!谢谢你让我知道。 - mpen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接