Зачем создавать плагин Vite?

Вам когда-нибудь требовались дополнительные возможности от конфигурации Vite, например, преобразование кастомного расширения, т.е., index.mycustomextension в index.js? Или преобразование markdown в JSX?

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

Что такое плагин Vite?

Плагин Vite — это Rollup-плагин с некоторыми опциями и хуками, специфичными для Vite, который позволяет вам добавлять дополнительную кастомную функциональность поверх Vite для решения конкретной проблемы. Например, Astro использует плагин Vite для разрешения файлов .astro.

Плагин Vite — это объект с одним или несколькими:

const vitePluginExample = () => ({
	// properties
  name: 'vite-plugin-example', 
	// build hooks
  config: () => ({
    resolve: {
      alias: {
        foo: 'bar'
      }
    }
  }),
	// output generation hooks
	augmentChunkHash(chunkInfo) {
      if (chunkInfo.name === 'bar') {
        return Date.now().toString();
      }
    }
})

Давайте вкратце рассмотрим все эти три компонента плагина Vite, прежде чем приступить к созданию собственного.

Свойства

Единственным обязательным свойством плагина Vite является name, которое представляет собой имя плагина. Оно необходимо, поскольку используется для отладки и сообщений об ошибках.

Хуки сборки

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

Хуки для генерации вывода

Эти хуки можно использовать для предоставления информации о сгенерированном пакете и модификации сборки после ее завершения.

Создание плагина Vite

Приступить к созданию плагина Vite просто — достаточно указать фабричную функцию в файле vite.config.js. Эта функция вернет фактический объект плагина, который содержит все определения и логику плагина. Затем вы можете передать эту функцию в массив plugins в объекте defineConfig.

Примечание: Эта функция является регулярной и, как таковая, может принимать опции, которые позволяют кастомизировать поведение плагина в пользовательской среде.

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

Давайте начнем с первого.

Пример №1: Output Plugins Stats (Вывод статистики плагинов)

Что может быть лучше примера "hello world", чем создание плагина, который выводит статистику о плагинах в вашем проекте Vite?

Этот плагин будет работать следующим образом: при запуске npm run dev вы должны увидеть вывод хука output-plugin-stats, который будет представлять собой подсчет плагинов в вашем проекте и их общую таблицу. Как, мета.

Чтобы это сделать, давайте сначала создадим проект Vanilla Vite, выполнив данную команду в терминале:

npm init create-vite@latest

В подсказке выберите пресет Vanilla, а в качестве языка — JavaScript.

Затем запустите npm install и npm run dev, чтобы убедиться, что установка прошла успешно.

После этого просто сделайте остановку dev-сервера и создайте файл vite.config.js в корне вашего проекта и добавьте в него этот код:

vite.config.js

import { defineConfig } from 'vite'

export default defineConfig({
  plugins: []
})

Теперь у нас есть основа для функциональности нашего плагина, которую мы передадим в массив plugins.

vite.config.js

import { defineConfig } from 'vite'

const outputPluginStats = () => ({
  name: 'output-plugin-stats',
  configResolved(config) {
    const plugins = config.plugins.map((plugin) => plugin.name)
    console.log(`Your project has ${plugins.length} Vite plugins.`)
    console.table(plugins)
  }
})

export default defineConfig({
  plugins: [
    outputPluginStats()
  ]
})

Как вы видите, у нас есть функция outputPluginStats, которая возвращает объект со свойством name, которое является именем плагина, и специфический для Vite хук configResolved.

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

Давайте посмотрим, что мы делаем в приведенном выше коде:

const plugins = config.plugins.map((plugin) => plugin.name)

Мы мапируем плагины в config.plugins и возвращаем имена плагинов в виде массива под названием plugins

console.log(`Your project has ${plugins.length} Vite plugins.`)

Приведенная выше строка выдает значение количества плагинов в массиве plugins с помощью Array.prototype.length

Наконец, мы выводим массив plugins в таблицу:

console.table(plugins)

После того, как мы определили плагин, регистрируем его в массиве plugins объекта конфигурации Vite:

export default defineConfig({
  plugins: [
    outputPluginStats()
  ]
})

Пример №2: Request Analytics (Аналитика запроса)

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

Для этого добавим следующую функцию в файл vite.config.js.

vite.config.js

const requestAnalytics = () => ({
  name: 'request-analytics',
  configureServer(server) {
    return () => {
      server.middlewares.use((req, res, next) => {
        console.log(`${req.method.toUpperCase()} ${req.url}`)
        next()
      })
    }
  }
})

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

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

Во-первых, мы задаем имя плагина.

name: 'request-analytics'

Затем, хук configureServer позволяет нам настроить сервер Vite:

configureServer(server) {
    return () => {
     
    }
  }

Затем мы добавляем промежуточное ПО, которое принимает 3 аргумента: req, res, next. Внутри промежуточного ПО мы логируем метод запроса и URL, который был запрошен.

configureServer(server) {
    return () => {
      server.middlewares.use((req, res, next) => {
        console.log(`${req.method.toUpperCase()} ${req.url}`)
        next()
      })
    }
  }

Наконец, мы передаем запрос следующему обработчику с помощью вызова next().

Вызов плагина в массиве plugins будет выглядеть следующим образом:

vite.config.js

export default defineConfig({
  plugins: [
    outputPluginStats(),
    requestAnalytics()
  ]
})

Теперь, когда мы запускаем сервер Vite, выполнив команду npm run dev и посетив сайт http://localhost:5173/, то должны увидеть следующий результат:

GET /index.html

Мы только что создали своего рода аналитику запроса, которая сообщает нам, какие файлы были обработаны сервером Vite.

Пример №3: Hot Update Report (Отчет о горячем обновлении)

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

Для этого создадим плагин под названием hotUpdateReport.

Мы можем сделать это, подключившись к хуку handleHotUpdate, как показано ниже:

vite.config.js

const hotUpdateReport = () => ({
  name: 'hot-update-report',
  handleHotUpdate({file, timestamp, modules}) {
    console.log(`${timestamp}: ${modules.length} module(s) updated`)
  }
})

Обратите внимание, что мы используем хук handleHotUpdate для фиксации временной метки (timestamp), а также количества модулей (modules), которые были обновлены.

Хук handleHotUpdate предоставляет объект HmrContext, который мы деструктурируем, чтобы получить из него свойства file, timestamp и modules.

Нам просто нужно зарегистрировать плагин, примерно так:

vite.config.js

export default defineConfig({
  plugins: [
    outputPluginStats(),
    requestAnalytics(),
    hotUpdateReport()
  ]
})

Теперь при обновлении index.html, main.js или style.css в консоли будет появляться отчет.

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

Если после создания плагина вы решите опубликовать его в виде отдельного пакета для установки через NPM, вам следует придерживаться следующих правил:

  • Ваш плагин должен иметь понятное название с префиксом vite-plugin-.

  • Включать ключевое слово vite-plugin в package.json

{
  "name": "building-a-plugin-with-vite",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "keywords": ["vite-plugin"],
}
  • При документировании своего плагина включите раздел с подробным описанием того, почему он предназначен только для Vite (а не для Rollup). Чаще всего плагин предназначен только для Vite, потому что он использует некоторые специфические для Vite хуки плагина.

  • Наконец, если ваш плагин работает только для определенного фреймворка, то его название должно быть частью префикса названия плагина, например, vite-plugin-svelte-, vite-plugin-react-, vite-plugin-react-, vite-plugin-lit- и т.д.

Куда двигаться дальше?

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


Приглашаем всех желающих на открытое занятие «Архитектура больших Vue-приложений и лучшие практики». На занятии узнаем, как можно структурировать код по мере роста приложения, про монолитную и модульную архитектуру приложения. А также:

— Обсудим, какие приемы можно применить для снижения сложности разработки и сопровождения и как нам могут помочь фабрики компонентов и сервисы.
— Разберем хорошие практики и правила хорошего стиля.
— Не забудем про антипаттерны и чего следует избегать при разработке.

Регистрация на мероприятие открыта по ссылке.

Комментарии (0)