Публикация плагина в npm

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

Публикация собственного плагина в npm превращает локальное решение в полноценный повторно используемый пакет, который может устанавливаться в любых проектах через стандартные механизмы Node.js. Грамотно опубликованный пакет обеспечивает:

  • централизованное распространение;
  • систему версионирования;
  • автоматическое обновление зависимостей;
  • интеграцию с менеджерами пакетов;
  • возможность совместной разработки;
  • удобное сопровождение и поддержку.

Подготовка структуры проекта

Перед публикацией рекомендуется организовать проект по общепринятым правилам npm-пакетов.

Типичная структура:

parcel-transformer-example/
├── src/
│   └── Transformer.js
├── package.json
├── README.md
├── LICENSE
├── CHANGELOG.md
└── .gitignore

Для более крупных плагинов структура может быть расширена:

parcel-transformer-example/
├── src/
├── tests/
├── examples/
├── docs/
├── package.json
├── README.md
└── LICENSE

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


Настройка package.json

Файл package.json является основным источником информации о пакете.

Пример конфигурации:

{
  "name": "parcel-transformer-example",
  "version": "1.0.0",
  "description": "Example Parcel transformer plugin",
  "main": "src/Transformer.js",
  "keywords": [
    "parcel",
    "parcel-plugin",
    "transformer"
  ],
  "author": "Developer Name",
  "license": "MIT"
}

Особое значение имеют следующие поля:

name

Имя публикуемого пакета.

{
  "name": "parcel-transformer-example"
}

Имя должно быть уникальным в реестре npm.

version

Текущая версия пакета.

{
  "version": "1.0.0"
}

Используется семантическое версионирование (SemVer).

description

Краткое описание назначения плагина.

{
  "description": "Transformer for custom file format"
}

keywords

Ключевые слова помогают находить пакет через поиск npm.

{
  "keywords": [
    "parcel",
    "plugin",
    "transformer"
  ]
}

license

Указывает лицензию распространения.

{
  "license": "MIT"
}

Использование официальных соглашений именования

Сообщество Parcel придерживается определённых правил именования.

Transformer

parcel-transformer-*

Примеры:

parcel-transformer-sass
parcel-transformer-svg
parcel-transformer-custom

Resolver

parcel-resolver-*

Примеры:

parcel-resolver-alias
parcel-resolver-custom

Optimizer

parcel-optimizer-*

Примеры:

parcel-optimizer-images
parcel-optimizer-css

Reporter

parcel-reporter-*

Примеры:

parcel-reporter-build-stats
parcel-reporter-logs

Следование этим соглашениям облегчает поиск и понимание назначения пакета.


Указание зависимостей Parcel

Плагин должен явно указывать совместимость с Parcel.

Чаще всего используется раздел peerDependencies.

{
  "peerDependencies": {
    "@parcel/core": "^2.0.0"
  }
}

Такой подход позволяет использовать версию Parcel, установленную в проекте пользователя.

Дополнительно можно добавить зависимость для разработки:

{
  "devDependencies": {
    "@parcel/core": "^2.15.0"
  }
}

Настройка точки входа

Плагин должен экспортировать объект соответствующего типа.

Пример Transformer:

const { Transformer } = require('@parcel/plugin');

module.exports = new Transformer({
  async transform({ asset }) {
    return [asset];
  }
});

Точка входа должна быть указана в package.json.

{
  "main": "src/Transformer.js"
}

Подготовка README.md

README является основной документацией пакета.

Минимальный набор разделов:

# parcel-transformer-example

## Installation

npm install parcel-transformer-example

## Usage

...

## Options

...

## License

Качественный README обычно включает:

  • назначение плагина;
  • инструкции по установке;
  • примеры настройки;
  • примеры использования;
  • список параметров;
  • ограничения;
  • требования к версии Parcel;
  • лицензию.

Создание LICENSE

Большинство открытых проектов используют лицензию MIT.

Пример:

MIT License

Copyright (c) 2025
...

Отсутствие лицензии создаёт юридическую неопределённость относительно использования пакета.


Настройка списка публикуемых файлов

Не все файлы проекта должны попадать в npm.

Для ограничения содержимого используется поле files.

{
  "files": [
    "src",
    "README.md",
    "LICENSE"
  ]
}

В пакет не будут включены:

tests/
examples/
.git/
.github/

Такой подход уменьшает размер публикуемого архива.


Проверка содержимого публикации

Перед отправкой пакета рекомендуется проверить итоговый набор файлов.

Команда:

npm pack

Будет создан архив:

parcel-transformer-example-1.0.0.tgz

Содержимое можно проверить:

tar -tf parcel-transformer-example-1.0.0.tgz

Это позволяет обнаружить случайно включённые конфиденциальные файлы или отсутствующие ресурсы.


Авторизация в npm

Перед публикацией требуется учётная запись npm.

Проверка авторизации:

npm whoami

Если пользователь не авторизован:

npm login

После выполнения команды потребуется указать:

Username
Password
Email

Успешная авторизация сохраняется локально.


Первая публикация пакета

После подготовки проекта выполняется публикация:

npm publish

Если имя свободно, пакет будет опубликован в общем реестре npm.

После завершения публикации пакет становится доступным для установки:

npm install parcel-transformer-example

Публикация scoped-пакетов

Многие разработчики используют пространство имён.

Пример имени:

@company/parcel-transformer-example

Конфигурация:

{
  "name": "@company/parcel-transformer-example"
}

Для публичной публикации требуется указать:

npm publish --access public

Иначе пакет будет считаться приватным.


Семантическое версионирование

Версии публикуются согласно SemVer.

Формат:

MAJOR.MINOR.PATCH

Пример:

1.4.2

PATCH

Исправления ошибок.

1.0.0 → 1.0.1

MINOR

Новый функционал без нарушения совместимости.

1.0.0 → 1.1.0

MAJOR

Несовместимые изменения API.

1.0.0 → 2.0.0

Автоматическое увеличение версии

npm предоставляет встроенные команды изменения версии.

Патч-релиз:

npm version patch

Минорный релиз:

npm version minor

Мажорный релиз:

npm version major

После выполнения изменяются:

  • package.json;
  • package-lock.json;
  • git-тег.

Публикация новых версий

После изменения версии выполняется повторная публикация:

npm publish

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

Например:

1.0.0

Нельзя заменить повторной публикацией.

Вместо этого публикуется новая версия:

1.0.1

Использование тегов релизов

npm поддерживает каналы распространения.

Публикация бета-версии:

npm publish --tag beta

Установка:

npm install package-name@beta

Пример версий:

2.0.0-beta.1
2.0.0-beta.2
2.0.0-beta.3

После стабилизации выпускается:

2.0.0

Проверка опубликованного пакета

Получение информации:

npm view parcel-transformer-example

Проверка версии:

npm view parcel-transformer-example version

Просмотр зависимостей:

npm view parcel-transformer-example dependencies

Эти команды позволяют убедиться в корректности публикации.


Поддержка обратной совместимости

При развитии плагина необходимо учитывать существующих пользователей.

Нежелательные изменения:

  • удаление экспортируемых API;
  • изменение структуры конфигурации;
  • изменение формата результатов работы;
  • удаление опций без предупреждения.

Для устаревающих возможностей рекомендуется использовать предупреждения:

console.warn(
  'Option "legacyMode" is deprecated'
);

С последующим удалением в следующей мажорной версии.


Ведение CHANGELOG

История изменений помогает пользователям отслеживать развитие пакета.

Пример:

# Changelog

## 1.2.0

### Added

- New transformer API

### Fixed

- Asset cache issue

## 1.1.0

### Added

- Source map support

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


Автоматизация публикации через GitHub Actions

Публикация может выполняться автоматически после создания релиза.

Пример workflow:

name: Publish

on:
  release:
    types: [published]

jobs:
  publish:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: 20
          registry-url: https://registry.npmjs.org

      - run: npm ci

      - run: npm publish
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

Такой подход исключает ручные действия и снижает вероятность ошибок.


Типичные ошибки при публикации

Неверное поле main

Ошибка:

{
  "main": "index.js"
}

При отсутствии файла:

index.js

пакет становится неработоспособным.

Отсутствие peerDependencies

Ошибка приводит к конфликтам версий Parcel.

Неправильно:

{
  "dependencies": {
    "@parcel/core": "^2.0.0"
  }
}

Предпочтительно:

{
  "peerDependencies": {
    "@parcel/core": "^2.0.0"
  }
}

Публикация лишних файлов

Часто случайно публикуются:

node_modules/
.env
coverage/

Для предотвращения используются:

{
  "files": [
    "src"
  ]
}

или файл:

.npmignore

Отсутствие документации

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


Рекомендации по сопровождению плагинов Parcel

Качественный npm-пакет обычно обладает следующими характеристиками:

  • понятное имя согласно соглашениям Parcel;
  • подробный README;
  • корректное семантическое версионирование;
  • поддержка актуальных версий Parcel;
  • наличие тестов;
  • журнал изменений;
  • автоматизированная публикация;
  • минимальный размер дистрибутива;
  • чётко определённая лицензия;
  • стабильный и документированный API.

Соблюдение этих принципов позволяет превратить локальный плагин Parcel в полноценный инструмент, пригодный для использования в реальных проектах и распространения через экосистему npm.