Node.js 如何在EJS视图中使用节点模块(如MomentJS)?

Node.js 如何在EJS视图中使用节点模块(如MomentJS)?,node.js,express,ejs,momentjs,Node.js,Express,Ejs,Momentjs,要在views/custom.ejs中使用MomentJS,正确的方法是什么(如果有的话) 服务器端 路线/索引等,我们可以轻松使用require('moment')等,工作正常 服务器端(EJS视图) views/custome.ejs,类似于的东西不起作用 我正在使用带有EJS的ExpressJS作为模板引擎。上面提到的服务器端(EJS视图)在浏览器上运行,而不是在服务器上运行。您不能使用require,因为浏览器无法理解它。您需要导入moment.js才能使用它 <script

要在views/custom.ejs中使用MomentJS,正确的方法是什么(如果有的话)

  • 服务器端

    路线/索引等,我们可以轻松使用
    require('moment')等,工作正常

  • 服务器端(EJS视图)

    views/custome.ejs,类似于
    的东西不起作用

  • 我正在使用带有EJS的ExpressJS作为模板引擎。

    上面提到的服务器端(EJS视图)在浏览器上运行,而不是在服务器上运行。您不能使用require,因为浏览器无法理解它。您需要导入moment.js才能使用它

    <script src="/js/moment.min.js"></script>
    

    我使用ejs服务器端的矩。我编写了一个ejs过滤器函数,它将从现在返回

    npm install moment
    
    ./views/page.ejs

    <span class="created_at"><%=: item.created_at | fromNow %></span>
    
    <span class="created_at"><%= fromNow(item.created_at) %></span>
    

    您可以创建函数并将其附加到app.locals。并在服务器端的ejs模板中使用它

    在路由文件中,您可以

    ../routes/page.js

    var ejs = require('ejs')
      , moment = require('moment');
    
    ejs.filters.fromNow = function(date){
      return moment(date).fromNow()
    }
    
    var ejs = require('ejs')
      , moment = require('moment');
    
    app.locals.fromNow = function(date){
      return moment(date).fromNow();
    }
    
    ../views/page.ejs

    <span class="created_at"><%=: item.created_at | fromNow %></span>
    
    <span class="created_at"><%= fromNow(item.created_at) %></span>
    
    
    

    只需记住将moment添加到package.json文件中

    我找到了另一种方法,我认为它有一些优点

    • 不要污染你的代码导出过滤器
    • 访问任何方法,而无需全部导出
    • 更好地使用ejs(无管道)
    在控制器或view.js上执行以下操作:

    现在,您可以在EJ中使用moment:

    
    
    我不是节点专家,所以如果有人看到这样做有什么不好的地方,请告诉我!:)

    还有一个选项:

    通过这种方式,您可以将矩变量设置为本地变量,该变量可用于站点上任何EJS页面中的所有脚本

    在“index.js”(或“app.js”)文件中,执行以下操作:(使用Express设置“app”后)

    然后在EJS文件中,您可以将moment(和shortDateFormat)作为变量引用,如下所示:

    <%= moment(Date()).format(shortDateFormat) %>
    
    res.render('index', { require: require });
    
    
    

    也许这更优雅一点?

    此外,我认为如果您想要,最好添加一个中间件,您可以在其中向主题层添加任何您想要的内容,包括用户、配置和时刻:

    // 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();
    });
    
    在视图中使用:

    <%= moment(myDateValue).fromNow() %>
    
    
    

    现在,您只需在EJS文件中使用矩即可。

    require
    这样传递下去如何:

    <%= moment(Date()).format(shortDateFormat) %>
    
    res.render('index', { require: require });
    
    您可能需要调整以维护路径:

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

    显然,这只适用于节点(后端)。

    我编写了一个帮助程序来返回在
    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();
    

    从节点v12.8.3开始,您似乎可以将
    require
    直接传递到EJS模板,即:

    const ejs=require('ejs'))
    让renderedHTML=ejs.render(``,{require})
    
    谢谢@Vinoth我现在正在查看呈现的代码(浏览器端)和我的布局。ejs包括:
    custom.ejs(视图)使用momentJS lib编写代码,示例
    var a=moment(new Date())
    此处
    发现a
    为空。请检查此链接以了解如何使用它-据我所知,“”和“”附带的代码是在服务器端运行/呈现的,而不是在客户端。客户端只是以纯html的形式获取呈现(处理)结果,除非您显式使用标签,标签将在客户端运行。如果您导出的是时刻(日期),而不是函数,则可能会更灵活。可能有用,我还没试过。从现在起,这是我最灵活的工作方式。我只需要组织将所有多余的库发送到模板。这是最干净的解决方案!请解释您的代码行,以便其他用户能够理解其功能。谢谢这似乎是这个问题的唯一真正答案。干得好。将需要尝试此操作。我能够在此回购中使此操作正常运行:。真正令人满意的解决方案。我不知道为什么EJS模板不能以这种方式开箱即用。我更喜欢这种方式,因为它只会将EJS与函数链接,而不会与模块链接。