NodeJS 使用模块的模块而不是项目的模块

NodeJS using module's module instead of project's module

尝试在我自己的项目中使用特定版本的节点模块 (v0.2.0),但我的一个依赖项需要同一模块的 v0.1.8。没问题,我认为,该依赖项将在其嵌套的 node_modules 文件夹中使用 v0.1.8,而我的应用程序将在我项目的 node_modules 文件夹中使用 v0.2.0。我再次将 v0.2.0 添加为 package.json 和 运行 npm install 的依赖项。但是,由于某种原因,当我按住 ctrl 单击它时,我的应用程序指向另一个依赖项的 v0.1.8 模块(在其嵌套 node_modules 中),而不是正确安装在项目自己的 [=15] 中的预期 v0.2.0 模块=] 文件夹。这是我用来从模块导入的代码(@metaplex/js 依赖于 @solana/spl-token 的 v0.1.8,而我自己需要使用 @solana/spl-token 的 v0.2.0应用程序):

import { ... } from "@solana/spl-token";
import { ... } from '@metaplex/js';

我确认 v0.1.8 spl-token 安装在 ./node_modules/@metaplex/js/node_modules/@solana/spl-token,v0.2.0 spl-token 安装在 ./node_modules/@solana/spl-token。我还 运行 npm ls @solana/spl-token 以确保它在依赖树中,结果如下:

├─┬ @metaplex-foundation/mpl-token-metadata@1.2.5
│ └── @solana/spl-token@0.1.8
├─┬ @metaplex/js@4.12.0
│ ├─┬ @metaplex-foundation/mpl-auction@0.0.2
│ │ └── @solana/spl-token@0.1.8
│ ├─┬ @metaplex-foundation/mpl-metaplex@0.0.5
│ │ ├─┬ @metaplex-foundation/mpl-token-metadata@0.0.2
│ │ │ └── @solana/spl-token@0.1.8 deduped
│ │ └── @solana/spl-token@0.1.8
│ ├─┬ @metaplex-foundation/mpl-token-vault@0.0.2
│ │ └── @solana/spl-token@0.1.8
│ └── @solana/spl-token@0.1.8
└── @solana/spl-token@0.2.0

我无法弄清楚为什么当我在项目的 node_modules 文件夹中安装了正确的版本时,我的代码仍然从另一个依赖项使用的错误版本中导入。是否有解决此问题的解决方法或解决方案?

节点新手,抱歉

编辑:(我的项目是一个打字稿反应项目)做了更多的探索,显然,模块的 package.json 的 v0.1.8 types 属性 指向一个*.d.ts 像这样的文件:

declare module '@solana/spl-token' {

  export //functions, fields, etc

}

而 v0.2.0 的 package.jsontypes 属性 指向一个简单的 *.d.ts 文件,如

export * from './instructions/index';
...

(注意模块本身没有特定的 declare 关键字) 每个函数都有一个单独的 *.d.ts,其中特定成员是 declared,例如 functionName.d.ts:

export declare function functionName(...): Promise<...>;

我不知道此更改是否会导致某种类型的名称空间冲突,但看起来这是一个与此特定模块有关的非常具体的错误,而不是节点的一般错误。

非常具体的错误是什么意思?

这是一个很常见的问题 在你 tsconfig.json 设置 baseUrlpaths

{
...
"baseUrl":"./node_modules",
"paths":{
"name-of-the-package":[
   "relative-to-baseurl/position/where/yow-code-is"
]
}}

yow代码的位置是相对于baseUrl的。