簡體   English   中英

即使 tsc 成功解決了它,也找不到 Typescript 模塊

[英]Cannot find Typescript module even though tsc successfully manages to resolve it

我有一個用 Typescript 編寫的 Node.js 項目,該項目預計將作為 CLI 運行,並且無法使用絕對路徑(相對路徑工作正常)導入位於node_modules目錄之外的模塊。 值得一提的是,我正在使用oclif 框架來構建我的 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/**/*"
  ]
}

如果有人能對這個問題有所了解,或者至少建議去哪里尋求進一步的幫助,我將不勝感激。 如果需要更多詳細信息,請告訴我。

提前致謝!

事實證明,問題是由於這樣一個事實,盡管 tsc 和 ts-node 都使用baseUrl進行絕對路徑解析,但它們都沒有在生成的 Javascript 代碼中執行從絕對路徑到相對路徑的任何類型的實際映射。 換句話說,轉譯的 JS 文件和 ts-node 內部生成的代碼最終都具有:

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

而我期望它們包含以下內容:

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

這阻止了節點的模塊加載器找到模塊。 我相信 ts-node 也不起作用,因為根本沒有 tsconfig.json 文件來指示路徑映射。

盡管 IMO 令人困惑,並且沒有正確記錄,但這是預期的行為,正如此處所討論的。 截至目前,Typescript 不支持絕對到相對路徑的映射(請參閱https://github.com/Microsoft/TypeScript/issues/15479 )。

為了避免被稱為路徑地獄的情況,這意味着具有非常深的相對導入路徑,我發現module-aliastsmodule-alias非常有用。 這些模塊改變了模塊加載器的行為,以便它自動將別名映射到相對路徑。

有關該問題的更多信息,請參閱 Github 上的此問題

另一個可能相關的解決方案是使用NODE_PATH=dist node dist/index.js運行節點。 這實質上指定node每個絕對導入(相對於baseUrl )應使用的路徑

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM