如何在EJS视图中使用节点模块(如MomentJS)?
要在views / custom.ejs中使用MomentJS,什么是正确的方法(如果有的话)?
-
服务器端
路线/指数等我们可以很容易地使用
require('moment');
等等,它工作正常。 -
服务器端(EJS视图)
views / custome.ejs,像
<% var m = require('moment'); %>
<% var m = require('moment'); %>
不起作用
我使用ExpressJS和EJS作为模板引擎。
我find了另外一种方法,我认为它有一些优点。
- 不要监视你的代码导出filter。
- 访问任何方法,而不需要全部导出。
- 更好的ejs使用(无|pipe道)。
在你的控制器,或view.js这样做:
var moment = require('moment'); exports.index = function(req, res) { // send moment to your ejs res.render('index', { moment: moment }); }
现在你可以使用你的ejs里面的时刻:
<html> <h1><%= moment().fromNow() %></h1> </html>
我不是一个Node专家,所以如果有人看到这样做不好,让我知道! 🙂
还有一个select:
通过这种方式,您可以将时间variables设置为本地任何EJS页面中所有脚本可用的本地variables。
在你的“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;
然后在你的EJS文件中,你可以参考moment(和shortDateFormat)这样的variables:
<%= moment(Date()).format(shortDateFormat) %>
也许这稍微更优雅?
我在服务器端使用ejs。 我写了一个从现在返回的ejsfilter函数。
npm install moment
./views/page.ejs
<span class="created_at"><%=: item.created_at | fromNow %></span>
./routes/page.js
var ejs = require('ejs') , moment = require('moment'); ejs.filters.fromNow = function(date){ return moment(date).fromNow() }
上面提到的服务器端(EJS视图)在浏览器上运行,而不是在服务器上运行。 你不能使用require,因为浏览器不能理解它。 您需要导入moment.js才能使用它
<script src="/js/moment.min.js"></script>
您可以创build该函数并将其附加到app.locals。 并在服务器端的ejs模板中使用它。
在你的路线文件你做
../routes/page.js
var ejs = require('ejs') , moment = require('moment'); app.locals.fromNow = function(date){ return moment(date).fromNow(); }
../views/page.ejs
<span class="created_at"><%= fromNow(item.created_at) %></span>
只要记得把时间添加到你的package.json文件
app.locals.moment=require("moment");
现在,您可以简单地在EJS文件中使用时刻。
另外我认为这是个好主意,如果你想要添加一个中间件,你可以添加任何你想要的主题层,包括用户,configuration和时刻:
// config, user, moment to the theme layer app.use(function (req, res, next) { // grab reference of render var _render = res.render; // override logic res.render = function (view, options, fn) { // extend config and continue with original render options = options || {}; options.config = config; options.moment = moment; if (req.user && req.user.toJSON) { options.user = req.user.toJSON(); } _render.call(this, view, options, fn); } next(); });
如何传递下来require
这样的:
res.render('index', { require: require });
您可能需要调整以保持path:
res.render('index', { require: module => require(module /* here you may insert path correction */) });
显然这只适用于Node(后端)。