预加载脚本没有执行

Mar*_*iry 12 javascript browser performance requirejs

问题

为了提高页面性能,我需要预加载我需要在底页运行的脚本.

我想控制脚本何时被解析,编译和执行.

我必须避免脚本标记,因为它是常见渲染引擎(geeko等)的阻止程序.

我无法使用defer属性加载它,因为我需要控制脚本执行的时间.此外,异步属性不是可能的.

样品:

<html><head>
//preload scripts ie: a.js  without use the script
</head><body> ..... all my nice html here
//execute here a.js
</body></html>
Run Code Online (Sandbox Code Playgroud)

这允许我最大化我的页面的渲染性能,因为浏览器将开始下载脚本内容,并且它将同时呈现页面并行.最后,我可以添加脚本标记,以便浏览器解析,编译和执行代码.

我能做到的唯一方法是使用隐藏的图像标记.(这是斯托扬的简化版)

 <html><head>
 <img src="a.js" style=display:none;>
</head><body> ..... all my nice html here
 <script src="a.js">  
</body></html>
Run Code Online (Sandbox Code Playgroud)

我没有发现使用这种技术的任何问题,但有没有人知道更好的方法来做到这一点?有没有meta预取?

附加信息

我正在使用requirejs,所以我试图预加载模块代码而不执行它,因为这段代码依赖于DOM元素.

Jui*_*ter 6

使用类似的技术,您可以使用imgInternet Explorer 预加载脚本和样式表,并object为每个其他浏览器预加载标记.

var isMSIE = /*@cc_on!@*/false;

var resources = ['a.js', 'b.js', 'c.css'];

for (var i=0; i<resources.length; i++){
  if (isMSIE){
    new Image().src = resources[i];
  } else {
    var o = document.createElement('object');
    o.data = resources[i];
    document.body.appendChild(o);
  }
}
Run Code Online (Sandbox Code Playgroud)

有一篇博客文章描述了这种技术并概述了警告:预加载CSS/JavaScript而不执行.

但是,为什么不想像其他答案中建议的那样只使用动态添加的脚本,这可能会带来更清晰的解决方案和更多的控制.


Bra*_*rks 5

您可以使用prefetch链接标签的属性来预加载任何资源,包括 javascript。在撰写本文时(2016 年 8 月 10 日),Safari 不支持它,但几乎在其他任何地方都支持它:

<link rel="prefetch" href="(url)">

有关此处支持的更多信息:http : //caniuse.com/#search=prefetch

请注意,IE 9,10 未列在caniuse矩阵中,因为 Microsoft 已停止对它们的支持。

此处提供更多信息以及更多预加载选项,例如预渲染等


txo*_*elu 0

您应该查看以下链接:

http://calendar.perfplanet.com/2011/lazy-evaluation-of-commonjs-modules/

http://tomdale.net/2012/01/amd-is-not-the-answer/

以及 ember.js 如何使用名为 minispade 的工具和 ruby​​ 预处理来加快加载、解析和运行 javascript 模块的过程。