Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Почему не работают динамические импорты в JS функции?

Союз Здравых Сил Профи (517), на голосовании 6 месяцев назад
В общем вопрос такой: Мне нужно импортить объекты с данными, которые находятся в других файлах. Сейчас я импортнул все файлы сразу(в начале), мне же надо сделать это динамически, т.е нужно чтобы при открытии определённой страницы - импортился только один, определённый файл для этой страницы, а не всё сразу. Это у меня в конструкции switch-case

Динамические импорты работают немного по другому, поэтому например я не могу написать в этой конструкции - import { translationList } from '/dist/js/languages/index_translate.js'. Нужно import('/dist/js/languages/index_translate.js');
А в этом файле у меня создан объект, и при таком импорте как я понял этот объект не прочитывается. Типо файл может и импортится, а вот объект в нём нет. Знаю что динам.импорты возвращают Promise, но я не придумал как мне с ним сделать так, чтоб заработало, подскажите пж

Ошибка(если юзать мой нынешний switch-case):
"Uncaught ReferenceError: translationList is not defined"


 // сейчас я сделал статические импорты, но я хочу делать импорты по условию, т.е динамические 
import { translationList } from '/dist/js/languages/index_translate.js';
import { translationList } from '/dist/js/languages/services_translate.js';

// Общие данные
const currentPath = document.location.pathname
let currentLang = localStorage.getItem('language') || 'ru'
const langButtons = document.querySelectorAll('[data-switch]')

// Тут должен быть Импорт нужного файла с переводом, в зависимости от открытой страницы, КАК сделать?
// async function checkPageAdress(){

// switch(currentPath){
// case '/index.html':
// import('/dist/js/languages/index_translate.js');
// break
// case '/services.html':
// import('/dist/js/languages/services_translate.js');
// break
// default:
// import('/dist/js/languages/index_translate.js');
// }

// }
// checkPageAdress()


langButtons.forEach((btn) => {btn.addEventListener('click', (event) => {

currentLang = event.currentTarget.dataset.switch;
localStorage.setItem('language', event.currentTarget.dataset.switch)

langButtons.forEach(el => {
el.classList.remove('language-active')
})
event.currentTarget.classList.add('language-active')


changeLang()
})
})


function changeLang(){
for(let element in translationList){
let siteElements = document.querySelectorAll(`[data-lang="${element}"]`)
siteElements.forEach(text => {
text.textContent = translationList[element][currentLang]
})
}
}
changeLang()
Голосование за лучший ответ
Dlazder Мудрец (16875) 7 месяцев назад
Насколько мне известно, require можно использовать в подобных ситуациях. Но я бы использовал фетч
Союз Здравых СилПрофи (517) 7 месяцев назад
Да кстати, можно require. Я как то забыл вообще, что такое импортирование есть
Можно кста делать так как я, просто импорты присваивать какой-то переменной, например let infoObject = import('....')

И потом в функциях ниже обращаться к infoObject.translationList
Dlazder Мудрец (16875) Союз Здравых Сил, только при импорте у тебя все переводы тянутся в бандл, вместо одного.
Похожие вопросы