美文网首页
node端ejs中使用模块变量

node端ejs中使用模块变量

作者: 灯光树影 | 来源:发表于2021-02-03 13:21 被阅读0次

前言

ejs在默认情况下只是一个呈现工具,只是负责依据传入的参数进行模板渲染。然而,在使用过程中(hexo-renderer-ejs),我希望在模板中使用require引入外部模块,使用__dirname__filename变量,即使这个用法是不推荐的

做法

通过修改ejs的源码来实现支持,我使用的版本是ejs@^2.6.1。
打开node_modules/ejs/lib/ejs.js文件,在开头添加:

47 var fs = require('fs');
48 var path = require('path');
49 var utils = require('./utils');
50 + var { Module, createRequireFromPath } = require('module')

找到Template.prototype中的compile函数,修改其中的returnedFn

    675 var returnedFn = opts.client ? fn : function anonymous(data) {
      var include = function (_path, includeData) {
        var d = utils.shallowCopy({}, data);
        if (includeData) {
          d = utils.shallowCopy(d, includeData);
        }
        const customModule = new Module()
        + d.__filename = getIncludePath(_path, opts)
        + customModule.id = d.__dirname = path.dirname(d.__filename)
        + d.module = customModule
        + d.require = createRequireFromPath(d.__filename)
        + d.test = 'sdfsdf'
        return includeFile(_path, opts)(d);
      };
      + const customModule = new Module()
      + customModule.id = customModule.path = data.__dirname = path.dirname(opts.filename)
      + data.module = customModule
      + data.__filename = opts.filename
      + data.require = createRequireFromPath(data.__filename)
      return fn.apply(opts.context, [data || {}, escapeFn, include, rethrow]);
695 };

如果node的版本是 v12.2.0或以上,将createRequireFromPath改为createRequire 参考文档

相关文章

  • node端ejs中使用模块变量

    前言 ejs在默认情况下只是一个呈现工具,只是负责依据传入的参数进行模板渲染。然而,在使用过程中(hexo-ren...

  • ejs filter使用

    node安装ejs模块后,在ejs/lib/filters.js文件中有很多常用的方法如: 使用方法: 结果:AB...

  • __dirname与__filename

    1)__filename变量 node.js中,在任何模块文件内部,可以使用__filename变量获取当前模块文...

  • 试着使用ejs模版引擎

    如果使用ejs模版引擎,必须要安装ejs模块 目标:使用ejs模板向输出一个html文件,html中的内容为ejs...

  • koa中使用模板引擎

    在node中使用模板引擎需要一个中间件koa-views 在koa中使用ejs 安装模块 使用模板引擎 demo源...

  • Nodejs中的模板引擎——ejs

    首先我们需要使用ejs,必须先安装ejs 1.使用ejs解析变量 ejs代码 我们执行上述代码就会发现amy已经被...

  • node.js服务器基础结构

    在node.js中,要使用 HTTP 服务器和客户端,必须使用http模块const http = require...

  • node渲染.html页面

    问题:在html中传入参数?解决:将使用ejs模块作解析;之前,使用express框架中的sendFile, 虽然...

  • Node.js Web 模块

    Node.js 提供了 http 模块,http 模块主要用于搭建 HTTP 服务端和客户端,使用 HTTP 服务...

  • nodejs 做一个留言本

    项目名 5.nodejs_day5model:数据库模块node_modules:(express、ejs、for...

网友评论

      本文标题:node端ejs中使用模块变量

      本文链接:https://www.haomeiwen.com/subject/viwptltx.html