我正在开发一个单页应用程序,通过更改哈希值并仅加载和更改页面内容来实现。我正在考虑如何管理每个“页面”可能需要的JavaScript。
我已经编写了一个 History 模块来监控位置哈希值,它可能类似于 domain.com/#/company/about
,还有一个 Page 类将使用 XHR 获取内容并将其插入到内容区域中。
function onHashChange(hash) {
var skipCache = false;
if(hash in noCacheList) {
skipCache = true;
}
new Page(hash, skipCache).insert();
}
// Page.js
var _pageCache = {};
function Page(url, skipCache) {
if(!skipCache && (url in _pageCache)) {
return _pageCache[url];
}
this.url = url;
this.load();
}
缓存应该让已经加载的页面跳过XHR。我还将内容存储到一个文档片段中,然后在插入新的
Page
时从文档中提取当前内容,这样浏览器只需要为片段构建DOM一次。如果页面具有时间敏感数据,则可能希望跳过缓存。
以下是需要决定的事情:被加载的任何页面都很可能具有一些自己的JavaScript来控制页面。例如,如果页面使用选项卡、需要幻灯片展示、具有某种形式的动画、具有ajax表单或其他等等。
最好的方式到底是什么?将脚本标记包含在从XHR返回的文档片段中吗?如果我需要跳过缓存并重新下载片段怎么办?我感觉第二次调用完全相同的JavaScript可能会导致冲突,比如重新声明相同的变量。
更好的方式是否应该是在获取新
Page
时将脚本附加到中?这将需要原始页面知道每个其他页面可能需要的所有资源。除了了解包括所有内容的最佳方式之外,我还需要担心内存管理和可能的泄漏,因为将许多不同的JavaScript部分加载到单个页面实例中?