Настройка интерфейса разработки может быть очень сложной для новичка. Помимо Javascript, CSS и HTML, слишком много понятий для понимания:

- Какой упаковщик выбрать?
- Зачем нам нужно транспилировать наш код?
- Какие правила линтинга я должен применять?
- Что вообще такое линтер?

Эта серия блогов посвящена созданию установки с минимальным количеством настроек для React с использованием Parcel. Parcel — это самоуверенный сборщик Javascript, который позиционирует себя как _инструмент сборки с нулевой конфигурацией_.

Настройка проекта

[Исходный код для демонстрации: https://github.com/EthanChenYen-Peng/parcel-react-setup](https://github.com/EthanChenYen-Peng/parcel-react-setup)

mkdir parcel-react-setup
cd parcel-react-setup
npm init -y
git init
touch .gitignore

`.gitignore`

node_modules/
dist/
.parcel-cache

Установить пакет

Установить Parcel как зависимость от разработчиков

npm i -D parcel

Давайте попробуем. Сначала мы создаем файл `src/index.html`, который содержит некоторые источники CSS (`src/style.css`) и Javascript (`src/index.js`), чтобы посмотреть, работают ли они.

`источник/index.html`

<!DOCTYPE html>
<html lang=”en”>
 <head>
 <meta charset=”UTF-8" />
 <meta http-equiv=”X-UA-Compatible” content=”IE=edge” />
 <meta name=”viewport” content=”width=device-width, initial-scale=1.0" />
 <link rel=”stylesheet” href=”style.css” />
 <title>Document</title>
 </head>
 <body>
 <script type=”module” src=”index.js”></script>
 </body>
</html>

`src/style.css`

#root {
 color: blue;
}

`src/index.js`

const root = document.createElement(‘div’)
root.id = ‘root’
root.textContent = ‘Inserted by JS’
document.body.appendChild(root)

Запустите наш сервер разработки, используя `npx посылка src/index.html`. Здесь мы указываем Parcel использовать `src/index.html` в качестве точки входа. Для более общего синтаксиса вы можете обратиться к здесь (https://parceljs.org/features/targets/#%24-parcel-%3Centries%3E)

Это работает, и CSS, и Javascript указаны правильно.

Примечание:
`parcel` — это интерфейс командной строки, предоставляемый пакетом Parcel, когда мы устанавливали его как зависимость для разработки. Это просто файл сценария, написанный в файле NodeJS, который можно найти в `‹project_dir›/node_modules/.bin/parcel`. Другими словами, вы можете запустить сервер разработки с помощью команды `./node_modules/.bin/parcel src/index.html`. Однако использование `npx` (работа пакета Node) короче, и это то, что вы найдете в документации и руководствах.

Запуск npx commandname автоматически находит правильную ссылку на команду внутри папки node_modules проекта, не зная точного пути и не требуя глобальной установки пакета по пути пользователя.
https:/ /nodejs.dev/learn/the-npx-nodejs-package-runner

Необходимость вводить `npx посылка src/index.html` каждый раз, когда мы запускаем сервер разработки, может занять много времени и привести к ошибкам. К счастью, мы можем использовать [**скрипт NPM**](https://docs.npmjs.com/cli/v8/using-npm/scripts), чтобы сделать нашу команду более декларативной.

 “scripts”: {
 “start”: “parcel src/index.html”,
 “build”: “parcel build src/index.html”,
 },

Для получения дополнительной информации о **скрипте NPM** я рекомендую прочитать этот пост в блоге
Мастерство скриптов NPM (https://dev.to/paulasantamaria/mastering-npm-scripts-2chd).

Чтобы запустить сервер разработки, просто запустите `npm run start`. Примечание. Parcel также предоставляет другой способ указания точки входа с использованием `source`, который дает два основных преимущества:

1. Он принимает массив и может быть полезен в случае наличия нескольких точек входа.
2. Нам не нужно дублировать точки входа при запуске установки производственной сборки.

 “source”: [“src/index.html”],
 “scripts”: {
 “start”: “parcel”,
 “build”: “parcel build”
 },
```

Настройка

Если у вас есть опыт настройки проекта React с использованием **Webpack**, вы должны быть немного знакомы с **Babel**, транспилятором Javascript, который преобразует написанный вами современный Javascript в версии, понятные старым браузерам. Чтобы использовать современный синтаксис Javascript, вам обычно нужно установить @babel/preset-env. В дополнение к этому, чтобы использовать `JSX` в реакции, вам также необходимо установить `@babel/preset-react`.

К счастью, Parcel избавляет нас от всех этих проблем, предоставляя встроенный транспилятор с функциями, эквивалентными `@babel/preset-env` и `@babel/preset-react`.
https:/ /parceljs.org/languages/javascript/#default-presets

Поэтому, чтобы использовать React, мы просто устанавливаем зависимости.

npm i react react-dom

Добавьте контейнер `div` для нашего приложения React в наш `index.html`. Обратите внимание, что мы также меняем расширение файла на `jsx` для нашего файла записи Javascript.
`index.html`

<body>
 <div id=”app”></div>
 <script type=”module” src=”index.jsx”></script>
</body>

Переименуйте нашу точку входа Javascript с `src/index.js` в `src/index.jsx`.

import { createRoot } from ‘react-dom/client’
function App() {
 return <div>Hello from React</div>
}
const container = document.querySelector(‘#root’)
const root = createRoot(container)
root.render(<App />)

Вот и все. Это все, что нам нужно, чтобы приступить к работе с React.🤯

Чтобы оценить, как много Parcel делает за кулисами, давайте сравним его с базовой настройкой с использованием Webpack.

`webpack.config.json`

const path = require('path')
const HtmlWebpackPlugin = require('html-webpack-plugin')
module.exports = {
  entry: path.resolve(__dirname, './src/index.jsx'),
  module: {
    rules: [
      {
        test: /\.(ts|js)x?$/,
        exclude: /node_modules/,
        use: ['babel-loader'],
      },
      {
        test: /\.css$/,
        use: ['style-loader', 'css-loader'],
      },
    ],
  },
  output: {
    path: path.resolve(__dirname, './build'),
    filename: 'bundle.js',
  },
  plugins: [
    new HtmlWebpackPlugin({
      template: path.resolve(__dirname, './src/index.html'),
    }),
  ],
  mode: 'development',
  devtool: 'cheap-module-source-map',
}

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

 “devDependencies”: {
 “@babel/preset-env”: “⁷.17.10”,
 “@babel/preset-react”: “⁷.16.7”,
 “babel-loader”: “⁸.2.5”,
 “css-loader”: “⁶.7.1”,
 “html-webpack-plugin”: “⁵.5.0”,
 “style-loader”: “³.3.1”,
 “webpack”: “⁵.72.0”,
 “webpack-cli”: “⁴.9.2”,
 “webpack-dev-server”: “⁴.9.0”
 },

Как может показаться, файл конфигурации в **Webpack** имеет тенденцию быть очень явным. В **Webpack** все рассматривается как модуль, и по умолчанию он может понимать только файлы JavaScript и JSON. Для обработки типов файлов, отличных от этих двух, требуется _loader_. Здесь мы используем

- `css-loader`, чтобы Webpack мог загружать CSS.
- `style-loader`, чтобы внедрить CSS в выходной HTML.
- `babel-loader`, чтобы использовать _Babel_ для транспиляции современного Javascript и JSX. в более старую версию; он будет получать конфигурацию из файла конфигурации, т.е. (`.babelrc.json`).

{
 “presets”: [“@babel/preset-env”, “@babel/preset-react”]
}

Заключение

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

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

А сейчас до свидания.