📦 Ресурсы

Parcel основан на ресурсах. Ресурсы могут представлять любой файл, но Parcel имеет особую поддержку для определенных видов ресурсов, таких как JavaScript-, CSS- и HTML-файлы. Parcel автоматически анализирует зависимости, указанные в этих файлах и включает их в выходной бандл. Ресурсы аналогичных типов сгруппированы в один и тот же выходной бандл. Если вы импортируете ресурс другого типа (например, если вы импортировали CSS-файл из JS), он запускает дочерний бандл и оставляет ссылку на него в родительском. Это будет показано в следующих разделах.

JavaScript

Наиболее традиционным типом файлов для веб-упаковщиков является JavaScript. Parcel поддерживает синтаксис CommonJS и модулей ES6 для импорта файлов. Он также поддерживает динамический синтаксис функции import() для асинхронной загрузки модулей, который обсуждается в разделе Разделение кода.

// Импортировать модуль с использованием синтаксиса CommonJS
const dep = require('./path/to/dep');

// Импорт модуля с использованием синтаксиса импорта ES6
import dep from './path/to/dep';

Вы также можете импортировать не JavaScript из JavaScript-файла, например CSS или даже файл изображения. Когда вы импортируете один из этих файлов, он не встраивается в другие бандлы, как это происходит в некоторых других упаковщиках. Вместо этого он помещается в отдельный бандл (например CSS-файл) вместе со всеми его зависимостями. Когда вы используете CSS Modules, экспортированные классы помещаются в бандл JavaScript. Другие типы ресурсов экспортируют URL-адрес в выходной файл в бандле JavaScript, чтобы вы могли ссылаться на них в своем коде.

// Импортировать файл CSS
import './test.css';

// Импортировать файл CSS с помощью CSS-модулей
import classNames from './test.css';

// Импортировать URL-адрес в файл изображения
import imageURL from './test.png';

Если вы хотите встроить файл в бандл JavaScript вместо ссылки по его URL-адресу, вы можете использовать для этого API Node.js fs.readFileSync. URL-адрес должен быть статически анализируемым, то есть он не может иметь никаких переменных (кроме __dirname и __filename).

import fs from 'fs';

// Чтение содержимого в виде строки
const string = fs.readFileSync(__dirname + '/test.txt', 'utf8');

// Чтение содержимого в качестве Buffer
const buffer = fs.readFileSync(__dirname + '/test.png');

CSS

Ресурсы CSS могут быть импортированы из файла JavaScript или HTML и могут содержать зависимости, на которые ссылается синтаксис @import, а также ссылки на изображения, шрифты и так далее через url(). Другие импортированные файлы CSS с помощью @import, встраиваются в один и тот же бандл CSS, ссылки url() переписываются на их выходные имена файлов. Все имена файлов должны относиться к текущему файлу CSS.

/* Импортировать другой файл CSS */
@import './other.css';

.test {
  /* Ссылка на файл изображения */
  background: url('./images/background.png');
}

Помимо обычного CSS, также поддерживаются и другие компилируемые в CSS языки, такие как LESS, SASS и Stylus, которые работают подобным образом.

SCSS

Компиляция SCSS требует модуля node-sass. Установите его через npm:

npm install node-sass

После установки node-sass вы можете импортировать SCSS-файлы из JavaScript-файлов.

import './custom.scss'

Зависимости в файлах SCSS можно использовать с операторами @import.

HTML

Ресурс HTML часто является входным файлом, который вы предоставляете Parcel, однако на него могут ссылаться JavaScript-файлы, например, для предоставления ссылок на другие страницы. URL-адреса скриптов, стилей, мультимедийных ресурсов и других HTML-файлов извлекаются и компилируются, как описано выше. Ссылки переписываются в HTML, поэтому они ссылаются на правильные выходные файлы. Все имена файлов должны относиться к текущему файлу HTML.

<html>
<body>
  <!-- ссылаемся на файл изображения -->
  <img src="./images/header.png">

  <a href="./other.html">Ссылка на другую страницу</a>

  <!-- импортируем JavaScript бандл -->
  <script src="./index.js"></script>
</body>
</html>