这是交易 - 我们只有一个排列,因此不需要执行任何浏览器检测。我们正在优化移动设备,延迟和网络带宽是一个问题。除了使用HTTP请求之外,我们还有另一种获取主要片段的方法,并希望利用它,但* .nocache.js只知道创建一个通过http请求它的脚本标记。
我试图创建一个自定义版本的* .nocache.js(目前是黑客攻击),它会做足够的设置以允许我们以不同的方式加载片段代码(因为直接加载片段似乎不起作用,即使我无视它 - 所有代码都在传递给函数调用的引用字符串列表中。我设法让代码运行但它失败了。
有什么想法吗?
答案 0 :(得分:0)
好吧,在Thomas Broyer的评论之后,我能够进一步找到感觉(目前)确定答案:"这不可能干净利落强>&#34。 (没有编写自定义链接器)...但是我还在继续追求一种不太干净的方式。
具体来说,有三个官方GWT链接器,其中两个生成代码本身想要通过http请求主代码片段。第三个," sso"生成一个文件,仅适用于单个排列(在我的情况下是可接受的)。但是,生成的代码会执行document.write(),它会在动态调用时删除主机文档。
这样做是为了在它预期来自的标记之后创建一个标记标记,以便它可以从中提取自己的URL和脚本基URI。在我的情况下,主机页面位于GWT模块文件夹的父文件夹中,通常包含以下内容:
<script ... src="moduleName/moduleName.nocache.js"></script>
...和moduleName.nocache.js想要找出&#34; host-base / moduleName&#34;所有其他与模块相关的请求的基本URI(例如其他代码片段等)。
在任何情况下,如果找不到它用document.write()写的标记标记,它将尝试查找标记并使用它。麻烦的是,该标签既不正常也不正确 - 在我们的例子中它将引用所需内容。但是,在我们实际注入moduleName.nocache.js之前,也可以动态插入此标记...然后在注入后更正。
类似的东西:
// Obtain the main fragment script code using alternate means:
var scriptCode = ...;
// Create the script tag for the main code fragment
var codeElement = document.createElement("script");
codeElement.type = "text/javascript";
// Prepare the environment to run it, to hack around
// its document.write and base URI needs.
// First remember the normal/original document.write method:
var originalWriteMethod = document.write;
// ... and replace it with a dummy one (we'll put this back later):
document.write = function() {}
// ... and also remember the document base
var originalBase = document.baseURI;
// Figure out the script base based on the originalBase:
var scriptBase = originalBase + "moduleName/";
// Failing document.write case, the main code fragment will look for
// the last <base> tag to get the script base. Add that element and
// set it to reference the scriptBase (we'll have to undo this later):
var baseElement = document.createElement("base");
baseElement.href = scriptBase;
document.head.appendChild(baseElement);
// Different browsers work differently... try to cover two cases:
try {
codeElement.appendChild.document.createTextNode(scriptCode);
document.head.appendChild(codeElement);
} catch (e) {
codeElement.text = scriptCode;
document.head.appendChild(codeElement);
} finally {
// Whatever case occurred above, we must return the document.write()
// to normal implementation and undo our temporary document base
// change:
document.write = originalWriteMethod;
baseElement.href = originalBase;
}
&#13;
这会将代码加载到#34;加载&#34;,初始化并运行。我还有一些测试要做,但这是我到目前为止最接近的。