Каков наилучший способ настроить или полностью пропустить GWT *.nocache.js?

Вот в чем дело - у нас есть только одна перестановка, поэтому нет необходимости выполнять какое-либо обнаружение браузера. Мы оптимизируем для мобильных устройств, и задержки и пропускная способность сети являются проблемой. У нас есть альтернативный способ получения основного фрагмента, кроме использования HTTP-запроса, и мы хотели бы использовать это, но *.nocache.js знает только о создании тега сценария, который запрашивает его через http.

Я пытался создать пользовательскую версию *.nocache.js (в настоящее время взлома), которая будет делать достаточно настроек, чтобы позволить нам загружать фрагмент кода по-другому (так как простая загрузка фрагмента, похоже, не работает, даже когда я unescape it - весь код находится внутри списка строк в кавычках, переданных в вызов функции). Мне удалось запустить этот код, но он не работает.

Есть идеи?

1 ответ

Решение

Что ж, после комментария Томаса Бройера, приведенного выше, я смог продвинуться дальше и найти то, что кажется (в настоящее время) окончательным ответом: "Это НЕ возможно чисто ". (без написания собственного компоновщика)... но есть менее чем чистый способ, которым я все еще продолжаю следовать.

В частности, существует три официальных компоновщика GWT, и два из них создают код, который сам хочет запросить основной фрагмент кода через http. Третий, "sso" создает один файл и работает только для одной перестановки (что приемлемо в моем случае). Однако полученный код выполняет document.write(), который уничтожает основной документ при динамическом вызове.

Это делается для того, чтобы создать маркерный тег сразу после ожидаемого тега, чтобы он мог извлечь из него свой собственный URL и базовый URI сценария. В моем случае страница хоста находится в родительской папке папки модуля GWT и обычно содержит что-то вроде:

<script ... src="moduleName/moduleName.nocache.js"></script>

... и moduleName.nocache.js хочет выяснить, что базовый URI " host-base / moduleName" для всех других связанных с модулем запросов (таких как другие фрагменты кода и т. д.).

В любом случае, если ему не удается найти тег маркера, который он записывает с помощью 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;
      }

Это получает код для "загрузки", инициализации и запуска. У меня еще есть кое-какие тесты, но это самое близкое, к чему я дошел.

Другие вопросы по тегам