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

от автора

Зачем создавать плагин 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-приложений и лучшие практики». На занятии узнаем, как можно структурировать код по мере роста приложения, про монолитную и модульную архитектуру приложения. А также:

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

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


ссылка на оригинал статьи https://habr.com/ru/company/otus/blog/703876/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *