Не удается найти модуль Typescript, хотя tsc успешно может его решить - PullRequest
0 голосов
/ 30 мая 2018

У меня есть проект Node.js, написанный на Typescript, который, как ожидается, будет работать как CLI, и мне не удается импортировать модуль, расположенный вне каталога node_modules, используя абсолютный путь (относительные пути работают нормально).Может быть важно упомянуть, что я использую oclif framework для построения моего CLI.

Мой проект организован следующим образом:

cli
 |--node_modules
 |--src
     |--my-module.ts
     |--subdir
          |--index.ts

В пределах my-module.tsУ меня есть:

 export class MyClass {
     myClassFcn(s: string) {
         return 'result'
     }
 }

Сценарий index.ts содержит что-то вроде:

 import {MyClass} = require('my-module')

Когда я пытаюсь выполнить свое приложение с помощью ts-node, я получаю

(node:10423) [MODULE_NOT_FOUND] Error Plugin: cli: Cannot find module 'my-module'
    module: @oclif/config@1.6.17
    task: toCached
    plugin: cli
    root: /home/eschmidt/Workspace/cli
    Error Plugin: cli: Cannot find module 'my-module'
        at Function.Module._resolveFilename (internal/modules/cjs/loader.js:571:15)
        at Function.Module._load (internal/modules/cjs/loader.js:497:25)
        at Module.require (internal/modules/cjs/loader.js:626:17)
        at require (internal/modules/cjs/helpers.js:20:18)
        at Object.<anonymous> (/home/eschmidt/Workspace/cli/src/commands/create/index.ts:5:1)
        at Module._compile (internal/modules/cjs/loader.js:678:30)
        at Module.m._compile (/home/eschmidt/Workspace/cli/node_modules/ts-node/src/index.ts:403:23)
        at Module._extensions..js (internal/modules/cjs/loader.js:689:10)
        at Object.require.extensions.(anonymous function) [as .ts] (/home/eschmidt/Workspace/cli/node_modules/ts-node/src/index.ts:406:12)
        at Module.load (internal/modules/cjs/loader.js:589:32)
    module: @oclif/config@1.6.17
    task: toCached
    plugin: my-plugin
    root: /home/eschmidt/Workspace/cli

Что я не могу понять, так это то, что при запуске tsc --traceResolution модуль правильно разрешается:

======== Module name 'my-module' was successfully resolved to '/home/eschmidt/Workspace/cli/src/my-module.ts'. ========

Мой tsconfig.json файл содержит:

{
  "compilerOptions": {
    "declaration": true,
    "moduleResolution": "node",
    "forceConsistentCasingInFileNames": true,
    "importHelpers": true,
    "module": "commonjs",
    "sourceMap": true,
    "outDir": "./lib",
    "pretty": true,
    "rootDirs": [
      "./src/"
    ],
    "strict": true,
    "target": "es2017",
    "baseUrl": "src"
  },
  "include": [
    "./src/**/*"
  ]
}

Я быЯ очень признателен, если кто-нибудь сможет пролить свет на эту проблему или хотя бы предложить, где искать дополнительную помощь.В случае необходимости более подробной информации, пожалуйста, дайте мне знать.

Заранее спасибо!

1 Ответ

0 голосов
/ 01 июня 2018

Оказывается, проблема была в том, что, хотя и tsc, и ts-node используют baseUrl для абсолютного разрешения пути, ни один из них не выполняет никакого фактического отображения из абсолютных в относительные пути в сгенерированном коде Javascript,Другими словами, и транспортируемые файлы JS, и код, созданный внутренне с помощью ts-узла, в итоге имеют:

import  {MyClass} = require('my-module')

, тогда как я ожидал, что они будут содержать что-то вроде:

import  {MyClass} = require('../my-module')

что помешало загрузчику модуля узла найти модуль.Я полагаю, что ts-node также не работал, потому что просто не было файла tsconfig.json, который бы указывал сопоставления путей.

Хотя вводит в заблуждение IMO и не задокументировано должным образом, это ожидаемое поведение, как обсуждалось здесь .На данный момент отображение абсолютного и относительного пути не поддерживается Typescript (см. https://github.com/Microsoft/TypeScript/issues/15479).

Чтобы избежать ситуации, известной как путь ада, что означает наличие очень глубоких относительных путей импорта, я обнаружил module-alias и tsmodule-alias , чтобы быть очень полезными. Эти модули изменяют поведение загрузчика модулей, так что он автоматически сопоставляет псевдонимы с относительными путями.

Для получения дополнительной информации опроблема, обратитесь к этой проблеме на Github.

...