MutationObserver очень заинтересовал меня для одного из сценариев ленивой загрузки модулей в javascript: когда какой-то модуль нужен только для работы с каким-то конкретным элементом, которого может не быть на странице изначально, но который может появиться впоследствии (как вариант, после какого-нибудь ajax запроса).

Это также может быть полезно, например, в блогах, когда в одних записях нужен какой-нибудь слайдер, в других фотогалерея, в третьих видеоплеер и так далее. И вместо того, чтобы заранее раздувать бандл всеми возможными вариантами, просто подгружаем необходимые модули в случае необходимости.

Вот такой набросок

function waitForSelectorOnce(selector) {
	return new Promise((resolve) => {
		let observer = null;
		let checker = () => {
			if (document.querySelector(selector)) {
				observer && observer.disconnect();
				resolve();
				return true;
			} else {
				return false;
			}
		};

		// проверяем, может быть селектор сразу имеется на странице
		// тогда и не надо инициализировать MutationObserver
		if (!checker()) {
			observer = new MutationObserver(checker);
			observer.observe(document.documentElement, {
				attributes: true,
				childList: true,
				subtree: true,
			});
		}
	});
}

waitForSelectorOnce(".gallery").then(() => import("./gallery"));
waitForSelectorOnce(".fotorama").then(() => import("./fotorama"));
waitForSelectorOnce("a[href$='.mp3']").then(() => import("./audio-player"));

Работает даже в ie 11.

По хорошему, надо еще использовать throttle. И промис тут скорее всего избыточен, можно просто передать коллбэк при вызове функции. Ну а вообще, это только набросок. Production ready код я никому не обещал.