Статьи

ReactJS Webpack Учебное пособие

В этой статье мы рассмотрим конфигурацию Reactjs Webpack для приложения Reactjs. Webpack — чрезвычайно популярный пакет. Мы рассмотрим, как мы можем настроить его и настроить его с нуля для Приложения, созданного с помощью Reactjs. В частности, мы рассмотрим конфигурацию babel для переноса кода JSX, помимо других обычных элементов, таких как CSS и изображения.

1. Введение

Итак, давайте начнем без дальнейших задержек. Для начала я создал очень простое приложение Reactjs с нуля всего с двумя компонентами. Мы будем использовать Webpack для комплектации этого приложения и изучим концепции, которые помогут вам с настройкой для других более крупных приложений.

Структура папок нашего основного приложения React выглядит следующим образом. Я буду обсуждать каждый артефакт и его содержимое после изображения.

ReactJS Webpack - структура папок
Структура папок

папка dist

Эта папка будет содержать наши встроенные артефакты, готовые к отправке в браузер по запросу. Артефакты будут включать JavaScript, CSS-файлы.

папка js

Эта папка содержит наши файлы кода React. В нашем случае здесь у нас есть два App.js и Greeting.js. Наше приложение React отображает простое приветствие в теге h1.

общая папка

Эта папка содержит наши HTML-страницы. У нас есть одна страница index.html в нашем приложении.

2. Установка Webpack

Для начала мы установим webpack и CLI webpack локально и сохраним их как dev-зависимости нашего проекта. Нам нужно выполнить следующие две команды одну за другой, чтобы выполнить это.

1
2
> npm install webpack --save-dev
> npm install webpack-cli --save-dev

Эти команды установят webpack локально для нашего проекта и являются рекомендуемым способом.

Теперь, начиная с версии 4, нам больше ничего не нужно делать, чтобы использовать веб-пакет. Да, нет файлов конфигурации или файла настроек. Webpack использует интеллектуальные значения по умолчанию для всех настроек, поэтому мы можем просто запустить следующую команду в корне нашего проекта.

1
> webpack

Но большинство проектов должны обрабатывать более сложные задачи, например, в нашем случае нам нужно перенести JSX, прежде чем он сможет выполняться в браузере. Итак, в следующем разделе мы рассмотрим, как настроить веб-пакет для выполнения этих задач с использованием файла конфигурации.

3. Настройка ReactJS Webpack

Мы начнем с файла с именем webpack.config.js. Это простой модуль ES6. Одной из первых настроек, которую нам нужно добавить, является настройка режима с одним из значений «разработка», «производство» или «нет». Каждый режим выбирает и устанавливает значения по умолчанию для соответствующих сред. В центре внимания в режиме разработки находятся не горячая перезагрузка модуля и исходные карты, чтобы помочь отладить наше приложение в браузере. А в производственном режиме основное внимание уделяется минимальному размеру пакета, чтобы обеспечить производительность приложения.

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

3.1 Конфигурация входа

В нашем простом приложении реагирования у нас есть два модуля, а именно App.js и Greeting.js, в которых содержится следующий код.

App.js

1
2
3
4
5
6
7
8
9
import React from 'react';
import ReactDom from 'react-dom';
import Greeting from './Greeting';
class App extends React.Component {
    render = () => {
        return <Greeting greet="SiD" />;
    }
};
ReactDom.render(<App />, document.getElementById('root'));

Greeting.js

01
02
03
04
05
06
07
08
09
10
11
import React from 'react';
import '../css/greeting.style.css';
class Greeting extends React.Component {
    constructor(props) {
        super(props);
    }
    render = () => {
        return <h1>Hello { this.props.greet }</h1>;
    }
}
export default Greeting;

Теперь мы перейдем к настройке начальной точки или точки входа нашего приложения, то есть App.js. Мы добавим следующее в наш webpack.config.js. Этот параметр позволяет веб-пакету построить свой график внутренних зависимостей нашего приложения. Обычно существует одна точка входа на страницу приложения.

1
2
3
4
module.exports = {
    mode: 'production',
    entry: { App: './js/App.js' }
}

App.js также является нашим корневым компонентом React и, соответственно, также является модулем входа или запуска нашего приложения.

3.2 Конфигурация выхода

Это одна из ключевых настроек Webpack, в которой мы описываем требуемый вывод и его назначение. Этот параметр указывается с помощью ключа, выводимого в файле webpack.config.js.

1
2
3
4
5
6
7
8
var path = require('path');
...
output: {
        filename: '[name].bundle.js',
        path: path.resolve(__dirname, 'dist'),
        publicPath: 'assets/'
    }
...

Здесь мы сообщаем webpack имя выходного пакета нашего JavaScript-кода и его назначение. Обратите внимание на использование модуля узла пути, чтобы указать точное местоположение нашей папки dist или дистрибутива. Мы подадим наше приложение из этой папки, как мы увидим позже. Параметр publicPath устанавливает URL-адрес, который будет обслуживать содержимое этой папки.

3.3 Настройка загрузчика и плагина

Webpack использует загрузчики, указанные для предварительной обработки файлов перед их объединением в окончательный вывод. Здесь мы используем несколько загрузчиков, чтобы выполнить две задачи, а именно: загрузить файлы CSS и перенести наш код JSX в обычный JavaScript. Итак, давайте посмотрим на каждый из них последовательно.

3.3.1 Загрузка файлов CSS

Мы будем использовать загрузчик для создания отдельного пакета. Но сначала мы должны использовать mini-css-extract-plugin, чтобы извлечь наш CSS из операторов import в наших модулях. Сначала мы установим плагин, используя следующую команду.

1
> npm install mini-css-extract-plugin --save-dev

Теперь мы импортируем это в наш файл настроек и настроим его так.

01
02
03
04
05
06
07
08
09
10
11
12
var MiniCssExtractPlugin = require('mini-css-extract-plugin');
...
plugins: [
        new MiniCssExtractPlugin({
            // Options similar to the same options in webpackOptions.output
            // all options are optional
            filename: '[name].css',
            chunkFilename: '[id].css',
            ignoreOrder: false, // Enable to remove warnings about conflicting order
        })
]
...

Этот плагин будет работать с css-загрузчиком для извлечения стилей CSS в отдельный файл. Далее нам нужно установить css-загрузчик и затем настроить оба в настройках module.rules следующим образом:

1
> npm install css-loader --save-dev

После установки этого загрузчика мы добавим следующую конфигурацию в наш файл настроек веб-пакета.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
...
 module: {
        rules: [
           {
                test: /\.css$/,
                exclude: /node_modules/,
                use: [{
                    loader: MiniCssExtractPlugin.loader,
                    options: {
                        // you can specify a publicPath here
                        // by default it uses publicPath in webpackOptions.output
                        publicPath: 'assets/'
                    }
                }, 'css-loader'
                ]
 
            }
        ]
    }
...

Объект под ключом rules имеет тестовый ключ, который фильтрует файлы, которые будет обрабатывать этот загрузчик. И в нашем случае здесь регулярное выражение выбирает файлы с расширением css. Также мы исключаем папку node_modules и указываем MinissExtractPlugin.loader и css-loader в качестве загрузчиков, используемых для всех файлов css.

3.3.2 Транспортировка кода JSX в JavaScript

Мы будем использовать babel для преобразования нашего кода в простой JavaScript. Итак, давайте сначала установим babel с помощью следующей команды:

1
> npm install --save-dev babel-loader @babel/core

Это установит babel и загрузчик babel для веб-пакета, который мы настроим дальше. Мы добавим babel-загрузчик в наш файл настроек веб-пакета в разделе module.rules. Следующие настройки войдут в файл настроек.

01
02
03
04
05
06
07
08
09
10
11
12
13
...
module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: [{
                    loader: 'babel-loader',
                    options: { presets: ['@babel/preset-react', '@babel/preset-env'] }
                }]
            }
        }
...

Мы использовали две предустановки выше, а именно: @ babel / preset-реакции для переноса JSX и @ babel / preset-env для преобразований синтаксиса ES2015 +.

Наконец, мы смотрим на html-webpack-plugin, чтобы сгенерировать index.html и добавить в него все наши пакеты. После этого мы сможем запустить веб-пакет и увидеть результат в браузере.

3.3.3 Создание HTML-страницы

Чтобы создать HTML-страницу со всеми нашими зависимостями, добавленными как теги сценария или теги ссылки, мы будем использовать html-webpack -plugin. Чтобы установить его, нам нужно выполнить следующую команду в корне нашего приложения.

1
> npm install html-webpack-plugin --save-dev

Затем мы требуем этот плагин в нашей конфигурации веб-пакета и добавляем его в массив плагинов как

1
2
3
4
var htmlPlugin = require('html-webpack-plugin');
...
new htmlPlugin({ template: './public/index.html' })
...

Файл index.html будет нашим шаблоном. Он содержит корневой элемент, в котором будет отображаться корневой компонент нашего приложения React:

index.html

1
2
3
4
5
6
7
8
<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
        <div id="root"></div>          
    </body>
</html>

4. Оптимизация размера пакета

Теперь, когда мы настроили веб-пакет, используя файл настроек. Давайте запустим webpack, чтобы увидеть результаты и приложение в действии. Чтобы отключить это, мы добавляем следующие команды в скрипты в нашем файле package.json.

1
2
"start": "webpack-dev-server --config webpack.config.js"
"build": "webpack --config webpack.config.js"

Теперь, когда мы запустим следующую команду, мы должны увидеть каталог dist с выходными пакетами.

1
> npm run build

Выходной каталог должен иметь наши встроенные артефакты, как показано на рисунке ниже:

ReactJS Webpack - папка дистрибутивов
Dist Folder

Теперь, когда мы запустим следующую команду, мы сможем запустить приложение.

1
> npm start

Переход к URL-адресу http: // localhost: 8080 должен показать следующий результат в браузере.

ReactJS Webpack - выход проекта
Выход проекта

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

ReactJS Webpack - предупреждение о сборке
Предупреждение о сборке

Итак, давайте поработаем над тем, чтобы преобразовать файлы поставщиков в их собственный пакет, чтобы удалить это предупреждение и уменьшить размер нашего пакета. Нам нужно внести изменения в наш файл App.js, который выглядит как показано ниже.

App.js

01
02
03
04
05
06
07
08
09
10
import React from 'react';
import ReactDom from 'react-dom';
import Greeting from './Greeting';
class App extends React.Component {
    render = () => {
        return <Greeting greet="SiD" />;
    }
};
 
ReactDom.render(<App />, document.getElementById("root"));

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

App.js

01
02
03
04
05
06
07
08
09
10
11
import React from 'react';
import Greeting from './Greeting';
class App extends React.Component {
    render = () => {
        return <Greeting greet="SiD" />;
    }
};
 
import(/* webpackChunkName: "react-dom" */'react-dom').then((ReactDom) => {
    ReactDom.render(<App />, document.getElementById('root'));
});

Теперь, когда мы создаем наше приложение, вы заметите новый пакет в папке dist с именем vendor ~ react-dom.bundle.js. Предупреждение, которое мы видели ранее, также исчезло бы. Так как размер входного комплекта значительно уменьшен.

5. Настройка Dev Server

Webpack имеет сервер разработки и может использоваться, как следует из названия, во время разработки, когда мы работаем над нашим приложением. Его можно настроить, как и все остальное, в файле настроек веб-пакета. Сначала нам нужно установить его, хотя. Мы можем сделать это, выполнив следующую команду в корне нашего приложения.

1
> npm install webpack-dev-server --save-dev

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

1
2
3
4
5
6
...
devServer: {
        contentBase: path.join(__dirname, 'dist'),
        compress: true
    }
...

Мы используем модуль узла пути для настройки пути, откуда будет обслуживаться наше приложение. Для этого нужно установить в свойстве contentBase путь наших встроенных артефактов. Мы также устанавливаем значение сжатия равным true, чтобы гарантировать, что наши артефакты будут сжаты перед отправкой в ​​браузер. Наш полный файл конфигурации должен выглядеть следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
var path = require('path');
var MiniCssExtractPlugin = require('mini-css-extract-plugin');
var htmlPlugin = require('html-webpack-plugin');
module.exports = {
    mode: 'production',
    entry: { App: './js/App.js' },
    output: {
        filename: '[name].bundle.js',
        path: path.resolve(__dirname, 'dist'),
        publicPath: 'assets/'
    },
    plugins: [
        new MiniCssExtractPlugin({
            // Options similar to the same options in webpackOptions.output
            // all options are optional
            filename: '[name].css',
            chunkFilename: '[id].css',
            ignoreOrder: false, // Enable to remove warnings about conflicting order
        }),
        new htmlPlugin({ template: './public/index.html' })
    ],
    module: {
        rules: [
            {
                test: /\.js$/,
                exclude: /node_modules/,
                use: [{
                    loader: 'babel-loader',
                    options: { presets: ['@babel/preset-react', '@babel/preset-env'] }
                }]
            },
            {
                test: /\.css$/,
                exclude: /node_modules/,
                use: [{
                    loader: MiniCssExtractPlugin.loader,
                    options: {
                        // you can specify a publicPath here
                        // by default it uses publicPath in webpackOptions.output
                        publicPath: 'assets/'
                    }
                }, 'css-loader'
                ]
 
            }
        ]
    },
    devServer: {
        contentBase: path.join(__dirname, 'dist'),
        compress: true
    },
    resolve: {
        extensions: ['.css', '.js', '.jsx']
    }
};

Теперь, чтобы запустить наше приложение с помощью сервера веб-пакетов. Нам нужно выполнить следующую команду, которую мы предварительно настроили в нашем файле package.json.

1
> npm start

Когда мы перейдем к URL-адресу http: // localhost: 8080, мы увидим страницу index.html нашего приложения, как показано ниже.

ReactJS Webpack - локальный хост
HTTP: // локальный: 8080

Это завершает наш взгляд на настройку веб-пакета для приложения Reactjs.

6. Загрузите исходный код ReactJS Webpack.

Это был пример для ReactJS Webpack.