не могу найти опубликованный модуль компонента React - PullRequest
0 голосов
/ 17 октября 2018

Я опубликовал компонент React для NPM, и при попытке использовать его в другом проекте я не смог найти модуль!

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 пытается использовать опубликованный компонент React, который я извлек из NPM:

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?Или я просто неправильно импортирую?

1 Ответ

0 голосов
/ 18 октября 2018

Только что установил ваш пакет, и публикация оказалась плохой.

Когда вы импортируете пакет из node_modules, node / webpack находит каталог, читает в нем файл package.json, затем импортируетфайл, указанный полем main в package.json.Если какой-либо из этих шагов завершится неудачно, ваш импорт не будет решен.

Ваш package.json говорит "main": "dist/index.js", но в выпуске нет каталога dist, только каталог lib.

Изменение поляна "main": "lib/index.js", вероятно, будет работать, но есть и другие проблемы.Ваши зависимости повсюду.devDependencies - это пакеты, которые нужны только разработчикам, работающим над пакетом.Он используется для инструментов сборки, инструментов тестирования, линтеров и т. Д. * Для правильной работы пакета требуется dependencies.Разница в том, что dependnecies зависимости будет установлен при установке пакета, но devDependencies зависимости не будет установлен.

В вашем случае вам нужно реагировать и реагировать вdependencies и все остальное в devDependnecies.Кроме того, npm всегда устанавливается глобально, и он вам вообще не нужен в вашем package.json.

Я бы порекомендовал вам поискать руководство по поддержке пакета с открытым исходным кодом и / или проверить, как существующий.настроен.Это не так сложно понять, но есть много вещей, о которых вам следует знать, но вам просто наплевать на разработку приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...