Как использовать node модули (например, MomentJS) в представлениях EJS?
Чтобы использовать MomentJS в views/custom.ejs, каков правильный способ (если есть)?
-
Серверная сторона
маршруты/индекс и т.д. мы можем легко использовать require('moment');
и т.д., и он отлично работает.
-
Сторона сервера (виды EJS)
views/custome.ejs, что-то вроде <% var m = require('moment'); %>
не работает
Я использую ExpressJS с EJS в качестве механизма шаблонов.
Ответы
Ответ 1
Я нашел другой способ сделать это, и я думаю, что он имеет некоторые преимущества.
- Не изменяйте фильтры экспорта кода.
- Доступ к любому методу без необходимости экспортировать их все.
- Лучшее использование ejs (нет | труб).
На вашем контроллере или 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, поэтому, если кто-нибудь видит что-то плохое в этом, дайте мне знать!:)
Ответ 2
Еще один вариант:
Таким образом вы устанавливаете переменную момента в локальный доступный для всех скриптов на любой странице 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) %>
Возможно, это немного более элегантно?
Ответ 3
Я использую момент на стороне сервера с помощью ejs. Я написал функцию фильтра ejs, которая вернется из Now.
npm install moment
./просмотров/page.ejs
<span class="created_at"><%=: item.created_at | fromNow %></span>
./маршруты/page.js
var ejs = require('ejs')
, moment = require('moment');
ejs.filters.fromNow = function(date){
return moment(date).fromNow()
}
Ответ 4
var moment = require('moment');
app.locals.moment = require('moment');
Использовать в представлении:
<%= moment(myDateValue).fromNow() %>
Теперь вы можете просто использовать момент в своих файлах EJS.
Ответ 5
Предполагается, что серверная (EJS-представления), упомянутая выше, работает в браузере, а не на вашем сервере. Вы не можете использовать запрос, потому что браузеры не могут его понять. Вам нужно импортировать файл moment.js для его использования.
<script src="/js/moment.min.js"></script>
Ответ 6
Вы можете создать функцию и прикрепить ее к app.locals. и использовать его в шаблоне ejs на стороне сервера.
В файле маршрутов вы делаете
../маршруты/page.js
var ejs = require('ejs')
, moment = require('moment');
app.locals.fromNow = function(date){
return moment(date).fromNow();
}
../просмотров/page.ejs
<span class="created_at"><%= fromNow(item.created_at) %></span>
Просто помните, что в файл package.json добавлен момент.
Ответ 7
Также я думаю, что это хорошая идея, если вы хотите, чтобы вы могли добавить среднее программное обеспечение, где вы можете добавить все, что хотите, к тематическому уровню, включая пользователя, конфигурацию и момент:
// 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();
});
Ответ 8
Как насчет передачи require
следующим образом:
res.render('index', { require: require });
Вам может потребоваться настроить для сохранения пути:
res.render('index', { require: module => require(module /* here you may insert path correction */) });
Очевидно, что это работает только с Node (backend).