【问题标题】:can't find published React component module找不到已发布的 React 组件模块
【发布时间】:2018-10-17 20:07:43
【问题描述】:

我向 NPM 发布了一个 React 组件,当尝试在另一个项目中使用它时,我找不到该模块!

Module not found: Can't resolve 'react-subreddit-posts' in '/Users/kyle.calica/Code/exmaple/app/src'

我在创建可以在开发时导入的 Webpack 包时遇到了麻烦。我相信这是因为我正在制作 ES6 类符号但试图编译以便我可以导入?我能够“修复”它。但现在我在使用它时遇到了麻烦。

这是我的 React 组件的 webpack.prod.config.js

const path = require("path");

module.exports = {
  mode: 'production',
  entry: path.join(__dirname, "src/index.js"),
  output: {
    path: path.resolve(__dirname, 'build'),
    filename: 'index.js',
    libraryTarget: "commonjs2"
    },
  module: {
    rules: [
      {
        test: /\.(js|jsx)$/,
        exclude: /node_modules/,
        use: [
          {
            loader: "babel-loader",
            options: {
              presets: ["react"],
              plugins: ["transform-class-properties"]
            }
          }
        ]
      },
      {
        test: /\.css$/,
        use: ["style-loader", "css-loader"]
      }
    ]
  },
  resolve: {
    extensions: [".js", ".jsx"]
  }
};

这是我的组件的入口 JS 文件,index.js 是我如何在我的 React 组件中创建类的一个很好的例子:

import React, { Component } from 'react';
import ListContainer from './ListContainer';
import ListItemComponent from './ListItemComponent';

const redditAPI = 'https://www.reddit.com/r/';

export default class SubredditPosts extends Component {
  constructor(props) {
    super(props);
    this.state = {
      redditPosts: [],
      isLoading: true
    };
  }

  componentDidMount() {
    const uri = `${redditAPI}${this.props.subreddit}.json`;
    fetch(uri)
      .then(data => data.json())
      .then(this.handlePosts)
      .catch(err => console.error(err));
  }

  handlePosts = (posts) => {
    const apiPosts = posts.data.children.map((post, index) => {
      return {
        key: index,
        title: post.data.title,
        media: this.getMediaFromPost(post),
        link: post.data.url
      };
    });

    this.setState({
      redditPosts: apiPosts,
      isLoading: false
     });
  }

  getMediaFromPost = (post) => {
    const extension = post.data.url.split('.').pop();

    if (post.data.hasOwnProperty('preview') &&  !extension.includes('gif')) {
      return post.data.preview.images[0].source.url;
    }

    //do not use includes! because of Imgur's gifv links are not embeddable
    if (extension === 'gif' || extension.includes('jpg') ||  extension.includes('jpeg')) {
      return post.data.url;
    }

    //if can't load media then place placeholder
    return this.props.placeholder;
  }

    render() {
      return(
        <ListContainer display={this.props.display}>
        { !this.state.isLoading && this.state.redditPosts.map(post => (
          <ListItemComponent
            display={this.props.display}
            key={post.key}
            link={post.link}
            media={post.media}
            title={post.title}
            height={this.props.height}
            width={this.props.width}
          />
        ))}
        </ListContainer>
      );
    }
}

这是我项目中的App.js,它试图使用我从 NPM 中提取的已发布 React 组件:

import React, { Component } from 'react';
import SubredditPosts  from 'react-subreddit-posts';
import logo from './logo.svg';
import './App.css';

class App extends Component {
  render() {
    return (
      <div className="App">
        <header className="App-header">
          <img src={logo} className="App-logo" alt="logo" />
          <p>
            Edit <code>src/App.js</code> and save to reload.
          </p>
          <a
            className="App-link"
            href="https://reactjs.org"
            target="_blank"
            rel="noopener noreferrer"
          >
            Learn React
          </a>
        </header>
        <div class="row">
        <SubredditPosts
          subreddit="aww"
          display="tile"
          placeholder="some_link_image_url_OR_image_path"
          width="250px"
          height="250px"
          />
        </div>
      </div>
    );
  }
}

export default App;

我在捆绑和导出 React 组件时做错了什么? 还是我只是导入错误?

【问题讨论】:

  • 它是否存在于您的 node_modules 文件夹中?
  • @Volodymyr 是的。我亲眼所见。我尝试使用绝对路径,但收到警告说您不能在我的源文件夹之外这样做——我的示例应用程序使用 create-react-app

标签: javascript reactjs npm webpack


【解决方案1】:

刚刚安装了你的包,结果发现它是一个糟糕的发布。

当你从 node_modules 导入包时,node/webpack 会找到目录,读取其中的 package.json 文件,然后导入 package.json 中 main 字段指示的文件。如果其中任何步骤失败,您的导入将无法解决。

你的 package.json 写着 "main": "dist/index.js",但发行版中没有 dist 目录,只有 lib 目录。

将字段更改为"main": "lib/index.js" 可能会起作用,但还有其他问题。你的依赖无处不在。 devDependencies 是只有开发人员才需要的软件包。它用于构建工具、测试工具、linter 等。dependencies 是软件包正常工作所必需的。不同的是,安装包时会安装dependnecies的依赖,但不会安装依赖的devDependencies

在您的情况下,您需要 dependencies 中的 react 和 react-dom 以及 devDependnecies 中的其他所有内容。此外,npm 始终是全局安装的,您的 package.json 中根本不需要它。

我建议您查看维护开源软件包的指南和/或检查现有软件包的设置方式。这并不难理解,但是在开发应用程序时,您应该知道很多事情您并不关心。

【讨论】:

  • 顺便说一句,您还可以查看如何使用 npm link(尽管我真的为此推荐使用 yarn)在本地测试对 npm 包的更改,而不必每次进行更改时都发布
  • 太棒了,谢谢!我以为我还在用 import/export 搞乱 ES6 类。所以我的目标是拥有一个不依赖其他任何东西的项目。我不知道我的dependencies 是如何与我的devDependencies 混淆的,我肯定会解决这个问题。是的,我会尝试找到一个好的指南。我会看看进行这些更改是否能解决任何问题,我会在这里报告并将你的标记为答案
  • 太棒了!谢谢你!自从我重构以来,我在 webpack 和我的构建中打破了很多。现在我发现我还弄坏了其他东西,但至少这让我重回正轨!非常感谢!我可能会在这里评论我找到的任何资源来记录与此问题有关的所有内容。对于以后的垃圾邮件,我们深表歉意。
  • 我也认为你的意思是build 目录不是lib,我没有lib 目录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 2021-12-25
  • 2016-09-29
  • 1970-01-01
  • 2015-09-20
相关资源
最近更新 更多