【发布时间】:2016-01-04 04:18:30
【问题描述】:
我正在为自己创建一个单页应用程序,这是一个小框架。 我使用的是原生 Javascript,没有外部依赖,没有 jQuery,什么都没有。
这是我想做的:
在第一次访问页面后,我的框架只同步加载渲染当前页面所需的资源。之后,当当前页面的所有内容都加载完毕后,我创建了新的 Webworker。我希望他加载其他 .js 文件,代表网站上的其他页面。这些文件中的每一个都包含一个代表页面的对象——我希望这个对象在主线程中全局可用。在我的脑海中,webworker 应该开始通过 ajax 调用一个接一个地加载依赖项,并且每次他加载一些东西时,他应该通过 postmessage 通知主线程,并将文件发送到主线程(不确定是否将整个 ajax responseText 发送回主线程,或将其写入 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);
}
因为我无法从 webworker 线程访问 DOM。
所以问题是。 有没有更好的解决方案,然后将 responseText 字符串发送回主线程,然后对其调用 eval() ?我听说 eval 是邪恶的、缓慢的和错误的。 但我还有其他选择吗?
每一个建议,即使是那些会撕裂我的框架概念的建议都非常感谢。
这是我的 github 个人资料,但不要检查太多,它还远未完成,并且可能存在非常愚蠢的错误,并且文档是用我的母语编写的。 https://github.com/congrady/Bakalarka
【问题讨论】:
-
嗨。我认为你想做的事情根本没有用。您应该在主线程中异步加载所有依赖项。下载文件时,UI 线程不会被阻塞 - 仅在执行时。而且由于您无论如何都想执行它们,因此使用 web worker 不会有任何区别。
标签: javascript ajax resources load web-worker