Подтвердить что ты не робот

Как использовать node модули (например, MomentJS) в представлениях EJS?

Чтобы использовать MomentJS в views/custom.ejs, каков правильный способ (если есть)?

  • Серверная сторона

    маршруты/индекс и т.д. мы можем легко использовать require('moment'); и т.д., и он отлично работает.

  • Сторона сервера (виды EJS)

    views/custome.ejs, что-то вроде <% var m = require('moment'); %> не работает

Я использую ExpressJS с EJS в качестве механизма шаблонов.

4b9b3361

Ответ 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).