aurelia-cli生成器无法导入依赖项

时间:2017-08-21 09:02:04

标签: path gulp generator require aurelia-cli

我使用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> 
...

如果我在模型文件中对模型本身使用路径 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

因此,由于生成器使用节点进行模块解析并且编译使用了打字稿编译,因此我似乎陷入困境。有没有人看到这种方法?

1 个答案:

答案 0 :(得分:0)

所以,似乎并不是一个简单的答案。我最终覆盖了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);
      }