@Dubrovin

Как оптимизировать JS код инициализации компонентов?

Здравствуйте,
есть вот такой код инициализации компонентов:
k = {
    find: ( el, selector ) => el.querySelector( selector ),
    findAll: ( el, selector ) => el.querySelectorAll( selector ),
};

k.on( document, 'DOMContentLoaded', () => {
	k.body = document.body;

	k.initAddedComponents();

	k.mutation = new MutationObserver( ( records ) => {
		console.log( records );
		let addedNodes = [];
		let removedNodes = [];

		records.forEach( record => {
			if ( 0 < record.addedNodes.length ) {
				addedNodes.push.apply( addedNodes, record.addedNodes );
			}

			if ( 0 < record.removedNodes.length ) {
				removedNodes.push.apply( removedNodes, record.removedNodes );
			}
		} );

		if ( 0 < removedNodes.length ) {
			k.removeDeletedComponents();
		}

		addedNodes.forEach( el => {
			if ( el instanceof Element ) {
				//k.initAddedComponents( el );
			}
		} );
	} );

	k.mutation.observe( document.documentElement, {
		subtree: true,
		characterData: true,
		childList: true,
	} );
} );

	removeDeletedComponents: () => {
		for ( let id in k.components ) {
			if ( false === document.body.contains( k.components[ id ].el ) ) {
				k.remove( id );
			}
		}
	},

	initAddedComponents: ( element ) => {
		let resEl = ( undefined === element ) ? document : ( ( null !== element.parentElement ) ? element.parentElement : element );

		k.declaration.forEach( ( component ) => {
			let elList = k.findAll( resEl, component.elSelector );

			elList.forEach( ( el ) => {
				if ( el[ component.name + 'Id' ] === undefined ) {
					let id = k.genId( component.name );
					el[ component.name + 'Id' ] = id;
					el.names = Array.isArray( el.names ) ? el.names : [];
					if ( ! el.names.includes( component.name ) ) {
						el.names.push( component.name );
					}
					k.components[ id ] = new component.classDecl( el, component.elSelector );
				}
			} );
		} );
	},


Проблема в производительности: при большом количестве addedNodes в мутациях (например, при отрисовке выпадающего списка в селекте), код в функции initAddedComponents начинает сильно тормозить браузер. С другой стороны, запускать initAddedComponents полностью на document целиком тоже не правильно. Возможно, есть какой-нибудь способ обнаруживать элементы с нужным классом более оптимально? Буду признателен за любую помощь и критику, спасибо!
  • Вопрос задан
  • 84 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы