Popper.js — это мощная библиотека для позиционирования всплывающих элементов, таких как тултипы, модальные окна и выпадающие списки. При работе с современными сборщиками модулей, такими как Rollup, важно понимать, как правильно настроить сборку и бандлинг, чтобы обеспечить корректное подключение Popper.js в проекте.
Для начала необходимо установить основные пакеты через npm:
npm install @popperjs/core
npm install rollup rollup-plugin-node-resolve rollup-plugin-commonjs --save-dev
@popperjs/core — ядро библиотеки Popper.js.rollup — сам сборщик.rollup-plugin-node-resolve — позволяет Rollup находить
пакеты в node_modules.rollup-plugin-commonjs — преобразует CommonJS модули в
формат, совместимый с Rollup.Файл rollup.config.js должен включать разрешение модулей
и преобразование CommonJS, так как Popper.js использует современный
модульный подход:
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
export default {
input: 'src/main.js',
output: {
file: 'dist/bundle.js',
format: 'iife', // Подходит для браузера
name: 'App'
},
plugins: [
resolve(), // Находит модули в node_modules
commonjs() // Преобразует CommonJS в ES-модули
]
};
Ключевой момент: использование
resolve() гарантирует, что Rollup сможет корректно
импортировать Popper.js из node_modules, а
commonjs() обеспечивает поддержку модулей, которые не имеют
ES6-экспорта.
В ES-модульной структуре достаточно использовать стандартный синтаксис импорта:
import { createPopper } from '@popperjs/core';
const button = document.querySelector('#button');
const tooltip = document.querySelector('#tooltip');
createPopper(button, tooltip, {
placement: 'top',
modifiers: [
{
name: 'offset',
options: {
offset: [0, 8],
},
},
],
});
Особенности:
placement задаёт позицию всплывающего элемента
относительно целевого.modifiers позволяют гибко настраивать поведение:
смещение, сдвиг, смягчение выхода за границы окна.Для уменьшения размера бандла рекомендуется подключать следующие плагины:
import { terser } from 'rollup-plugin-terser';
plugins: [
resolve(),
commonjs(),
terser()
]
import alias from '@rollup/plugin-alias';
plugins: [
alias({
entries: [
{ find: '@popper', replacement: 'node_modules/@popperjs/core/dist/esm' }
]
}),
resolve(),
commonjs()
]
Преимущество: упрощается импорт модулей Popper.js и уменьшается вероятность ошибок при перемещении файлов.
Для больших проектов имеет смысл использовать ленивую загрузку Popper.js через динамический импорт:
document.querySelector('#button').addEventListener('mouseenter', async () => {
const { createPopper } = await import('@popperjs/core');
const button = document.querySelector('#button');
const tooltip = document.querySelector('#tooltip');
createPopper(button, tooltip, { placement: 'right' });
});
Преимущество: Popper.js загружается только при необходимости, снижая время начальной загрузки страницы.
Рекомендуется разделять бандлы:
Пример Rollup конфигурации для вендорского бандла:
export default {
input: 'src/vendor.js',
output: {
file: 'dist/vendor.js',
format: 'iife',
name: 'Vendor'
},
plugins: [
resolve(),
commonjs(),
terser()
]
};
В src/vendor.js можно импортировать все сторонние
библиотеки:
import '@popperjs/core';
import 'lodash';
Такой подход позволяет использовать кэширование в браузере и уменьшает размер основного бандла при изменениях кода приложения.
commonjs() плагин.