【问题标题】:Is it possible to preload a JavaScript file one page earlier than it will be used?是否可以在使用前一页预加载 JavaScript 文件?
【发布时间】:2015-04-25 05:17:03
【问题描述】:

由于依赖系统没有我想要的那么正式,我现在有一个非常非常大的“主”JS 文件,其中包含一个非常大的厨房水槽,可在我的应用程序的每个页面中使用;也就是说,一旦您登录。

加载只需要几秒钟,但是这几秒钟对于首次登录主页的体验来说并不是很好。所以,我想找到一种在我的登录页面上加载我的脚本的方法,这样当浏览器在主页上请求它时,它要么得到 304 Not Modified 响应,要么只是知道不重新请求它。这是我尝试过的。

只包括<script>

不幸的是,这不起作用,因为有问题的脚本没有“定义保护”。将它包含在页面上会扰乱登录页面,因为它期望存在某些<div>s。它是通过dojo构建的,我不想破解构建的文件,所以我不想在这样的检查中包围它的代码。

用 XHR 抓住它

我实际上已经修复了一段时间,它在 Chrome 中似乎可以正常工作;一旦登录页面完全加载,我的脚本就会向“js/masterFile.js”发送一个 XHR,并且什么也不做。假设是只要缓存头没问题,浏览器在以后需要该文件作为脚本时就会保留它。正如我所说,事实证明大多数浏览器似乎都不是这样工作的。有些人重用了他们从 XHR 中获得的“文本”,有些人似乎以不同于其他内容的方式缓存脚本;这对他们来说可能是一个与安全相关的问题。

在 iframe 中加载它

这有点进入困难领域,因为我不喜欢 iframe,这是一个额外的要求。但是,这样做至少会让浏览器以正确的方式缓存脚本。但是它引入了很多代码复杂性,我犹豫要不要解决这个问题。

如果有帮助的话,脚本是 AMD 兼容的;但是,有问题的主脚本是一个“引导层”,其中包含 require/define 的基本定义。

【问题讨论】:

  • 您可以随时扩展您的 XHR 修复程序以将代码填充到 sessionStorage
  • @PaulS。嗯...然后在下一页运行 eval() ?那是……一种有趣的修复方法。我需要考虑它是否具有安全隐患。另外,我想确定这不会弄乱任何试图通过 AMD 检索它的东西(当然,如果它不在缓存存储中,它会首先查找实际的脚本文件)
  • 你为什么要把事情复杂化?如果 iframe 有效,为什么不使用它?对我来说,这听起来比做一些 ajax 调用更好(即使它适用于所有浏览器)
  • 我的部分想法是,只要我想预加载脚本,就需要我编写 iframe,但我并没有真正考虑过通过 JS 手动访问自制 iframe 是否可行.我以后可能会重温它。

标签: javascript caching dojo


【解决方案1】:

好吧,我刚刚找到了一种可能的方法;我目前没有时间彻底测试它,但它似乎在基本层面上工作。

<script src="myMasterScript.js" type="text/definitelynotjavascriptnopenosir"></script>

的工作方式很有趣。我可以看到该请求是针对脚本源发出的,如果它是有效的 JavaScript,它将执行。 (正如仅参考 JQuery CDN 所发现的那样)但是,浏览器的控制台基本上会抑制运行它所发生的任何类型的错误。即,“哦。也许我不应该运行那个”。

出于我自己的目的,我仍然需要根据 JQuery 场景来确定这是否仍会在某种程度上使页面混乱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    • 1970-01-01
    相关资源
    最近更新 更多