Файл JavaScript 7 и 8 IE нежелательно кэшируется с require.js - PullRequest
1 голос
/ 26 апреля 2011

У меня есть страница javascript page.js, загружаемая с require.js. Вызов для page.js размещается в нижней части страницы после вызовов require.js и выглядит следующим образом:

<script>
    require(["page"]);
</script>

Функции внутри page.js просто не выполняются при каждом доступе к странице.

Чтобы было ясно, предупреждение («привет»); в середине page.js будут предупреждены большинство, но не всегда. Я почти уверен, что это не существующая проблема IE, и что простое предупреждение всегда будет выполняться при условии отсутствия других ошибок JS.

95% времени выполнения страницы и соответствующих ей функций, примерно 5% времени, когда браузеры IE не выполняют повторно содержимое страницы. Js.

Я не думаю, что это неотъемлемая проблема IE, скорее, require.js запутывается в связанных агрессивных проблемах кэширования, обнаруженных в IE.

Изменения: Просто чтобы уточнить, файл page.js виден в загрузке f12 dom, когда происходит ошибка. Страница правильно кешируется. Проблема в том, что файл кэшированного кода не запускается повторно!

Например, предупреждение в этом файле не выполняется!

Я не уверен насчет внутренних функций require.js, но полагаю, что они делают xhr для ресурсов и оценивают его. Кажется, xhr завершает работу и загружает в dom, но eval не работает правильно. (Это, конечно, предположение, поскольку я не знаю достаточно внутренностей require.js).

Ответы [ 3 ]

1 голос
/ 26 апреля 2011

Возможно, проблема не в кешировании.Кэширование в основном контролируется на стороне сервера, поэтому, если вы не хотите, чтобы файл кэшировался, у вас есть сервер, устанавливающий заголовки контроля кэша для этого.Кэширование не влияет на то, «исполняется» ли файл javascript или нет, оно влияет только на то, откуда браузер получает данные при попытке разрешить данный ресурс.Обычно вы хотите, чтобы файлы .js кэшировались по соображениям производительности.

В вашем случае кэширование не может быть реальной проблемой.При использовании динамических загрузчиков исходного кода javascript (библиотеки, такие как dojo поддерживают это), лучше всего, чтобы загружаемый вами файл был заключен в следующее:

(function(){

// Main code here...

})();

Это определяет анонимную функцию, а затем сразу ее выполняет.Это дает следующие преимущества:

  • Создает замыкание, чтобы вы могли объявлять переменные, которые видны только в области действия вашего файла.

  • Убедитесьчто выполняются любые прямые исполняемые операторы.

Обратите внимание, я не знаком с require.js, поэтому есть вероятность, что он может сыграть роль в вашей проблеме.Кроме того, вы не предоставили файл, который вы загружаете с помощью require, в котором может быть ошибка, вызывающая несоответствие, с которым вы столкнулись.

1 голос
/ 27 апреля 2011

Вывод: IE (там, где это происходило чаще всего) поглотил ошибку, когда мы смогли воспроизвести ее в Chrome, мы обнаружили ошибку, указывающую, что одна из наших глобальных функций еще не была загружена, потому что файл глобальных функций не был добавлен в список требуемых. К сожалению, мы не используем require.js для компиляции + оптимизации, которая могла бы или не могла бы работать без списка IMPLICIT файла globals.js как зависимости .

Полагаю, главное - убедиться, что все вызываемые функции сами определены в зависимости, неявно указанной в блоке require!

1 голос
/ 26 апреля 2011

Единственный способ предотвращения кэширования ваших js-файлов, который я знаю, - это добавить в конец случайную строку: пример:

<script src="http://www.mydomaine.com/myjsfile.js?t=123456"></script>

генерировать содержимое параметра "t" случайным образом, используя хэш md5 или wathever,это заставляет браузеры полагать, что это каждый раз новый файл.

...