aurelia-cli 生成器无法导入依赖项
aurelia-cli generator cannot import dependencies
我正在使用带有打字稿的 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)){...}
请注意,我必须在此处要求模型使用 relative 路径。
这在最简单的情况下效果很好。当模型文件具有使用 绝对 路径(相对于项目的根目录)的额外导入时,问题就出现了,如下所示:
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>
...
如果我在模型文件中使用模型本身的 relative 路径,生成器不会抱怨:
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
所以,由于生成器使用node进行模块解析,编译使用typescript编译,所以我似乎卡住了。有人看到解决办法吗?
因此,似乎没有一个简单的答案。我最终覆盖了 require() 方法以不同方式处理我的绝对路径,如解释的那样 here
并由 zewa666 在 my github issue.
中指出
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);
}
我正在使用带有打字稿的 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)){...}
请注意,我必须在此处要求模型使用 relative 路径。 这在最简单的情况下效果很好。当模型文件具有使用 绝对 路径(相对于项目的根目录)的额外导入时,问题就出现了,如下所示:
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>
...
如果我在模型文件中使用模型本身的 relative 路径,生成器不会抱怨:
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
所以,由于生成器使用node进行模块解析,编译使用typescript编译,所以我似乎卡住了。有人看到解决办法吗?
因此,似乎没有一个简单的答案。我最终覆盖了 require() 方法以不同方式处理我的绝对路径,如解释的那样 here 并由 zewa666 在 my github issue.
中指出 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);
}