Понять, что нужно, чтобы ваше приложение React было быстрее

В этой статье мы увидим, как можно оптимизировать приложение React, созданное в предыдущей статье ЗДЕСЬ.

Для начала клонируйте репозиторий с https://github.com/myogeshchavan97/react_node

Запустите приложение, последовательно выполнив следующие команды

npm install
npm run build
npm run start-server

Откройте инструмент разработчика Chrome и проверьте bundle.js размер файла. Как видите, это почти 1,3 МБ

Также, если вы проверите вкладку «Источники», вы увидите весь написанный нами код под webpack://

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

Webpack предоставляет простой способ оптимизации с помощью флага -p.
Если вы видите наш текущий раздел скриптов в package.json, он выглядит следующим образом

Мы добавим сюда еще один скрипт с флагом -p

"build-prod": "webpack -p"

Теперь раздел скриптов выглядит так

Выполните следующую команду из терминала

npm run build-prod

и проверьте вывод

Как видите, размер файла уменьшился с 1,3 МБ до 169 КБ.

Вы увидите тот же размер 169 КБ, если теперь запустите приложение с помощью npm run start-server и проверьте вкладку сети.

и если вы проверите вкладку источников, вы больше не увидите наш код в webpack://

В приложении все еще есть проблема.

Если вы откроете src/app.js, вы увидите, что мы включили импорт для файла CSS вверху, что является обычной практикой в ​​React.

import './css/styles.css';

Таким образом, CSS не будет загружен, пока не будет загружен javascript, что является проблемой. Итак, теперь мы извлечем CSS из bundle.js и создадим отдельный файл .css.

Итак, начнем с этого.

Установите пакет npm mini-css-extract-plugin, выполнив следующую команду

npm install mini-css-extract-plugin

После установки откройте файл package.json и измените

"build-prod": "webpack -p"

to

"build-prod": "webpack -p --env production"

Здесь мы добавляем переменную среды со значением production.

Теперь в webpack.config.js файле изменим

module.exports = { };

to

module.exports = (env) => {};

Здесь мы возвращаем функцию вместо объекта, поэтому первый параметр функции получит значение переменной среды, которое мы установили в package.json

Ваш webpack.config.js теперь будет выглядеть так:

Теперь мы будем использовать файл mini-css-extract-plugin в webpack.config.js для извлечения CSS.
Добавьте импорт для плагина вверху

const MiniCssExtractPlugin = require('mini-css-extract-plugin');

измените use массив CSS с

use: ['style-loader', 'css-loader']

to

use: [{
 loader: MiniCssExtractPlugin.loader,
 options: {
  publicPath: path.join(__dirname, 'public')
 },
}, 'css-loader'
]

Здесь мы говорим, где создать новый файл CSS.

изменить режим с

mode: 'development'

to

mode: env ? 'production' : 'development'

и добавить новое свойство плагинов в конце

plugins: [
 new MiniCssExtractPlugin({
 filename: 'main.css',
 chunkFilename: 'main.css',
})]

Здесь мы говорим создать отдельный файл CSS с именем main.css

Теперь добавьте ссылку на файл main.css в файл public/index.html

<link rel="stylesheet" href="main.css"></link>

Теперь запустите следующую команду

npm run build-prod

Это создаст новый main.css файл внутри папки public. Вы сможете увидеть отдельные main.css и bundle.js, как показано ниже.

Теперь вы видите, bundle.js размер файла немного уменьшился, и это хорошо.
Теперь, если вы запустите приложение, используя

npm run start-server

вы увидите отдельный main.css файл, загруженный в браузер вместо единственного bundle.js

и приложение по-прежнему работает нормально, и теперь оно будет загружаться быстрее.

Развернуть на Heroku:

1. Установите пакет Heroku, используя

npm install -g heroku

2. Выполните следующую команду с терминала.

heroku login

Это приведет к перенаправлению на сайт Heroku, где вы должны нажать кнопку входа в систему, чтобы войти в heroku-cli

3. После того, как вы нажмете кнопку входа в систему, вы можете переключиться в командную строку и начать процесс развертывания с вашей учетной записью Heroku.

4. Для развертывания на Heroku необходимо внести некоторые изменения в код.

  • Откройте файл server/index.js и добавьте следующий оператор
    const port = process.env.PORT || 3000;
    , а в методе app.listen передайте переменную port вместо 3000.
    Это потому, что Heroku создает переменную среды с именем PORT и назначает случайное порт для вашего приложения, который вы можете использовать
  • Добавьте start скрипт в package.json, который будет автоматически выполняться при развертывании приложения на Heroku.
  • Так что откройте package.json и измените
"start": "webpack-dev-server --watch"

to

"start-server": "webpack-dev-server --watch"

и изменить

"start-server": "nodemon server/index.js"

to

"start": "npm run build-prod && node server/index.js"

Здесь мы запускаем сначала сценарий npm run build-prod, а затем node server / index.js

Нам не нужно nodemon, поскольку после развертывания мы не вносим никаких изменений в производственную среду, поэтому перезапускать сервер не требуется.

Таким образом, при развертывании приложения в Heroku будет выполняться только сценарий start.

5. Создайте новое приложение на Heroku, используя следующую команду

heroku create <any_application_name>
Ex. heroku create my-first-app

6. Как только это будет сделано, приложение будет создано на Heroku, и мы готовы развернуть код.

7. Сделайте текущий проект репозиторием git, выполнив следующую команду

git init . // it's ( git init dot )

8. Теперь добавьте все свои изменения в область подготовки с помощью

git add --all .

9. Зафиксируйте изменения, используя

git commit -m "changes"

10. Отправьте код в Heroku.

git push heroku master

11. Поздравляем, вы установили приложение на Heroku.

Живая демонстрация: https://my-node-react-app.herokuapp.com/
Полный исходный код: https://github.com/myogeshchavan97/react_node_optimized

На сегодня все. Надеюсь, вы узнали что-то новое сегодня.

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