如何避免从项目的父目录而不是node_modules解析TypeScript模块?

时间:2018-03-14 17:09:35

标签: typescript

我有一个安装在node_modules中的模块,并希望从中导入文件。

我还在父目录中有一个本地安装的模块版本到我的项目所在的目录。

出于某种原因,当我执行import { something } from 'my-module/myFile'时,它实际上不是通过进入node_modules来解决它,而是通过将我的本地版本的模块存储在我的机器中的其他位置,父目录。

为什么TypeScript会解析其内置目录之外的模块?它甚至可以在自己的文件夹之外找到我的模块而不只是在节点模块中找到它?

2 个答案:

答案 0 :(得分:3)

从ECMAScript 2015开始,JavaScript有一个模块概念。 TypeScript分享了这个概念。

模块使用模块加载器相互导入。在运行时,模块加载器负责在执行模块之前定位和执行模块的所有依赖关系。 JavaScript中使用的众所周知的模块加载器是Node.js的CommonJS模块加载器和Web应用程序的require.js。

你提到node_modules所以我猜你正在使用Node.js. tsconfig.json文件中的"moduleResolution": "node"

来自Node.js docs

  

如果传递给require()的模块标识符不是核心模块,那么   不是以'/','.. /'或'./'开头,然后Node.js从   当前模块的父目录,并添加/ node_modules和   尝试从该位置加载模块。节点不会附加   node_modules到已经以node_modules结尾的路径。

对于file modules

  

如果找不到确切的文件名,则Node.js将尝试加载   添加扩展名所需的文件名:.js,.json和   终于.node。

     

TypeScript覆盖TypeScript源文件扩展名(.ts,.tsx,   和.d.ts)通过Node的解析逻辑。

确保您正确使用它。

答案 1 :(得分:1)

从npm导入时,您无法通过文件名导入(除非您以./node_modules开头编写完整路径...不要),只能通过包进行导入。它没有找到它,所以它会回头寻找本地文件。

假设你在node_modules中有一个实际的包my-module,它有一个入口点(在package.json中为main),表示export something,那么import {something} from 'my-module'就可以了。< / p>