【问题标题】:How to avoid TypeScript modules resolving from parent directories of the project instead of node_modules?如何避免从项目的父目录而不是 node_modules 解析 TypeScript 模块?
【发布时间】:2018-03-15 05:30:04
【问题描述】:

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

我在我的项目所在目录的父目录中也有此模块的本地安装版本。

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

为什么 TypeScript 会解析它正在构建的目录之外的模块?它怎么能在它自己的文件夹之外找到我的模块,而不仅仅是在节点模块中找到它?

【问题讨论】:

    标签: typescript


    【解决方案1】:

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

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

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

    来自 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) 在节点的解析逻辑上。

    确保您正确使用它。

    【讨论】:

    • 我接受了这个答案,但只想为最终阅读这个答案的人补充一点,令人困惑的是 TypeScript 不会关心 package.json 文件中的 main 中的内容。这用于加载构建的 JavaScript 文件,但如果您的模块是未编译的 TypeScript,则解决方案是在模块文件夹的根目录下有一个 index.ts 文件。这在another question I asked中有更详细的解释。
    • @Liana Pigeot 你在你的 'package.json' 中尝试使用 'types' 而不是 'main' 吗?
    • 我确实试过了,但是当我尝试时它似乎不起作用。我设法让它工作的唯一方法是在根目录下有一个 index.ts,这显然是 TypeScript 的样子默认情况下。
    【解决方案2】:

    当你从 npm 导入时,你不能通过文件名导入(除非你写了以 ./node_modules 开头的完整路径...不要),只能通过包。它没有找到,所以它转而寻找本地文件。

    所以假设你在 node_modules 中有一个实际的包 my-module,它有一个入口点(package.json 中的 main),上面写着 export something,那么 import {something} from 'my-module' 应该可以解决问题。

    【讨论】:

    • 按文件名导入是合法的。来自 Node.js 文档:“如果找不到确切的文件名,那么 Node.js 将尝试加载所需的文件名并添加扩展名:.js、.json,最后是 .node。”
    • 当然可以,正如所说的那样,在这种情况下路径需要以 ./node_modules 开头,我的意思是,如果您正在制作可重用的模块,那么将其强加给用户并不是一个好主意。
    • 确实可以从../node_modules 导入,这是我目前正在做的,但我想正确导入 npm 包。但是我还没有找到任何真正有效的方法。我发布了一个 different question 关于如何实际加载 npm 模块的主打字稿文件的帖子,因为我尝试过的似乎不可能......
    猜你喜欢
    • 2016-05-10
    • 2017-06-28
    • 1970-01-01
    • 2017-05-27
    • 2017-06-17
    • 2019-10-27
    • 1970-01-01
    • 2013-03-11
    • 2018-10-02
    相关资源
    最近更新 更多