Когда я хотел создать библиотеку компонентов React, чтобы повторно использовать свой код, я прочитал много статей и пакетов, чтобы создать шаблон для простого создания и тестирования моей библиотеки компонентов, и я нашел несколько руководств по этому поводу, но большинство из них использовали npm link для общения между приложением для игровой площадки (приложение, которое должно быть платформой для проверки результата) и нашей библиотекой компонентов, и я обнаружил, что npm link имеет некоторые проблемы с окнами.

поэтому в этой статье мы собираемся создать шаблон библиотеки компонентов реагирования без использования npm link и тому подобного.

В этой статье мы собираемся создать два отдельных проекта, один из которых является нашим проектом игровой площадки, который используется для тестирования нашей библиотеки компонентов, а второй - основным проектом, который мы используем для его создания. вверх по нашей библиотеке

с завершенным проектом можно ознакомиться по этой ссылке: https://github.com/aliyr/React-library-boilerplate/

шаг 1: создать структуру

Во-первых, мы создаем наши основные папки проекта.

откройте свой терминал и создайте эти папки:

> mkdir react-library-boilerplate
> cd react-library-boilerplate
> mkdir boilerplate

примечание: playground проект сделаем по-другому!

как упоминалось ранее, мы создали два отдельных проекта для создания нашей библиотеки компонентов реакции и тестирования ее в проекте игровой площадки.

шаг 2: создать шаблонный проект

второй и основной шаг, мы собираемся создать шаблонный проект. просто запустите эту команду:

> npm init
package name: (boilerplate)
version: (1.0.0)
description: a boilerplate for easily creating and testing react component libs !
entry point: (index.js)
test command:
git repository:
keywords:
author: alious
license: (ISC)

Теперь наш проект создан и готов к развитию! на втором этапе пора установить react и react-dom

> npm install react react-dom

а также babel и webpack:

> npm install --save-dev babel-cli babel-core babel-loader babel-preset-env webpack-cli webpack 
> npm install babel-preset-react babel-preset-es2015

Затем создайте 3 папки с именами dist, lib и src, чтобы наш проект был таким:

├--- boilerplate
      ├--- /src
      ├--- /lib
      ├--- /dist
      ├--- /node_modules
      └--- package.json

следующий шаг - настроить .babelrc и webpack.config.js в корне проекта, а затем просто скопировать и вставить приведенный ниже код в webpack.config.js:

const webpack = require('webpack');
module.exports = {
    devtool:'source-map',
    entry: './src/index.js',
    output: {
        path : __dirname + "/dist",
        filename : "bundle.js"
    },
    devServer: {
        inline: false,
        contentBase: "./dist",
    },
    module: {
    rules: [
         {
             test:/\.js$/,
             exclude:/node_modules/,
             loader: "babel-loader",
          },
         {
         test:/\.css$/,
         loader : ["style-loader","css-loader"]
       }
      ]
},
plugins: [
    new webpack.DefinePlugin({
    'process.env': {
    "NODE_ENV": JSON.stringify('production')
    }
  })
 ]
}

и этот код на .babelrc:

{
"presets": [
    "es2015",
    "react"
   ]
}

эти коды, приведенные выше, помогают нам перенести наш код с es6 или выше на es5 (.babelrc) и получить производственную сборку из нашего проекта (webpack.config.js)

Затем в папке /src создадим компонент и назовем его Button.js:

import React , {Component} from 'react';
class Button extends Component{
   constructor(props) {
      super(props);
   }
   render() {
      return(
         <button>hello {this.props.text}!</button>
      )
   }
}

в этом компоненте нет ничего особенного, но вы можете добавить к нему больше логики и тегов JSX.

Теперь пришло время создать и перенести наш компонент. для этого мы делаем два сценария для операций транспиляции и сборки, открываем ваш package.json файл и добавляем эти две команды в "scripts":

"transpile": "node_modules/.bin/babel ./src --presets babel-preset-es2015 -d lib",
"build": "webpack --progress --colors --p"

первая команда сообщает babel, что нужно получить все файлы в папке /src, преобразовать их в es5 и поместить в папку /lib.

Вторая команда просто получает производственную сборку из нашего проекта.

для следующего шага просто запустите npm run transpile. теперь мы видим, что Button.js преобразован в ES5 и готов к использованию!

чтобы сделать наш шаблон доступным для чтения другим проектом (в нашем случае playground project), мы должны сделать компонент нашим основным файлом, поэтому откройте файл package.json и измените "main": "index.js" на путь к компоненту, в нашем случае это: lib/Button.js.

Шаг 3: создайте проект детской площадки

на предыдущем шаге наш шаблонный проект был завершен и готов к использованию, и на этом шаге мы собираемся создать простой проект, который позволит нам протестировать нашу библиотеку компонентов:

давайте откроем терминал и перейдем в каталог main, создадим проект реакции через create-react-app:

> npm init react-app playground
> cd playground

Теперь нам нужно импортировать наш boilerplate проект в playground проект, для этого мы должны добавить наш шаблонный путь проекта к зависимостям проекта игровой площадки, поэтому откройте package.json и добавьте это в dependencies:

"dependencies": {
   ...
   "boilerplate": "file:../boilerplate",
   ...
},

на следующем шаге мы должны добавить шаблон в проект детской площадки node_modules, поэтому для этого запустите npm install.

Последнее, что нужно сделать, это добавить наш Button.js компонент в проект игровой площадки и посмотреть, что произойдет в App.js, давайте воспользуемся кнопкой:

import React, { Component } from 'react';
...
import Button from 'boilerplate';
...
class App extends Component {
   render() {
      return (
         <div className="App">
            <Button text="World" />
         </div>
      );
   }
}

export default App;

теперь мы видим, как появляется наша кнопка!

Примечание: каждый раз, когда вы вносите изменения в свою библиотеку, вы должны запускать npm run transpile

Шаг 4: используйте gulp для улучшения нашего проекта (необязательно)

есть еще одна проблема: что, если мы хотим создать несколько компонентов и использовать их в нашем проекте игровой площадки?

Итак, есть два решения:

1 -сделайте все компоненты в один файл, а затем экспортируйте и транспилируйте их

2 -сделать каждый компонент отдельным файлом и объединить их в один файл

первый вариант - не лучшее решение для нас, потому что, если у нас много компонентов, будет очень сложно читать и редактировать код. так что второй намного лучше. Чтобы объединить наши файлы в один файл, нам нужно использовать инструмент автоматизации, который помогает нам выполнять весь процесс автоматически. Теперь давайте установим наши необходимые пакеты в шаблонный проект:

> npm i --save-dev gulp gulp-concat gulp-babel

Подсказка: перед использованием gulp убедитесь, что вы были установлены gulp-cli глобально на вашем компьютере.

для следующего шага создайте gulpfile.js, чтобы мы могли поместить в него нашу конфигурацию.

затем в gulpfile.js введите эти коды.

const gulp = require('gulp');
const babel = require('gulp-babel');
const concat = require('gulp-concat');
gulp.task('default', () =>
   gulp.src('src/*.pl.js')
   .pipe(babel({
      presets: [
         "es2015",
         "react"
      ]
   }))
   .pipe(concat('all.js'))
   .pipe(gulp.dest('lib'))
);

эта default задача просто получает все файлы из папки src и .pl.js расширения, затем конвертирует их в ES5 с помощью gulp-babel и, наконец, объединяет их в файл all.js и помещает в папку lib.

Подсказка 1: в используемом мной расширении нет ничего особенного, вы можете изменить его на любое другое.

Совет 2: после этого вы должны создать каждый компонент с расширением, которое вы создали ранее, и заменить на него предыдущее расширение компонента. в нашем случае это .pl.js.

А теперь давайте создадим новый компонент и назовем его Header.pl.js:

import React , {Component} from 'react';
export class Header extends Component{
   constructor(props) {
      super(props);
   }
   render() {
      return(
         <h1>this is {this.props.text}!</h1>
      )
   }
}

Подсказка: вы должны использовать export компонент вместо export default, потому что все компоненты будут склеены, и мы не должны иметь несколько export default в одном файле.

после этого мы должны запустить команду gulp:

> gulp default

так что наши компоненты готовы к использованию через all.js.

последнее, что мы хотим сделать, это изменить наш главный файл проекта на all.js, поэтому откройте файл package.json и замените его.

так что мы можем использовать несколько компонентов в одном файле без каких-либо грязных

Надеюсь, вам понравится эта статья, и она сработает для вас