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.json
的 types
属性 指向一个简单的 *.d.ts
文件,如
export * from './instructions/index';
...
(注意模块本身没有特定的 declare
关键字)
每个函数都有一个单独的 *.d.ts
,其中特定成员是 declare
d,例如 functionName.d.ts
:
export declare function functionName(...): Promise<...>;
我不知道此更改是否会导致某种类型的名称空间冲突,但看起来这是一个与此特定模块有关的非常具体的错误,而不是节点的一般错误。
非常具体的错误是什么意思?
这是一个很常见的问题
在你 tsconfig.json 设置 baseUrl
和 paths
{
...
"baseUrl":"./node_modules",
"paths":{
"name-of-the-package":[
"relative-to-baseurl/position/where/yow-code-is"
]
}}
yow代码的位置是相对于baseUrl的。
尝试在我自己的项目中使用特定版本的节点模块 (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.json
的 types
属性 指向一个简单的 *.d.ts
文件,如
export * from './instructions/index';
...
(注意模块本身没有特定的 declare
关键字)
每个函数都有一个单独的 *.d.ts
,其中特定成员是 declare
d,例如 functionName.d.ts
:
export declare function functionName(...): Promise<...>;
我不知道此更改是否会导致某种类型的名称空间冲突,但看起来这是一个与此特定模块有关的非常具体的错误,而不是节点的一般错误。
非常具体的错误是什么意思?
这是一个很常见的问题
在你 tsconfig.json 设置 baseUrl
和 paths
{
...
"baseUrl":"./node_modules",
"paths":{
"name-of-the-package":[
"relative-to-baseurl/position/where/yow-code-is"
]
}}
yow代码的位置是相对于baseUrl的。