IE 7&;8使用require.js不必要地缓存javascript文件

IE 7&;8使用require.js不必要地缓存javascript文件,javascript,internet-explorer,caching,internet-explorer-8,require,Javascript,Internet Explorer,Caching,Internet Explorer 8,Require,我有一个页面javascript page.js正在加载require.js。对page.js的调用位于页面底部,位于对require.js的调用之后,如下所示: <script> require(["page"]); </script> 要求([“页面]); js中的函数不会在每次访问页面时执行 明确地说,是一个警报(“你好”);在页面的中间,JS将被提醒,但不是所有的时间。我很确定这不是一个现有的IE问题,只要没有其他JS错误,就会执行一个简单的警报 9

我有一个页面javascript page.js正在加载require.js。对page.js的调用位于页面底部,位于对require.js的调用之后,如下所示:

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

要求([“页面]);
js中的函数不会在每次访问页面时执行

明确地说,是一个警报(“你好”);在页面的中间,JS将被提醒,但不是所有的时间。我很确定这不是一个现有的IE问题,只要没有其他JS错误,就会执行一个简单的警报

95%的时间执行页面及其相应的函数,大约5%的时间IE浏览器没有重新执行page.js的内容

我不认为这是IE固有的问题,而是require.js在IE中发现的相关攻击性缓存问题上遇到了障碍

编辑: 只是澄清一下,发生错误时,page.js文件在f12 dom加载中可见。页面已正确缓存。问题是缓存的代码文件没有重新运行

例如,此文件中的警报未执行


我不确定require.js的内部结构,但我认为它们对资源执行xhr并对其进行评估。似乎xhr已经完成并加载到dom中,但是eval没有正常工作。(这当然是推测,因为我对require.js的内部结构了解不够)。

我知道的防止缓存js文件的唯一方法是在末尾添加一个随机字符串: 例如:

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


使用md5哈希或wathever随机生成“t”参数内容,这使浏览器每次都认为它是不同的文件。

问题可能不是由于缓存造成的。缓存基本上是在服务器端控制的,因此如果您不希望缓存文件,则可以让服务器设置缓存控制头来实现这一点。缓存不影响是否“执行”javascript文件,它只影响浏览器在尝试解析给定资源时从何处获取数据。通常,出于性能原因,您希望缓存.js文件

在您的情况下,缓存可能不是真正的问题。使用动态javascript源加载程序(dojo之类的库支持此功能)时,最好将加载的文件包装为以下格式:

(function(){

// Main code here...

})();
这定义了一个匿名函数,然后立即执行它。这具有以下优点:

  • 创建闭包,以便您可以声明仅在文件范围内可见的变量

  • 确保执行任何直接可执行语句

注意,我不熟悉
require.js
,因此它可能会在您的问题中起作用。此外,您没有提供通过require加载的文件,该文件可能存在导致您遇到不一致的错误。

结论: IE(它主要发生的地方)有点吞没了错误,当我们能够在Chrome中重现它时,我们发现一个错误,表明我们的一个全局函数尚未加载,因为全局函数文件没有添加到require列表中。不幸的是,我们没有使用require.js的compile+优化,如果globals.js没有作为依赖项的隐式列表,那么它可能会被禁用,也可能不会被禁用


我想带回家的是确保调用的任何函数本身都是在require块中隐式列出的依赖项中定义的

问题是……?:p问题是如何在require.js中不让IE7和IE8进行不必要的缓存。您是否尝试过将代码放入命名的“init”函数中,然后在require语句后调用它的解决方法?不知道你的应用程序做什么,不确定这对于你的应用程序来说是否是一种可行且可维护的方法。我与dojo一起工作,它提供了自己的require功能,我没有注意到您所遇到的问题。我+1是一个好的asnwer,虽然我知道这些东西,但并不是我问题的真正答案:)我将更新我的问题以澄清。我有一个结束,我有jQuery文档准备好了,我有require.ready结束等等。似乎什么都不起作用。