定制或完全跳过GWT * .nocache.js的最佳方法是什么

时间:2018-01-29 17:39:56

标签: gwt gwt-2.8

这是交易 - 我们只有一个排列,因此不需要执行任何浏览器检测。我们正在优化移动设备,延迟和网络带宽是一个问题。除了使用HTTP请求之外,我们还有另一种获取主要片段的方法,并希望利用它,但* .nocache.js只知道创建一个通过http请求它的脚本标记。

我试图创建一个自定义版本的* .nocache.js(目前是黑客攻击),它会做足够的设置以允许我们以不同的方式加载片段代码(因为直接加载片段似乎不起作用,即使我无视它 - 所有代码都在传递给函数调用的引用字符串列表中。我设法让代码运行但它失败了。

有什么想法吗?

1 个答案:

答案 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之前,也可以动态插入此标记...然后在注入后更正。

类似的东西:

&#13;
&#13;
      // 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;
&#13;
&#13;

这会将代码加载到#34;加载&#34;,初始化并运行。我还有一些测试要做,但这是我到目前为止最接近的。