如何在EJS视图中使用节点模块(如MomentJS)?

dmo*_*lus 36 ejs node.js express momentjs

要在views/custom.ejs中使用MomentJS,正确的方法是什么(如果有的话)?

  1. 服务器端

    路线/索引等我们可以很容易地使用require('moment');等,它工作正常.

  2. 服务器端(EJS视图)

    views/custome.ejs,类似的东西<% var m = require('moment'); %>不起作用

我使用ExpressJS和EJS作为模板引擎.

小智 56

我找到了另一种方法,我认为它有一些优点.

  • 不要将您的代码导出过滤器.
  • 访问任何方法而无需全部导出.
  • 更好的ejs使用(没有|管道).

在您的控制器上,或view.js执行此操作:

var moment = require('moment');
exports.index = function(req, res) {
    // send moment to your ejs
    res.render('index', { moment: moment });
}
Run Code Online (Sandbox Code Playgroud)

现在你可以在你的ejs里面使用一下:

<html>
    <h1><%= moment().fromNow() %></h1>
</html>
Run Code Online (Sandbox Code Playgroud)

我不是节点专家,所以如果有人看到这样做的不好,请告诉我!:)


Mat*_*uel 21

还有一个选择:

这样,您可以将moment变量设置为可用于站点上任何EJS页面中所有脚本的本地变量.

在你的"index.js"(或"app.js")文件中执行以下操作:(在使用Express设置'app'之后)

var moment = require('moment');
var shortDateFormat = "ddd @ h:mmA"; // this is just an example of storing a date format once so you can change it in one place and have it propagate
app.locals.moment = moment; // this makes moment available as a variable in every EJS page
app.locals.shortDateFormat = shortDateFormat;
Run Code Online (Sandbox Code Playgroud)

然后在您的EJS文件中,您可以将moment(和shortDateFormat)称为变量,如下所示:

<%= moment(Date()).format(shortDateFormat) %>
Run Code Online (Sandbox Code Playgroud)

也许这稍微优雅一点?

  • 最干净的解决方案! (4认同)

cho*_*ovy 10

我使用ejs在服务器端使用时刻.我写了一个将从现在返回的ejs过滤器函数.

npm install moment
Run Code Online (Sandbox Code Playgroud)

./views/page.ejs

<span class="created_at"><%=: item.created_at | fromNow %></span>
Run Code Online (Sandbox Code Playgroud)

./routes/page.js

var ejs = require('ejs')
  , moment = require('moment');

ejs.filters.fromNow = function(date){
  return moment(date).fromNow()
}
Run Code Online (Sandbox Code Playgroud)


小智 10

var moment = require('moment');
app.locals.moment = require('moment');
Run Code Online (Sandbox Code Playgroud)

在视图中使用:

<%= moment(myDateValue).fromNow() %>
Run Code Online (Sandbox Code Playgroud)

现在您只需在EJS文件中使用时刻即可.


Vin*_*oth 0

您上面提到的服务器端(EJS 视图)在浏览器上运行,而不是在您的服务器上运行。您不能使用 require,因为浏览器无法理解它。您需要导入 moment.js 才能使用它

<script src="/js/moment.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

  • 根据我的理解,“&lt;% ... %&gt;”和“&lt;%= ... %&gt;”包含的代码是在服务器端运行/渲染的,**不是**在客户端运行/渲染。除非您显式使用将在客户端运行的 &lt;script&gt;&lt;/script&gt; 标签,否则客户端只会以纯 html 形式获取渲染(处理后)的结果。 (2认同)