Slim.js — это лёгкая библиотека для создания веб-компонентов с реактивностью и минимальным оверхедом. Для крупных проектов важно правильно настроить сборку с помощью Rollup, чтобы обеспечить эффективный бандлинг, поддержку модулей и совместимость с браузерами.
Rollup использует файл rollup.config.js для определения
входных точек, плагинов, форматов выходных файлов и других параметров
сборки. Типовая структура для проекта на Slim.js выглядит так:
import resolve from '@rollup/plugin-node-resolve';
import commonjs from '@rollup/plugin-commonjs';
import babel from '@rollup/plugin-babel';
import { terser } from 'rollup-plugin-terser';
import serve from 'rollup-plugin-serve';
import livereload from 'rollup-plugin-livereload';
export default {
input: 'src/main.js',
output: [
{
file: 'dist/bundle.js',
format: 'iife',
name: 'App',
sourcemap: true
},
{
file: 'dist/bundle.esm.js',
format: 'esm',
sourcemap: true
}
],
plugins: [
resolve(),
commonjs(),
babel({ babelHelpers: 'bundled', exclude: 'node_modules/**' }),
terser(),
serve({ open: true, contentBase: ['dist'], port: 3000 }),
livereload('dist')
]
};
Ключевые моменты:
input — указывает главный файл приложения, который
импортирует все компоненты Slim.js.
output — массив с разными форматами бандла:
iife для запуска прямо в браузере без системы
модулей.esm для современных сборщиков и динамического
импорта.sourcemap: true позволяет отлаживать код в исходных
файлах.
Плагины обеспечивают:
resolve,
commonjs).terser).serve, livereload).Для крупных проектов важна модульная структура. Slim.js компоненты
обычно лежат в отдельных файлах внутри src/components/.
Rollup позволяет использовать код-сплиттинг через
динамический импорт:
const buttonModule = () => import('./components/Button.js');
buttonModule().then(module => {
module.default();
});
В конфигурации Rollup добавляется output.dir вместо
output.file:
output: {
dir: 'dist',
format: 'esm',
entryFileNames: '[name].js',
chunkFileNames: '[name]-[hash].js',
sourcemap: true
}
Такой подход автоматически создаёт отдельные чанки для крупных компонентов, загружаемых по требованию, что сокращает время первоначальной загрузки.
Slim.js не требует специального Rollup-плагина, но рекомендуется
использовать babel-plugin-transform-slim для
оптимизации реактивных свойств и улучшения tree-shaking. В
babel.config.js можно прописать:
module.exports = {
presets: [
['@babel/preset-env', { targets: "> 0.25%, not dead" }]
],
plugins: ['transform-slim']
};
Это позволяет Rollup исключать неиспользуемые свойства компонентов из финального бандла, снижая размер.
Для разделения конфигураций можно использовать
rollup.config.dev.js и rollup.config.prod.js с
общим базовым конфигом:
Development
serve и livereload.Production
terser.Пример объединения через merge:
import merge from 'deepmerge';
import baseConfig from './rollup.config.base.js';
const devConfig = merge(baseConfig, {
plugins: [/* дополнительные плагины для dev */]
});
export default devConfig;
Slim.js ориентирован на современные браузеры, но для проектов, где требуется поддержка старых версий, Rollup можно совместить с Babel и polyfill:
babel({
babelHelpers: 'bundled',
exclude: 'node_modules/**',
presets: [
['@babel/preset-env', { targets: { ie: '11' }, useBuiltIns: 'usage', corejs: 3 }]
]
})
Это гарантирует, что реактивные свойства Slim.js и динамические импорты корректно работают даже в IE11 или старых версиях Edge.
terser убирает лишние
пробелы, комментарии, сокращает имена функций и переменных.Переменные окружения помогают включать/отключать функционал в зависимости от среды:
import replace from '@rollup/plugin-replace';
plugins: [
replace({
'process.env.NODE_ENV': JSON.stringify('production')
})
]
Это позволяет включать debug-логирование в разработке и полностью отключать его в продакшене.
src/components/.main.js) импортирует корневой
компонент.Такой подход обеспечивает высокую производительность, лёгкость поддержки и удобную отладку больших проектов на Slim.js.