Parcel — это современный сборщик (bundler) для веб-приложений, предназначенный для автоматической обработки исходного кода, ресурсов и зависимостей проекта. Основная идея Parcel заключается в минимизации конфигурации: большинство задач выполняется автоматически без необходимости создавать сложные конфигурационные файлы.
Parcel анализирует структуру проекта, определяет используемые зависимости, преобразует исходный код в формат, подходящий для браузеров, оптимизирует ресурсы и формирует итоговую сборку.
Основные возможности Parcel:
Parcel был создан как альтернатива решениям, требующим значительного объёма конфигурации, таким как Webpack ранних версий.
Основная цель проекта состояла в том, чтобы разработчик мог начать работу практически сразу после установки инструмента.
Ключевые этапы развития:
| Версия | Особенности |
|---|---|
| Parcel 1 | Первоначальная реализация с минимальной настройкой |
| Parcel 2 | Полностью переработанная архитектура, система плагинов, улучшенная производительность |
| Современные версии | Расширенная поддержка языков, оптимизаций и монорепозиториев |
Parcel 2 стал серьёзным шагом вперёд благодаря модульной архитектуре и значительному ускорению сборки.
Parcel состоит из нескольких компонентов.
Граф ресурсов представляет собой структуру, содержащую все файлы проекта:
Каждый ресурс становится узлом графа.
Граф зависимостей показывает связи между файлами.
Например:
index.html
└── main.js
├── app.js
├── utils.js
└── styles.css
Parcel автоматически строит подобный граф во время анализа проекта.
После анализа зависимостей создаются сборки (bundles).
Bundle представляет собой набор файлов, объединённых для доставки в браузер.
Например:
dist/
├── index.html
├── app.3fd7a.js
├── vendor.a91bc.js
└── app.32ff1.css
Parcel устанавливается через npm.
npm install --save-dev parcel
npx parcel --version
Типичная структура проекта:
project/
├── src/
│ ├── index.html
│ ├── js/
│ │ └── app.js
│ ├── css/
│ │ └── styles.css
│ └── assets/
│ └── logo.png
├── package.json
└── .gitignore
HTML-файл:
<!DOCTYPE html>
<html>
<head>
<title>Parcel App</title>
</head>
<body>
<h1>Hello Parcel</h1>
<script type="module" src="./js/app.js"></script>
</body>
</html>
Jav * aScript:
console.log("Parcel работает");
Команда:
npx parcel src/index.html
После запуска Parcel:
Обычно приложение становится доступным по адресу:
http://localhost:1234
Для публикации проекта используется команда:
npx parcel build src/index.html
Результат помещается в каталог:
dist/
Parcel полностью поддерживает ES Modules.
Файл math.js:
export function sum(a, b) {
return a + b;
}
Файл app.js:
import { sum } from "./math.js";
console.log(sum(5, 10));
Parcel автоматически определяет зависимости и объединяет модули.
Parcel способен работать с:
Пример:
const user = {
profile: {
name: "Alex"
}
};
console.log(user?.profile?.name);
Parcel определяет целевые браузеры через настройки Browserslist.
Файл:
{
"browserslist": [
"last 2 versions",
"not dead"
]
}
На основе этих настроек Parcel автоматически выбирает необходимые преобразования.
Parcel воспринимает HTML как точку входа приложения.
Пример:
<link rel="stylesheet" href="./css/styles.css">
<script src="./js/app.js" type="module"></script>
Все зависимости будут найдены и обработаны автоматически.
Импорт CSS возможен непосредственно из JavaScript.
import "../css/styles.css";
Файл стилей:
body {
margin: 0;
font-family: Arial, sans-serif;
}
Parcel поддерживает CSS Modules без дополнительной настройки.
Файл:
.title {
color: blue;
}
Импорт:
import styles from "./style.module.css";
element.className = styles.title;
После сборки имена классов становятся уникальными.
Установка:
npm install sass --save-dev
Импорт:
import "./styles.scss";
Пример:
$mainColor: royalblue;
body {
background: $mainColor;
}
Установка:
npm install less --save-dev
Файл:
@mainColor: green;
body {
background: @mainColor;
}
Parcel автоматически подключает необходимый трансформер.
Импорт изображения:
import logo from "../assets/logo.png";
const img = document.createElement("img");
img.src = logo;
document.body.appendChild(img);
Parcel:
CSS:
@font-face {
font-family: "Custom";
src: url("./fonts/custom.woff2");
}
Parcel автоматически обработает файл шрифта.
Импорт:
import data from "./data.json";
console.log(data);
Пример JSON:
{
"name": "Parcel"
}
SVG может использоваться как обычный ресурс.
import icon from "./icon.svg";
Либо как строка:
import svgContent from "bundle-text:./icon.svg";
console.log(svgContent);
Hot Module Replacement позволяет обновлять отдельные модули без полной перезагрузки страницы.
Пример:
if (module.hot) {
module.hot.accept(() => {
console.log("Модуль обновлён");
});
}
Преимущества:
Parcel поддерживает механизм ленивой загрузки.
button.addEventListener("click", async () => {
const module = await import("./admin.js");
module.init();
});
Во время сборки будет создан отдельный чанк.
Code Splitting разделяет приложение на несколько частей.
Пример:
const page = await import("./pages/profile.js");
Результат:
main.js
profile.js
Файл профиля будет загружаться только при необходимости.
Tree Shaking удаляет неиспользуемый код.
Модуль:
export function used() {}
export function unused() {}
Использование:
import { used } from "./utils.js";
used();
После сборки функция unused() будет исключена.
Parcel использует внутренний кэш для ускорения повторных сборок.
Каталог:
.parcel-cache
Удаление кэша:
rm -rf .parcel-cache
Production-сборка генерирует файлы вида:
app.6df71e.js
vendor.2ab11c.js
style.9f002d.css
Преимущества:
Файл:
.env
Содержимое:
API_URL=https://api.example.com
Использование:
console.log(process.env.API_URL);
Parcel автоматически загружает значения.
Установка:
npm install typescript --save-dev
Файл:
function greet(name: string): string {
return `Hello ${name}`;
}
console.log(greet("Alex"));
Parcel автоматически обнаружит TypeScript.
Установка:
npm install react react-dom
Компонент:
function App() {
return <h1>Hello React</h1>;
}
export default App;
Точка входа:
import ReactDOM from "react-dom/client";
import App from "./App";
ReactDOM.createRoot(
document.getElementById("root")
).render(<App />);
Parcel поддерживает Vue через соответствующие плагины.
Пример компонента:
<template>
<h1>Hello Vue</h1>
</template>
<script>
export default {
name: "App"
}
</script>
При выполнении команды:
parcel build src/index.html
автоматически выполняются:
Source Maps позволяют связывать собранный код с исходными файлами.
В режиме разработки они включаются автоматически.
Пример:
app.js
app.js.map
Благодаря этому инструменты разработчика показывают оригинальный код.
Parcel поддерживает несколько целей сборки.
Пример конфигурации:
{
"targets": {
"modern": {
"context": "browser"
},
"legacy": {
"context": "browser"
}
}
}
Одна команда может создавать несколько вариантов приложения.
Parcel хорошо работает в крупных проектах с несколькими пакетами.
Пример структуры:
monorepo/
├── packages/
│ ├── ui/
│ ├── api/
│ └── web/
└── package.json
Благодаря внутреннему графу зависимостей Parcel эффективно отслеживает изменения между пакетами.
Parcel предоставляет расширяемую архитектуру.
Основные типы плагинов:
Каждый этап сборки может быть расширен собственным модулем.
| Характеристика | Parcel | Webpack |
|---|---|---|
| Конфигурация | Минимальная | Часто объёмная |
| Скорость старта | Высокая | Средняя |
| Простота освоения | Высокая | Средняя |
| Гибкость | Высокая | Очень высокая |
| Порог входа | Низкий | Более высокий |
| Автоматизация | Максимальная | Частично ручная |
| Характеристика | Parcel | Vite |
|---|---|---|
| Конфигурация | Почти отсутствует | Минимальная |
| Сборка | Собственный пайплайн | Rollup |
| HMR | Есть | Очень быстрый |
| Поддержка ресурсов | Встроенная | Через плагины и Rollup |
| Простота запуска | Очень высокая | Очень высокая |
Технические достоинства:
Parcel представляет собой полноценную современную платформу сборки фронтенд-приложений, способную обслуживать как небольшие учебные проекты, так и крупные промышленные системы с большим количеством ресурсов и сложной структурой зависимостей.