如何在 Jade 模板中包含服务器端脚本?

Posted

技术标签:

【中文标题】如何在 Jade 模板中包含服务器端脚本?【英文标题】:How to include server-side script in Jade template? 【发布时间】:2012-12-27 22:01:33 【问题描述】:

我刚刚安装了moment.js;现在我想在我的 Jade 模板中访问moment。示例:

.main-content
    .container
        .access-details.clearfix
            .left
                div Logged in: <b>#user.name</b>
                div Access Lvl: #user.accessLevel
            .right
                div= moment().format("dddd, MMMM Do YYYY, h:mm:ss a")

明确地说,我希望在服务器端格式化日期,然后作为呈现的字符串发送到客户端。

那么如何在 Jade 模板中提供 javascript 库?


我可能应该注意到我正在将它与 Express 一起使用:

var server = express.createServer();
server.configure(function () 
    server.set('view engine', 'jade');

是否有一些我必须以某种方式传递的选项来告诉它要包含哪些库?


我突然想到这与传入局部变量完全没有区别。例如,

server.get('/', function (req, res) 
    res.render('index', 
        locals: 
            moment: require('moment')
        
    );
);

但我不想将它传递给每个视图;如果我忘记了它,我的应用程序会在主布局中使用时中断。那么如何确保它始终可用?

【问题讨论】:

【参考方案1】:

从 Express 3 或 4 中删除助手。

请使用app.locals

app.locals.moment = require('moment');

app.locals 对象是一个 JavaScript 对象。添加到其中的属性将作为应用程序中的局部变量公开。

因此您可以在任何视图文件中使用app.localsJadeEJS

moment().format('YYYY-MM-DD h:mm:ss');

【讨论】:

【参考方案2】:

This answer 为我指明了正确的方向,尽管 dynamicHelpers 上的文档似乎已从 Express 文档中神秘地消失了。

另外,我不需要 动态 助手,只需要一个静态助手(无法访问请求/响应)。所以我在黑暗中尝试了它的名称:

server.helpers(
    moment: require('moment')
);

像魅力一样工作! moment 现在在我的所有视图中都可用。

【讨论】:

Helpers 概念已从 Express 3 中删除。您所说的“静态助手”是指app.locals (app.locals.moment = require('moment');)。对于.dynamicHelpers,使用中间件。

以上是关于如何在 Jade 模板中包含服务器端脚本?的主要内容,如果未能解决你的问题,请参考以下文章

带变量的 Jade 模板(nodejs 服务器端)

Jade 中包含和块的区别

在 thymeleaf 中包含 JavaScript 变量

如何在 Jinja2 模板中包含 HTML 文件?

AngularJS 包含

为啥我们为 Node 使用服务器端模板引擎?