Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果脚本已经在浏览器缓存中,浏览器还会延迟加载脚本吗?_Javascript_Html_Caching_Lazy Loading - Fatal编程技术网

Javascript 如果脚本已经在浏览器缓存中,浏览器还会延迟加载脚本吗?

Javascript 如果脚本已经在浏览器缓存中,浏览器还会延迟加载脚本吗?,javascript,html,caching,lazy-loading,Javascript,Html,Caching,Lazy Loading,我习惯于延迟加载几个脚本。现在我正在考虑使用一个站点范围的include,它告诉lazyload.js加载我站点上使用的所有脚本。然后我可以让浏览器决定这些脚本是否已经在缓存中(并在必要时加载它们) 这使我不必在js中测试是否已经加载了某些东西(我愿意接受额外请求的开销)它是这样工作的,还是我忽略了什么?我看到它按照你解释的方式工作,但我看到它不工作。然而,也很少出现双重负载,这将使开销更大 简言之:视情况而定 除非明确指定,否则如果脚本存在于缓存中,浏览器很可能不会请求脚本 然而,请求脚本与否

我习惯于延迟加载几个脚本。现在我正在考虑使用一个站点范围的include,它告诉lazyload.js加载我站点上使用的所有脚本。然后我可以让浏览器决定这些脚本是否已经在缓存中(并在必要时加载它们)


这使我不必在js中测试是否已经加载了某些东西(我愿意接受额外请求的开销)它是这样工作的,还是我忽略了什么?

我看到它按照你解释的方式工作,但我看到它不工作。然而,也很少出现双重负载,这将使开销更大

简言之:视情况而定

除非明确指定,否则如果脚本存在于缓存中,浏览器很可能不会请求脚本


然而,请求脚本与否完全取决于浏览器的决定权。

我并不是基于硬数据,但我认为可以肯定地说,目前使用的浏览器中,大约75~80%的浏览器在缓存脚本方面做得相当好。顺便说一句,有一些方法可以强制浏览器不要使用缓存的脚本,但是如果这不是你想要的,那也没关系

是的,事实上,大多数浏览器都会引用cahced脚本,而不会一次又一次地请求文件。当然,它只会以匿名/匿名模式(又称色情模式)浏览网页。
这会导致浏览器在关闭浏览器窗口时清除缓存。
你为什么会在乎?首先,我发现这在开发JS脚本时非常有用。

硬刷新类似于ctrl+c。我们都养成了按这两个键4~5次的习惯,只是为了确定一下。我注意到,我的同事们也用ctrl+F5做了同样的事情…

延迟加载并不总是为了保存带宽,它还与CPU/电池的保存有很大关系。如果您延迟加载某些内容,无论是否在浏览器缓存中,您都是在需要时加载它,因此不会浪费执行从未使用过的代码。如果您提前加载所有内容,那么无论是否使用了80%的模块,每次访问一个页面,CPU和电池的成本都是固定的


为了节省移动设备的电池寿命,最好采用适当的延迟加载方法。但是对于台式机来说,最好是预先加载所有内容,因为预加载成本相对较小。

缓存控制如何

<meta http-equiv="cache-control" content="no-cache">

也许这对你来说是正确的。 查看更多信息。

不,它不起作用

如果您让lazyload加载脚本,那么它将加载脚本。 Lazyload无法访问浏览器缓存,无法确定缓存中是否有某些资源。 另外,脚本加载顺序很重要,所以若并没有加载以前的javascript文件,浏览器就不能使用javascript文件。浏览器可以确定javascript文件是否相互依赖

如果您正考虑通过lazyload创建“加载所有”功能:
最好只创建一个JavaScript文件并将其加载到页面末尾。

谢谢你的回答,但我不明白你的最后一句话。你到底是什么意思?说真的,如果你想得到赏金,至少给我一个半体面的回答。如果你的回答是这样的,我不会给你赏金。我不在乎赏金。第二,当我说它将加倍加载时,缓存版本将加载到lazyload之上。它不会影响javascript的工作,但有时它会根据时间的长短而减慢速度。抱歉,如果我的回答有点太苛刻,只是有时候当我设置悬赏,但还没有任何答案时,人们试图通过给出一个非常简单的答案来获得悬赏,而不回答或解释它。但你的意思是它甚至可能会让事情变慢。。太糟糕了。你的问题引起了我的注意:)@SamuelOk,谢谢你的回答。所以我想这并不像我想象的那么简单。基本上答案是,;这要视情况而定。好吧,但为什么“没有缓存”?因为我希望浏览器在可能的情况下引用缓存的版本。它不应该是“公共的”还是“私人的”?“公共”不是默认值吗?是的,公共是默认值。但是你知道浏览器会自动获取缓存版本。为什么W3傻瓜链接?你确定大多数浏览器会在延迟加载脚本之前检查缓存吗?因为我也收到了一个来自某人的回答,他说无论缓存如何,所有东西都会被加载,我现在真的不知道该相信什么。@Samuel:我已经查看了lazyload.js的来源。它真正做的就是创建一个新的DOM元素(脚本标记,检查github上的第230行),并将其添加到DOM树中。产生的行为与标记开始时的行为相同:浏览器将检查该域的缓存中是否有脚本,如果有,则不会再次请求该文件,而是加载缓存的版本。如果没有,它将请求该文件。我已经快速查看了其他答案,但我不太清楚当你说你有一个答案说它将始终执行请求时,你指的是哪一个。我指的是Dmitry的答案(在底部)。但你的回答正好解释了我不确定的地方。非常感谢。lazyload没有访问缓存的权限,这是事实,但lazyloadjs实际上并没有加载您的脚本。它创建了一个新的DOM节点,并将其添加到当前的DOM树中。JS与DOM无关,因此一旦设置了src属性,就取决于浏览器如何请求脚本。大多数现代浏览器都会首先引用缓存。没错,浏览器会检查请求的资源(js文件)是否在缓存中。但浏览器将从服务器加载缓存中不存在的资源。而且你不能告诉浏览器:“加载文件i