要在views/custom.ejs 中使用MomentJS,正确的方法是什么(如果有的话)?
服务器端
路线/索引等我们可以轻松使用
require('moment');
等,它工作正常。服务器端(EJS 视图)
views/custome.ejs,类似的东西
<% var m = require('moment'); %>
不起作用
我使用 ExpressJS 和 EJS 作为模板引擎。
我找到了另一种方法,我认为它有一些优势。
在您的控制器或 view.js 上执行以下操作:
var moment = require('moment');
exports.index = function(req, res) {
// send moment to your ejs
res.render('index', { moment: moment });
}
现在你可以在你的 ejs 中使用 moment:
<html>
<h1><%= moment().fromNow() %></h1>
</html>
我不是 Node 专家,所以如果有人看到这样做有什么不好的地方,请告诉我!:)
另一种选择:
这样,您将 moment 变量设置为站点上任何 EJS 页面中所有脚本都可用的本地变量。
在您的“index.js”(或“app.js”)文件中执行以下操作:(在您使用 Express 设置您的“应用程序”之后)
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 文件中,您可以将时刻(和 shortDateFormat)称为如下变量:
<%= moment(Date()).format(shortDateFormat) %>
也许这更优雅一些?
var moment = require('moment');
app.locals.moment = require('moment');
在视图中使用:
<%= moment(myDateValue).fromNow() %>
现在您可以简单地在您的 EJS 文件中使用 moment。
我在服务器端使用 ejs 的时刻。我写了一个从Now返回的ejs过滤函数。
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()
}
您可以创建函数并将其附加到 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 文件中
像这样传下去怎么require
样:
res.render('index', { require: require });
您可能需要调整以维护路径:
res.render('index', { require: module => require(module /* here you may insert path correction */) });
显然,这仅适用于 Node(后端)。
您上面提到的服务器端(EJS 视图)是在浏览器上而不是在您的服务器上运行的。您不能使用 require ,因为浏览器无法理解它。您需要导入 moment.js 才能使用它
<script src="/js/moment.min.js"></script>
我也认为如果你想添加一个中间件是个好主意,你可以在其中添加任何你想要的东西到主题层,包括用户、配置和时刻:
// 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();
});
我写了一个助手来返回使用ejs
视图和布局的时刻。
./helpers/utils/get-moment.js
const moment = require('moment');
module.exports = {
friendlyName: 'formatMoney',
description: 'format money number.',
inputs: {},
sync: true,
exits: {},
fn: function (inputs, exits) {
return exits.success(moment);
}
};
然后使用:
const moment = sails.helpers.utils.getMoment();
从 Node v12.8.3 开始,您似乎可以require
直接传递给 EJS 模板,即这样可以:
const ejs = require('ejs')
let renderedHTML = ejs.render(`<% const moment = require('moment') %>`, { require })