Перенос приложения React с Webpack на Vite

Что такое Vite?

Vite — это «фронтенд-инструментарий нового поколения», как утверждают его создатели. Мгновенный сервер разработки, быстрая горячая перезагрузка модулей, легкая настройка, оптимизированные сборки — все это есть.

Но… в документации Vite не сказано, как перенести существующее приложение Webpack 🤷 Не волнуйтесь! В этом руководстве мы справимся с этим вместе!

Измените ваше репо на ES-модули

В вашем package.json добавьте следующую запись:

  "type": "module",
Войти в полноэкранный режим Выйти из полноэкранного режима

Примите современность! Откажитесь от традиций! Вот почему мы все равно переходим на Vite!

Установите Vite и его плагины

npm i --save-dev vite @vitejs/plugin-react vite-plugin-html
Войдите в полноэкранный режим Выйти из полноэкранного режима

или

yarn add vite @vitejs/plugin-react vite-plugin-html --dev
Войти в полноэкранный режим Выйти из полноэкранного режима

Замена скриптов

В вашем package.json, вероятно, есть скрипты, похожие на эти:

  "build": "NODE_ENV=production webpack",
  "dev": "NODE_ENV=development webpack serve",
Войти в полноэкранный режим Выход из полноэкранного режима

Команда build, вызываемая командой npm run build или yarn build, собирает ваше приложение для производства. Команда dev запускает сервер разработки.

Эти скрипты необходимо заменить на:

  "build": "vite build",
  "dev": "vite serve",
Вход в полноэкранный режим Выйти из полноэкранного режима

Кроме того, вы можете добавить еще одну команду:

  "preview": "vite preview"
Enter fullscreen mode Выйти из полноэкранного режима

Команда preview запустит сервер, на котором будет работать ваше приложение, созданное для производства.

Давайте запустим сервер разработки!

  vite v2.9.1 dev server running at:

  > Local: http://localhost:3000/
  > Network: use --host to expose

  ready in 261ms.
Войти в полноэкранный режим Выход из полноэкранного режима

👁👄👁 Ого, как быстро.

Научите Vite, где находится корень

Если вы запустили сервер разработки сейчас, Vite будет искать index.html в корневом каталоге вашего проекта. Если он находится в другом месте, Vite не сможет его найти и отобразит вместо него пустую страницу.

Чтобы исправить это, вам нужно либо переместить index.html в корневой каталог, либо указать другой корневой каталог, в котором Vite будет искать index.html. В моем случае он находится по адресу src/index.html.

Вы можете сделать это, добавив путь к корневому каталогу в свои команды, например, так:

  "build": "vite build src",
  "dev": "vite serve src",
Войти в полноэкранный режим Выйти из полноэкранного режима

Однако вы также можете сделать это, создав файл vite.config.js в корне вашего проекта. Он все равно понадобится вам через некоторое время, так почему бы не создать его сейчас, чтобы хранить всю конфигурацию в одном месте?

import { defineConfig } from 'vite';

export default defineConfig({
  root: 'src',
  build: {
    // Relative to the root
    outDir: '../dist',
  },
});
Вход в полноэкранный режим Выход из полноэкранного режима

Настройка vite-plugin-html

Теперь, когда Vite знает, где найти ваш файл index.html, он попытается разобрать его.

Вы можете столкнуться с ошибкой, как я:

Как с ней справиться? Я использовал опцию HtmlWebpackPlugin templateParameters для динамического внедрения пользовательского заголовка и другой информации в файл index.html, как показано ниже:

  <title><%= title %></title>
Вход в полноэкранный режим Выход из полноэкранного режима
new HtmlWebpackPlugin({
  template: 'index.html',
  templateParameters: {
    title: env === 'production' ? 'My site' : `My site [${env.toUpperCase()}]`,
  },
}),
Войти в полноэкранный режим Выйти из полноэкранного режима

К счастью, мы можем сделать то же самое с vite-plugin-html. В вашем vite.config.js добавьте следующие биты:

import { createHtmlPlugin } from 'vite-plugin-html';

export default defineConfig({
  // …
  plugins: [
    createHtmlPlugin({
      inject: {
        data: {
          title: env === 'production' ? 'My site' : `My site [${env.toUpperCase()}]`,
        },
      },
    }),
  ],
});
Войти в полноэкранный режим Выйти из полноэкранного режима

Добавьте модуль входа в ваш файл index.html.

На этом этапе ваш файл index.html должен обслуживаться просто отлично. Но приложение по-прежнему не загружается!

Если вы использовали Webpack, вы, вероятно, также использовали html-webpack-plugin для обработки инъекции тега <script> с вашим модулем(ями) входа в index.html.

Vite не будет вставлять эти теги автоматически. Вам нужно будет добавить их самостоятельно. Например:

<script type="module" src="./index.jsx"></script>
Вход в полноэкранный режим Выйти из полноэкранного режима

Аааа, так лучше. Что-то ожило.

Настройте @vitejs/plugin-react.

Хорошо, как вы видите, мы еще не дошли до конца. Нам нужно настроить @vitejs/plugin-react, чтобы заставить его работать с React.

Если вы все еще использовали классический JSX runtime, ваше приложение может уже загрузиться на этом этапе, но вы все равно захотите выполнить эти шаги. Этот плагин не только будет работать с автоматическим JSX runtime (тот самый, благодаря которому вам не нужно вручную импортировать React в каждый файл), но и добавит такие функции, как Fast Refresh, включит интеграцию Babel и многое, многое другое.

Добавьте его в ваш файл vite.config.js следующим образом:

import react from '@vitejs/plugin-react';

export default defineConfig({
  // …
  plugins: [
    // …
    react({
      // Use React plugin in all *.jsx and *.tsx files
      include: '**/*.{jsx,tsx}',
    }),
  ],
});
Войти в полноэкранный режим Выйти из полноэкранного режима

Плагины Babel

Возможно, вам вообще не нужен Babel, поскольку @babel/preset-env и @babel/preset-react бесполезны.

Но иногда плагины Babel все же могут пригодиться. Например, есть плагин для удаления PropTypes, который можно использовать, чтобы сделать размер пакета немного меньше, и есть специальный плагин для styled-components, который облегчает разработку и тестирование, добавляя, среди прочего, отображаемые имена компонентов.

Здесь на помощь придет @vitejs/plugin-react с опцией babel. Например, чтобы добавить плагин babel-plugin-styled-components:

    react({
      // …
      babel: {
        plugins: ['babel-plugin-styled-components'],
      },
    },
Войти в полноэкранный режим Выйти из полноэкранного режима

Работа со статическими файлами

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

export default defineConfig({
  // …
  publicDir: '../public',
});
Войти в полноэкранный режим Выйти из полноэкранного режима

Проблема с process.env.*

Я использовал process.env.NODE_ENV во многих местах моего приложения. В результате в консоль выводилась следующая ошибка:

Uncaught ReferenceError: process is not defined
Вход в полноэкранный режим Выход из полноэкранного режима

В Vite вы можете использовать import.meta.env.* вместо этого. Например, process.env.NODE_ENV можно заменить на import.meta.env.NODE_ENV.

Наслаждайтесь!

Теперь вы должны увидеть ваше приложение, работающее на Vite!

Мы еще не закончили; нам все еще нужно подправить несколько вещей, прежде чем запускать его в производство. Для этого вам придется подождать второй части этого руководства. Подпишитесь, чтобы получать уведомления!

Очистка

Вы можете смело удалить эти зависимости, которые теперь не используются:

  • webpack-cli
  • webpack-dev-server
  • @babel/preset-env
  • @babel/preset-react
  • @pmmmwh/react-refresh-webpack-plugin
  • react-refresh

webpack.config.js Конфигурационный файл Webpack также можно удалить.

babel.config.js, babel.config.json или .babelrc могут быть удалены, при условии, что вы не использовали их в качестве конфига Babel в конфигурации @vitejs/plugin-react.

Что-нибудь пропало?

Как вы думаете, есть ли что-то еще, на что нужно обратить внимание, что может быть распространенной проблемой при миграции с Webpack на Vite? Пожалуйста, дайте мне знать в комментариях!

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *