),我希望在模板中使用require导入外部模块,使用__dirname,__filename变量,尽管不推荐这种用法。做法是通过修改ejs的源码来实现支持。我使用的版本是ejs@^2.6.1。打开node_modules/ejs/lib/ejs.js文件,在打开头添加:47varfs=require('fs');48varpath=require('path');49varutils=require('./utils');50+var{Module,createRequireFromPath}=require('module')找到Template.prototype中的编译函数,修改其中的returnedFn:675varreturnedFn=opts.client?fn:functionanonymous(data){-varinclude=function(path,includeData){+varinclude=function(_path,includeData){vard=utils.shallowCopy({},data);如果(includeData){d=utils.shallowCopy(d,includeData);}+constcustomModule=newModule()+d.__filename=getIncludePath(_path,opts)+customModule.id=d.__dirname=path.dirname(d.__filename)+d.module=customModule+d.require=createRequireFromPath(d.__filename)-返回includeFile(path,opts)(d);+returnincludeFile(_path,opts)(d);};+constcustomModule=newModule()+customModule.id=customModule.path=data.__dirname=path.dirname(opts.filename)+data.module=customModule+data.__filename=opts.filename+data.require=createRequireFromPath(data.__filename)返回fn.apply(opts.context,[数据||{},escapeFn,include,rethrow]);695};如果node版本是v12.2.0以上,将createRequireFromPath改为createRequire参考文档
