Зачем создавать плагин 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/
Добавить комментарий