Node.js 如何在EJS视图中使用节点模块(如MomentJS)?
要在views/custom.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
require('moment')代码>等,工作正常
的东西不起作用
<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(无管道)
我不是节点专家,所以如果有人看到这样做有什么不好的地方,请告诉我!:) 还有一个选项:
通过这种方式,您可以将矩变量设置为本地变量,该变量可用于站点上任何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与函数链接,而不会与模块链接。