【问题标题】:Why the same package are installed in a different way?为什么相同的软件包以不同的方式安装?
【发布时间】:2019-05-31 07:56:48
【问题描述】:

我为我的两个项目安装了相同的包。那个包(不会链接,它是私有的)具有 react-popper 作为依赖项(按顺序具有 create-react-context 作为依赖项),因此,当我运行项目一时 - 一切正常,但项目二出现错误:

./node_modules/react-popper/lib/esm/Manager.js 中的错误 找不到模块:错误:无法解析“/../node_modules/react-popper/lib/esm”中的“create-react-context”

经过一番调查,我发现 node_modules 结构不同:

  • 对于项目一,所有的 react-popper 依赖都保存在项目一中 节点模块和本地文件夹仅包含警告包:

  • 对于项目二,所有 react-popper 依赖项保存在 ../react-popper/node_modules 本地文件夹中:

我尝试了一些常见的方法,例如重新安装节点模块,清除缓存等,但结构是相同的。其实我对 webpack 和 babel 版本是有想法的,但我认为它不会影响 node_modules 结构本身。

所以问题是,哪些因素会影响它?我应该检查什么?

注意:如果我手动将 create-react-context 添加到项目二,它可以正常工作,但这不是解决方案。

注意:我发现了类似的问题,但没有建议 - Why does npm install packages in different directories?,我的情况是重新创建 yarn.lock 也有帮助,但它看起来也不是正确的解决它的方法。希望我的描述更完整,并有助于弄清楚。

【问题讨论】:

    标签: javascript node-modules yarnpkg


    【解决方案1】:

    这很可能是由于 yarn(以及 npm)尝试deduplicate 依赖项的方式。假设模块 A 和 B 存在于 2 个版本(1.0.0 和 2.0.0)中。 B 依赖于模块 A 的 1.0.0 版本。

    如果你只安装模块 B,你会得到一个这样的 node_modules 文件夹:

    node_modules
    - A@1.0.0
    - B@2.0.0
    

    但是,如果您安装模块 A 的最新版本 (2.0.0) 会怎样?如果 npm 刚刚更新了模块 A 的版本,您现有的模块 B 将(可能)不再工作,因为它依赖于模块 A。因此您的 node_modules 文件夹将看起来像这样(A@1.0.0 移动到 B 的 node_modules 文件夹中)

    node_modules
    - A@2.0.0
    - B@2.0.0
    -- A@1.0.0
    

    您的 2 个项目可能有更多的依赖项,它们在某种程度上与 react-popper 或其依赖项重叠。由于 nodeJs 的模块解析机制,这通常不应该是一个问题。

    TLDR:node_modules 文件夹的确切结构取决于您的所有依赖项(和 devDependencies)。 yarn/npm 将查看项目依赖项(及其依赖项)的每个 package.json/package-lock.json 文件,并使用此信息来计算重复最少的依赖项树。

    【讨论】:

    • 信息量很大。在我们的例子中,create-react-context 包没有安装在全局目录中,尽管它只在 react-popper 中使用。我敢打赌我们的锁定文件有问题。谢谢。
    猜你喜欢
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    相关资源
    最近更新 更多