【问题标题】:React 15 Project not playing well with a React component library using version 16React 15 项目不能很好地与使用版本 16 的 React 组件库配合使用
【发布时间】:2018-11-02 15:14:35
【问题描述】:

我有一个大型 React 项目(项目 A),我正在创建一个组件库(项目 B)以在该项目中使用。项目 B 使用依赖项“react-responsive-carousel”来创建幻灯片卡,我想在多个项目中使用它,包括项目 A。

在 Project B 的 Storybook 下查看时,幻灯片和卡片看起来很棒并且可以正常工作。将卡组件(位于项目 B 中)加载到项目 A 中时,我遇到了以下反应错误(以及损坏的幻灯片): “无法在未安装的组件上找到节点。”

如果我删除使用第三方依赖项 react-responsive-carousel 的幻灯片,错误就会消失,我可以在项目 A 中看到我的卡。我使用了 npm 链接以及通过安装依赖项本地文件路径,并且不良行为会以两种方式发生。

项目 B(组件库)正在使用 React 16.3.2。 项目 A 正在使用 React 15.6.2。

我已尝试将 Project A 的 React 版本降级到 15.6.2,但这会导致 Storybook 出现错误,我想继续使用它来共享组件目录。

将项目 A 更新到 16.3.2 是可能的,但我宁愿现在不这样做,因为引入新版本的 React 会破坏项目 A 的风险。此处介绍了此解决方案:Can my project(react 15) use a dependency that using react 16?

我可以使用对等依赖项来解决这个问题吗?对等依赖项是否已弃用?是否有其他潜在的解决方案我可以探索,或者我应该接受它并更新项目 A?

根据要求,这里是一些代码。我已经简化了很多,试图只保留与这个问题有关的内容。

项目B的依赖:

"devDependencies": {
    "@storybook/addon-knobs": "^3.3.13",
    "@storybook/react": "^3.4.0",
    "react": "^16.3.2",        
    "react-dom": "^16.3.1",
    "react-hot-loader": "^4.2.0",
    "react-redux": "^5.0.7",
    "react-responsive-carousel": "^3.1.37",
    "styled-components": "^3.2.5"
  }

项目A的依赖:

"devDependencies": {
    "my-component-library": "file:../../my-component-library",
    "react": "^15.6.2",
    "react-addons-create-fragment": "^15.6.0",
    "react-addons-css-transition-group": "^15.6.0",
    "react-addons-test-utils": "^15.6.0",
    "react-dom": "^15.6.2",
    "react-responsive-carousel": "3.1.34",
  }

项目 B 中的 Card 组件:

    import React from 'react';
    import styled from 'styled-components';

    import { Carousel } from 'react-responsive-carousel';

    //styled components css/js for 
    //CardContainer that has been taken out to keep the post short

    const Card = ({
        stuff, 
        stuff, 
        stuff //simplified for post
    }) => {
        return (
        <CardContainer>
            <div className="carousel-container">

                <Carousel 
                    showThumbs={false}
                    showStatus={false}
                    emulateTouch={true}
                    infiniteLoop={true}> 
                        <img src="whatever.jpg" />
                        <img src="whatever.jpg" />
                        <img src="whatever.jpg" />
                </Carousel>
            </div>
        </CardContainer>
        );
    };
export default Card;

在项目 B 中,我只是导入卡并使用它:

import { Card } from 'my-component-library';
<Card stuff={stuff} />

【问题讨论】:

  • 您确定错误是版本不匹配造成的吗?据我所知,react 15 和 16 (大部分)与 api 兼容。你能展示一些涉及的代码吗?
  • 我并不完全确定这一点,这就是我发布这个问题的原因,尽管它与之前的问题有点相似。我将不得不稍微简化代码以使其对后期更友好,但我想我可以做到。
  • @SrThompson 我添加了一些代码
  • @Bonnie 我没有看到该代码有任何问题,因此您可能对版本冲突是正确的...在另一个问题中,建议您可以将 react 添加为“peerDependency” ,也许这可能是升级项目 A 的临时替代方案?

标签: reactjs npm storybook


【解决方案1】:

我可以使用对等依赖项来解决这个问题吗?是同行 不推荐使用依赖项?我还有其他潜在的解决方案吗 探索,还是我应该接受它并更新项目 A?

如果这是版本冲突,那么可以肯定 - 您应该使用 peerDependencies,因为它们没有被弃用,这对它们来说是一个非常好的用例 - 这正是像 create-react-appnextjs 这样的框架不强加于您应该在项目中使用哪个版本的 react,但您可以安装项目所需的特定版本。

【讨论】:

  • 谢谢!我正在尝试。是不是像在 React 15 项目中添加 React 16 作为对等依赖一样简单?
  • @Bonnie 你的库不应该捆绑 react 并使用客户端中的那个。但是,如果您的库声明它需要 react 16 作为依赖项,那么客户端应用程序将需要安装版本 16。
猜你喜欢
  • 2015-04-25
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多