How to use node modules (like MomentJS) in EJS views?

前端 未结 10 1702
耶瑟儿~
耶瑟儿~ 2020-12-14 00:03

To use MomentJS in views/custom.ejs, what is the correct way (if any)?

  1. Server side

    routes/index etc we can easily use require(\'moment\');

相关标签:
10条回答
  • 2020-12-14 00:42

    I found another way of doing this, and I think it has some advantages.

    • Don't polute your code exporting filters.
    • Access any method without the need to export them all.
    • Better ejs usage (no | pipes).

    On your controller, or view.js do this:

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

    Now you can use moment inside your ejs:

    <html>
        <h1><%= moment().fromNow() %></h1>
    </html>
    

    I'm not an Node expert, so if anyone see something bad on doing this, let me know! :)

    0 讨论(0)
  • 2020-12-14 00:47

    I use moment on the server side with ejs. I wrote an ejs filter function that will return fromNow.

    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()
    }
    
    0 讨论(0)
  • 2020-12-14 00:51

    One more option:

    This way you are setting the moment variable to a local available to all scripts in any EJS page on your site.

    In your "index.js" (or "app.js") file do this: (after you have set up your 'app' with Express)

    var moment = require('moment');
    var shortDateFormat = "ffffd @ 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;
    

    Then in your EJS file you can refer to moment (and shortDateFormat) as variables like this:

    <%= moment(Date()).format(shortDateFormat) %>
    

    Perhaps this is slightly more elegant?

    0 讨论(0)
  • 2020-12-14 00:51

    also i think it is good idea if you want you can add a middle-ware where you can add anything you want to the theme layer including user,config and moment:

    // 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();
    });
    
    0 讨论(0)
  • 2020-12-14 00:57

    The server side (EJS views) which you mentioned above is running on browser and not on your server. You cannot use require because browsers cannot understand it. You need to import the moment.js to use it

    <script src="/js/moment.min.js"></script>
    
    0 讨论(0)
  • 2020-12-14 00:58

    How about passing down require like this:

    res.render('index', { require: require });
    

    You might need to tweak to maintain the path:

    res.render('index', { require: module => require(module /* here you may insert path correction */) });
    

    Obviously this works with Node (backend) only.

    0 讨论(0)
提交回复
热议问题