Home  >  Article  >  Web Front-end  >  静态资源(JS/CSS)存储在localStorage有什么缺点?为什么没有被广泛应用?

静态资源(JS/CSS)存储在localStorage有什么缺点?为什么没有被广泛应用?

WBOY
WBOYOriginal
2016-06-07 08:41:401629browse

移动端完全没有兼容问题,只要写版本更新判断就行。
PC端支持到IE8,不支持则请求。
目前一个新项目准备这样架构,但隐隐担忧有什么致命缺点,因为现在还没有被广泛应用。

回复内容:

谢邀。经常用,所以过来回答一下。

我的看法是:PC上用的价值不大,移动端单页面应用(也有叫webapp)值得尝试。

这里要首先提出一个关于静态资源管理和SEO(搜索引擎优化)方面的关联问题:如果要做SEO,那么CSS必然不能进行LS(localstorage)的本地缓存优化。这个原因很简单:

要进行SEO,必须直接输出完整HTML,因此必须让样式在头部以link标签加载。如果先输出HTML,后用js从本地缓存读取样式再插入,会出现严重的阻塞和闪烁问题,相信正常人是不会这么干的。

然后再更正一件事,就是取出localstorage的代码不一定要eval,eval很evil,一个eval函数很有可能影响整个js文件的压缩(出现eval之后不能对变量名进行替换),当然,我们可以通过一些hack避免这种压缩问题,不过我喜欢这样搞:
<code class="language-js"><span class="kd">var</span> <span class="nx">script</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">'script'</span><span class="p">);</span>
<span class="kd">var</span> <span class="nx">code</span> <span class="o">=</span> <span class="s1">'!function(){'</span> <span class="o">+</span> <span class="nx">getCodeFromLocalStorage</span><span class="p">()</span> <span class="o">+</span> <span class="s1">'\n}();'</span><span class="p">;</span>
<span class="nx">script</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">createTextNode</span><span class="p">(</span><span class="nx">code</span><span class="p">));</span>
<span class="nb">document</span><span class="p">.</span><span class="nx">head</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">script</span><span class="p">);</span>
</code>
先说说主要会面临的问题
1、执行速度,读取后使用eval或创建<script>标签的时间会比浏览器直接加载慢。<br>2、版本控制,需要自己写一套版本控制机制。<br>3、localStorage是公共资源,如果你的产品域名下有很多应用共享这份资源会有风险。<br>4、localStorage以页面的域名划分,而常见的静态资源都以资源本身的域名来缓存,意味着如果你的应用有多个等价域名,它们之间的localStorage不互通,会造成缓存多份浪费。<br>5、兼容性需要处理(不支持、隐私模式、写满、http/https、写的正确性等等)<br><br>=====================================<br><b>下面开始胡扯时间!<br>如果上述2、3、4、5你觉得都不是问题的话,1一定程度上是可以量化来评估的。<br><b>方案1:使用原始的缓存机制<br>做静态资源缓存率的收集得到比例:A%<br>完整请求所需时间:t0<br>304所需时间:t1<br>在使用浏览器内建机制的情况下代码执行所需时间:t2<br><b>那么使用浏览器内建机制所需的时间期望就是:T1 = t0 * (1-A%) + t1 * A% + t2<br>* 如果使用expires方式的HTTP缓存可以让t1为0<br><br><b>方案2:使用自定义的localStorage缓存机制<br>做localStorage缓存命中率测试得到比例:B%<br>在使用localStorage读取并执行的情况下代码执行所需时间:t3<br>使用localStorage的缓存命中情况比较复杂,可以稍微梳理一下:<br>1、B%概率命中localStorage,所需时间为t3<br>2、(1-B%)概率未命中localStorage,A%概率命中HTTP缓存,所需时间为t1 + t2<br>3、(1-B%)未命中localStorage,(1-A%)概率未命中HTTP缓存,所需时间为t0 + t2<br>其中2和3加起来就是(1-B%) * T1对吧<br><b>那么使用localStorage缓存机制所需的时间期望就是:T2 = t3 * B% + T1 * (1-B%)<br><br>* 上面忽略了localStorage缓存机制的加载器自己加载的时间、它的逻辑内部消耗和写入localStorage等时间。<br><br><b>不严谨,不过我觉得还是有参考价值的<br>从上面的两个时间上看,我们预期是T2 < T1<br>delta = T2 - T1 = t3 * B% - T1 * B% = (t3 - T1) * B%<br>因为B%肯定>=0,要让delta<0,只要t3比T1小就行了(B%会决定收益有多大)<br>其实说了这么半天,也就是楼上@小爝 所言<br><div class="highlight"><pre class="brush:php;toolbar:false"><code class="language-text">读localstorage再eval的速度比直接加载304缓存在当成js的执行速度要慢,而且不少……呵呵。。。 浏览器都帮你缓存好了,干嘛多此一举缓存到LS里?<br>耗费成本是多少?解决了多少问题?价值几何?维护是否方便?是否简单易用?有足够的开发时间么?<br><br>如果你真的很闲,并且要炫酷吊炸天,搞起吧 <span class="invisible">https://<span class="visible">mtjs.github.io/<span class="invisible"><i class="icon-external"><br><br>在快速迭代版本过程中,我们有时候只修改了某个js中的几行代码,却需要用户下载整个js文件,这在重视流量的移动端显得非常浪费,mt独创的增强更新算法实现了修改多少代码就只下载修改代码的功能,为用户和公司节省大量流量<br><br>localstorage里面存储的上个版本的js内容和版本号,当本次版本号和上次版本号不一致的时候,mt拼接出增量文件url去拉取增量文件,并和上个版本的js内容合并生成新版本内容。整个方案得核心在于增量文件得计算和合并<br><br>吊炸天 两年前看到这篇文章,有些启发:<span class="invisible">http://www.<span class="visible">mobify.com/blog/smartph<span class="invisible">one-localstorage-outperforms-browser-cache<span class="ellipsis"><i class="icon-external"><br><br>不过貌似现在这个网站有点问题,我贴几张文章中比较核心的数据比较图,两年前的文章了,不知道现在是否还适用:<br><br><noscript><img src="https://pic4.zhimg.com/d8672f62a69ed08093f2d0511ae5f477_b.jpg" data-raw style="max-width:90%" data-raw style="max-width:90%" class="origin_image zh-lightbox-thumb" width="576" data-original="https://pic4.zhimg.com/d8672f62a69ed08093f2d0511ae5f477_r.jpg" alt="静态资源(JS/CSS)存储在localStorage有什么缺点?为什么没有被广泛应用?" >20% trimmed mean results of native browser cache vs localStorage performance. Mean performance for localStorage is always faster than the browser's native cache and for iOS 5 & 6, dramatically so.<img src="//zhstatic.zhihu.com/assets/zhihu/ztext/whitedot.jpg" data-raw style="max-width:90%" data-raw style="max-width:90%" class="origin_image zh-lightbox-thumb lazy" width="576" data-original="https://pic4.zhimg.com/d8672f62a69ed08093f2d0511ae5f477_r.jpg" data-actualsrc="https://pic4.zhimg.com/d8672f62a69ed08093f2d0511ae5f477_b.jpg" alt="静态资源(JS/CSS)存储在localStorage有什么缺点?为什么没有被广泛应用?" >20% trimmed mean results of native browser cache vs localStorage performance. Mean performance for localStorage is always faster than the browser's native cache and for iOS 5 & 6, dramatically so.<br><noscript><img src="https://pic1.zhimg.com/6302146d6bdfde10d3f07e2a2d3f7ec0_b.jpg" data-raw style="max-width:90%" data-raw style="max-width:90%" class="origin_image zh-lightbox-thumb" width="576" data-original="https://pic1.zhimg.com/6302146d6bdfde10d3f07e2a2d3f7ec0_r.jpg" alt="静态资源(JS/CSS)存储在localStorage有什么缺点?为什么没有被广泛应用?" ><img src="//zhstatic.zhihu.com/assets/zhihu/ztext/whitedot.jpg" data-raw style="max-width:90%" data-raw style="max-width:90%" class="origin_image zh-lightbox-thumb lazy" width="576" data-original="https://pic1.zhimg.com/6302146d6bdfde10d3f07e2a2d3f7ec0_r.jpg" data-actualsrc="https://pic1.zhimg.com/6302146d6bdfde10d3f07e2a2d3f7ec0_b.jpg" alt="静态资源(JS/CSS)存储在localStorage有什么缺点?为什么没有被广泛应用?" ><noscript><img src="https://pic1.zhimg.com/ec659820b44451269920b9fc43555550_b.jpg" data-raw style="max-width:90%" data-raw style="max-width:90%" class="origin_image zh-lightbox-thumb" width="630" data-original="https://pic1.zhimg.com/ec659820b44451269920b9fc43555550_r.jpg" alt="静态资源(JS/CSS)存储在localStorage有什么缺点?为什么没有被广泛应用?" ><img src="//zhstatic.zhihu.com/assets/zhihu/ztext/whitedot.jpg" data-raw style="max-width:90%" data-raw style="max-width:90%" class="origin_image zh-lightbox-thumb lazy" width="630" data-original="https://pic1.zhimg.com/ec659820b44451269920b9fc43555550_r.jpg" data-actualsrc="https://pic1.zhimg.com/ec659820b44451269920b9fc43555550_b.jpg" alt="静态资源(JS/CSS)存储在localStorage有什么缺点?为什么没有被广泛应用?" ><br><br>stdDev 是标准方差的意思。<br><br><br>另外说到容量问题,之前貌似是5mb,不知道现在啥情况了- - 目前主流的网站的静态文件都使用了缓存,比如在 nginx 中只需要加几行配置就可以实现。只要浏览器不清空,某个固定链接的静态文件只需要加载一次。除非文件链接改变后,或者页面强制刷新,浏览器才会从服务器端重新读取静态文件。<br>从这个方面看,使用 localStorage 和传统缓存实际上是差不多的,并不能带来较明显的好处。另外还要考虑改造成本和兼容性等。<br><br>而一些移动站点(貌似包括腾讯首页)是使用 localStorage 来存储 js/css 静态文件,每次 js/css 升级时,只需要从服务器端获取一份包含静态文件变动信息的文件就好了。这样避免了静态文件升级一次,浏览器就要从服务器完整地加载一份新版本的静态文件。<br>如此采取 localStorage,可以为移动用户节省一些流量。<br><br>但是后面的这种方式有一定成本和门槛。<br><br>以上抛个砖。 是时候做广告了,基于localstorage的js存储更新解决方案,可以做到字符级别的资源增量更新:mtjs/mt · GitHub<i class="icon-external"> 偶凑热闹的,碎碎念几句。<br><br>首先不是移动端完全没有兼容问题,问题还是有的。<br>1、Safari 处于隐私模式时,LS set 数据会抛异常<br>2、不同移动端浏览器,对单次set数据大小是有区别的,印象(懒得换机器查PPT了)中是 3-5M 不等<br>3、不同移动端浏览器对LS总容量大小是有区别的,印象(懒得换机器查PPT了)中是 5-10M 不等(这里指的是单子域限制)<br><br>其次,IE 上可以封装userData作为兼容。<br><br>最后,关键不在于LS,而在LS的控制是个问题。<br>如:<br>1、一个项目,LS 任何人可CURD。其中值被其他功能修改以及删除很有可能,导致难查找的问题。<br>2、多人写LS,可能会写满,LS 总量控制如何监控,不超限<br>3、LS 过期问题,都写LS,过期机制是怎么样的,过期了优先删除哪些腾出空间<br>4、都没过期的情况下,有新数据进来,删除哪些腾出空间<br>5、如有LS控制器封装控制以上问题,但第三方代码(如接入的广告js)不使用控制器直接写LS如何处理 ls叫做本地存储,不叫本地缓存loadcache,还是有他一定道理的。证明他更多的作用在于存储数据,而不是缓存资源!HTML5针对缓存已经有了一套方案。其次,把js,CSS代码存在ls,意义不大。把其中的数值存在ls,意义会更大些。因为ls在用户浏览器中,有些交互体验的个性数值,你可以存在ls中。或者APP形式的页面更有意义了。把东西用得恰到好处,叫充分利用资源。避免弄巧成拙。 localStorage是一个js对象,而浏览器的缓存技术是基于浏览器的。<br>你说是js快还是浏览器快。 </script>
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn