使用库时,在生产模式下出现“错误:找不到模块'@ app / foo'”

时间:2019-05-29 19:44:56

标签: nestjs

我有一个项目,在其中构建了几个模块。在发现nestjs有一个lib cli命令后,我将它们全部移植为使用这种样式。 现在,我的应用在使用npm run start:prod时找不到这些模块。

Error: Cannot find module '@app/foo'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:582:15)
    at Function.Module._load (internal/modules/cjs/loader.js:508:25)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:22:18)
    at Object.<anonymous> (/Users/xxx/Development/nest-test/dist/src/app.service.js:13:15)
    at Module._compile (internal/modules/cjs/loader.js:701:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:712:10)
    at Module.load (internal/modules/cjs/loader.js:600:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:539:12)
    at Function.Module._load (internal/modules/cjs/loader.js:531:3)

我创建了一个包含基本代码和一个库的项目来重现该问题:https://github.com/hkeio/nestjs-test

即使我链接包节点也找不到模块。

cd libs/foo
npm link
cd ../..
npm link @app/foo

运行NODE_DEBUG=* npm run start:prod时,我可以看到他在寻找正确的位置,但是找不到模块:

MODULE 12494: looking for "@app/foo" in [
    "/Users/xxx/Development/nest-test/dist/src/node_modules",
    "/Users/xxx/Development/nest-test/dist/node_modules",
    "/Users/xxx/Development/nest-test/node_modules",
    "/Users/xxx/Development/node_modules",
    "/Users/xxx/node_modules",
    "/Users/node_modules",
    "/node_modules",
    "/Users/xxx/.node_modules",
    "/Users/xxx/.node_libraries",
    "/Users/xxx/.nvm/versions/node/v10.15.3/lib/node"
]

...

$ pwd
/Users/xxx/Development/nest-test/node_modules
$ ll @app 
total 0
drwxr-xr-x    3 xxx  staff     96 May 30 09:04 .
drwxr-xr-x  608 xxx  staff  19456 May 30 09:04 ..
lrwxr-xr-x    1 xxx  staff     65 May 30 09:04 foo -> ../../../../.nvm/versions/node/v10.15.3/lib/node_modules/@app/foo```

1 个答案:

答案 0 :(得分:0)

根据tsconfig-paths的docs,可以在使用node执行构建的源代码时使用它。 您引用的问题注释也提到了使用node执行。

实际上,问题是在使用节点dist / main.js执行构建的文件时发生的,而不是在使用tsc的构建过程中发生的。

我通过遵循tsconfig-paths文档中的theses instructions设法获得了可行的解决方案。 @bisonfoutu创建了示例存储库here

  • 将一个名为tsconfig-paths-bootstrap.js的文件添加到项目的根目录,然后将文档中的代码粘贴到其中。
  • start:prod脚本更改为:node -r ./tsconfig-paths-bootstrap.js dist/main.js
  • 您现在应该可以使用TS路径编译和执行项目。 (请注意,如果tsconfig.json中未设置任何路径,则将无法编译)