Последние несколько лет я работаю с методом глобального импорта JavaScript. Обычно работает с набором служебных функций, упакованных и переданных в другой модуль сайта, который содержит отдельную функцию для каждой части веб-функции:
(function(m, u, ui, w, a, $){
// Example Module
m.example = function(){
// Do stuff, the m.example module gets auto initialized.
};
})(Site.modules = Site.modules || {}, Site.utils, Site.ui, Site.w, Site.anim, jQuery);
В этом примере я передаю модули, которые мы добавляем, утилиты, объект пользовательского интерфейса (в основном с псевдонимом gsap) и другие вещи, такие как jQuery.
Как видите, он может стать большим и беспорядочным, особенно на больших сайтах с большим количеством функций.
Я хотел бы перейти на ES6 и NPM, и хотя я видел десятки статей и примеров о том, как сделать модуль, как импортировать модуль, добавить модули с помощью NPM, я не могу найти ни одного примера или статьи о на самом деле собирая все это вместе.
Для простого примера. Я импортирую slick-carousel с помощью NPM. У меня есть одностраничный веб-сайт с каруселью баннеров и каруселью твитов. Как мне проверить существование этих элементов и инициализировать 2 отдельные карусели?
Используя анонимное закрытие, я бы просто имел отдельную автоматически инициируемую функцию, которая ищет элемент DOM, а затем инициализирует карусель с различными параметрами.
Изменить
В качестве примера моего текущего рабочего процесса я определяю объект сайта, который имеет несколько повторно используемых статических переменных и некоторые элементы, повторно используемые на сайте, такие как переменные анимации, ссылка на окно, переменные автоматического обновления для доступа к свойствам области просмотра и т. д.
Затем в отдельном файле, уникальном для каждого созданного веб-сайта, у меня есть основной файл, в котором я создаю отдельные «модули» для каждой части реализованной функциональности на сайте. Использование плагинов jQuery и простого JavaScript, включенных на страницу вместе с утилитами и основными файлами js.
utils.js
jQuery(document).ready(function($) {
Site.init();
});
var Site = (function($) {
// DOM caching
var win = window;
// Globals
var w = {
width: win.innerWidth,
height: win.innerHeight,
scroll: win.pageYOffset
};
var ui = {
fast: 0.2,
slow: 0.4,
step: 0.03,
easeout: Power4.easeOut,
easein: Power4.easeIn
};
function updateGlobals(){
w.width = win.innerWidth;
w.height = win.innerHeight;
w.scroll = win.pageYOffset;
}
win.addEventListener('resize', updateGlobals, true);
win.addEventListener('scroll', updateGlobals, true);
win.addEventListener('load', updateGlobals, true);
return {
init: function(){
for (var prop in this.modules) {
if ( this.modules.hasOwnProperty(prop) ) {
this.modules[prop]();
}
}
for (var props in this.autoInits) {
if ( this.autoInits.hasOwnProperty(props) ) {
var $selector = $(props);
if ($selector.length) {
this.autoInits[props]($selector);
}
}
}
},
ui: ui,
w: w
};
})(jQuery);
main.js
(function(m, $){
m.homepageCarousel = function(){
var element = $('.js-homepage-carouel');
$(element).slick({
dots: true,
speed: 500,
arrows: false
});
};
m.productsCarousel = function(){
var element = $('.js-products-carouel');
$(element).slick({
dots: false,
speed: 500,
arrows: true
});
};
m.showcookieNotice = function(){
... example check cookies for marker and show cookie notice if not present.
}
... rest of the websites js, maps, menus, custom reused items etc
})(Site.modules = Site.modules || {}, jQuery);