Я создаю одностраничное приложение, небольшую структуру для себя. Я использую собственный Javascript, никаких внешних зависимостей, никакого jQuery, ничего.
Вот что я хотел бы сделать:
После первого посещения страницы мой фреймворк синхронно загружает только ресурсы, необходимые для отображения текущей страницы. После этого, когда все загружено для текущей страницы, я создаю новый Webworker. Я хочу, чтобы он загружал другие файлы .js, представляющие другие страницы сайта. Каждый из этих файлов содержит ровно один объект, представляющий страницу. Я хочу, чтобы этот объект был глобально доступен в основном потоке. В моей голове веб-воркер должен начать загружать зависимости одну за другой через вызовы ajax, и каждый раз, когда он что-то загружает, он должен информировать основной поток через почтовое сообщение и отправлять файл в основной поток (не уверен, что отправить весь ajax responseText обратно в main thread, либо пишите в sessionStorage - буду признателен за рекомендации даже по этой теме).
НО. Вот проблема. Мне нужно ВЫПОЛНИТЬ этот файл - я хочу, чтобы мои объекты были глобально доступны для моего основного потока. Я знаю, что не могу сделать что-то вроде этого:
function loadScript(url, callback)
{
// Adding the script tag
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.type = 'text/javascript';
script.src = url;
// Then bind the event to the callback function.
// There are several events for cross browser compatibility.
script.onreadystatechange = callback;
script.onload = callback;
// Fire the loading
head.appendChild(script);
}
Потому что я не могу получить доступ к DOM из потока webworker.
Итак, вопрос. Есть ли лучшее решение, чем отправить строку responseText обратно в основной поток, а затем вызвать для нее eval()? Я слышал, что eval злой, медленный и глючный. Но есть ли у меня другой выбор?
Каждая рекомендация, даже та, которая разорвала бы мою концепцию фреймворка на части, очень ценится.
Вот мой профиль на гитхабе, но не проверяйте его слишком много, он далеко не закончен, и могут быть довольно глупые ошибки, а документация написана на моем родном языке. https://github.com/congrady/Bakalarka