Slim Sel ect публикуется как обычный JavaScript-пакет, распространяемый через npm и CDN, поэтому процесс публикации плагина в экосистеме библиотеки фактически совпадает с публикацией любого современного frontend-пакета, но с рядом специфических требований к структуре, сборке и совместимости.
Плагин для Slim Sel ect представляет собой расширение поведения
базового экземпляра SlimSelect, добавляющее:
data-моделью библиотеки.Перед публикацией важно обеспечить совместимость с внутренней архитектурой, основанной на управлении состоянием через конфигурационный объект и события.
Ключевым требованием является отсутствие жёстких зависимостей от фреймворков и минимизация внешних библиотек.
Типичная структура расширения выглядит следующим образом:
slim-select-plugin/
├── src/
│ ├── index.js
│ ├── plugin-core.js
│ └── utils.js
├── dist/
│ ├── index.esm.js
│ ├── index.umd.js
├── package.json
├── README.md
└── rollup.config.js
Основное различие между вариантами сборки:
Slim Select не имеет строгого API для «официальных» плагинов, поэтому используется паттерн расширения экземпляра.
Плагин обычно подключается одним из способов:
import SlimSelect fr om 'slim-select'
import MyPlugin fr om './plugin'
MyPlugin(SlimSelect)
const sel ect = new SlimSelect({
select: '#sel ect'
})
select.use(MyPlugin)
Во втором варианте требуется, чтобы библиотека или обёртка
предоставляла метод use, добавляющий плагины в runtime.
Slim Select опирается на события и внутренние хуки
(beforeOpen, afterChange,
search), что позволяет строить плагины без вмешательства в
ядро.
Пример базового плагина:
export default function MyPlugin(instance, options = {}) {
const config = {
enabled: true,
...options
}
if (!config.enabled) return
instance.on('afterOpen', () => {
console.log('Dropdown opened')
})
instance.on('afterChange', (values) => {
console.log('Selected:', values)
})
instance.addMethod('clearCustom', () => {
instance.set([])
})
}
addMethod;Плагин может добавлять новые методы через динамическую инъекцию:
instance.addMethod('highlightFirst', () => {
const data = instance.getData()
if (data.length) {
instance.set([data[0].value])
}
})
Это позволяет создавать модульные расширения без изменения исходного кода библиотеки.
Slim Select предоставляет событийную модель:
beforeOpenafterOpenbeforeChangeafterChangesearcherrorПлагин должен опираться именно на них:
instance.on('search', (value, data) => {
return data.filter(item =>
item.text.toLowerCase().includes(value.toLowerCase())
)
})
При публикации важно учитывать, что возвращаемое значение события может влиять на внутренний рендер.
Для публикации в npm используется сборка через Rollup или аналогичный инструмент.
Пример конфигурации:
export default {
input: 'src/index.js',
output: [
{
file: 'dist/index.esm.js',
format: 'esm'
},
{
file: 'dist/index.umd.js',
format: 'umd',
name: 'SlimSelectPlugin'
}
]
}
Корректный package.json критичен для интеграции:
{
"name": "slim-select-plugin-example",
"version": "1.0.0",
"main": "dist/index.umd.js",
"module": "dist/index.esm.js",
"peerDependencies": {
"slim-select": ">=2.0.0"
},
"keywords": [
"slim-select",
"plugin",
"select",
"dropdown"
]
}
peerDependencies обязателен для предотвращения
дублирования Slim Select;module нужен для tree-shaking;main используется в CommonJS окружениях.Процесс публикации:
npm login
npm run build
npm publish --access public
Используется семантическое версионирование:
Пример:
1.0.0 → 1.1.0 → 2.0.0
Плагин считается готовым к использованию только при наличии:
Пример структуры README:
Installation
Usage
Options
Events
Methods
Compatibility
При публикации важно учитывать:
Option;peerDependencies;search.export default function enhance(instance) {
const originalSet = instance.set
instance.set = function(values) {
console.log('Intercepted set:', values)
return originalSet.call(this, values)
}
}
import PluginA fr om './a'
import PluginB fr om './b'
export default function compose(instance) {
PluginA(instance)
PluginB(instance)
}
Slim Select не предоставляет полноценной plugin-архитектуры уровня framework, поэтому:
Для простых плагинов часто добавляется UMD-бандл:
<script src="https://unpkg.com/slim-select-plugin/dist/index.umd.js"></script>
После чего плагин становится доступен как глобальный объект:
SlimSelectPlugin(SlimSelect)
Хорошо оформленный плагин для Slim Select обычно учитывает: