我正在使用带有打字稿的Aurelia-cli。我制作了一个生成器,它需要一个模型文件,以便它可以迭代其属性以生成相应的 CRUD,如下所示:
let path = '../../src/modules/' + moduleName + '/models/' + modelFileName;
let mod = require(path);
let item = new mod[modelClassName]();
let keys = [];
for (var key in (item as any)){...}
请注意,我必须在此处要求使用相对路径的模型。 这在最简单的情况下效果很好。当模型文件具有使用绝对路径(相对于项目的根目录(的其他导入时,就会出现问题,如下所示:
import { EnumNodeTypeXx } from 'resources/enums/enum-node-type-xx';
其中require((调用失败并显示以下错误:
Error: Cannot find module 'resources/enums/enum-node-type-xx'
at Function.Module._resolveFilename (module.js:469:15)
at Function.Module._load (module.js:417:25)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object.<anonymous>
...
如果我在模型文件中使用相对于模型本身的路径,生成器不会抱怨:
import { EnumNodeTypeXx } from '../../../resources/enums/enum-node-type-xx';
如果我引用来自带有导入的 NPM 模块的文件,也会发生问题。
编辑
在花了一些时间在 aurelia-cli 的代码上之后,我可以看到它使用了一个(已弃用的(nodejs 功能,它通过在编译之前转译ts文件来覆盖它们的处理。编译后,使用nodejs Module.require解决了有问题的导入,它只需要核心模块,no_modules或相对路径(根据这里的文档:https://nodejs.org/docs/latest/api/modules.html#modules_file_modules
因此,由于生成器使用节点进行模块解析,而编译使用打字稿编译,我似乎卡住了。有人看到摆脱困境的方法吗?
因此,似乎没有一个简单的答案。我最终覆盖了 require(( 方法以不同的方式处理我的绝对路径,如此处所述 并由Zewa666在我的GitHub问题中指出。
const moduleProto = Object.getPrototypeOf(module)
const origRequire = moduleProto.require
moduleProto.require = function(request) {
if (request.startsWith('resources')
|| request.startsWith('services')
|| request.startsWith('modules')) {//very naive approach but easy enough to understand
request = __dirname + '/../../src/' + request + '.ts';
}
return origRequire.call(this, request);
}