localStorage 做性能优化

发布于 2021-12-31 13:05:08 字数 2949 浏览 1104 评论 0

localStorage 作为 cookie 的替代品,可以对前端性能优化做一些文章。

缓存普通数据

由于不会被 http 请求带上,localStorage 本事对性能就算优化了一层

缓存接口

这个业内使用的也比较多,对那些请求量比较大、而且改动不算频繁的接口,可以通过localStorage缓存到本地

大体思路:

  • 第一次请求接口时,正常请求并存入localStorage,同时存入当前时间戳
  • 再次使用该接口时,对比当前时间与存入的时间戳,如果未到存储时间的话,直接从缓存中取数据
  • 如果时间超时,再次正常请求接口,并更新时间、接口内容到缓存

下面是我封装了一个 getLocalOrRemote.js

/** [getLocalOrRemote 获取本地或者远程数据]
 * @param  {[type]}  localstorage key      [description]
 * @param  {[type]}   time     [时间戳,以秒为单位]
 * @param  {[type]}   url      [远程获取的url,要全]
 * @param  {Function} callback [回调的方法]
 * @return {[type]}            [description]
 */
function getLocalOrRemote(key, time, url, callback) {
  var nowTimes = new Date().valueOf();
  var localObj = {},
    realObj = {},
    localTimes;
  // 如果存有本地缓存的话
  if (localstorage[key]) {
    localObj = JSON.parse(localstorage[key]);
    localTimes = localObj.lcTime;
    // 如果没过期的话,取本地数据
    if ((nowTimes - localTimes) / 1000 < time) {
      getDataFromLocal();
    } else {
      getDataFromRemote();
    }
  } else {
    getDataFromRemote();
  }
  function getDataFromRemote() {
    $.ajax({
      type: 'GET',
      url: url,
      dataType: 'jsonp',
      success: function (data) {
        nowTimes = new Date().valueOf();
        var localObjNew = {};
        localObjNew.lcData = data;
        localObjNew.lcTime = nowTimes;
        localstorage[key] = JSON.stringify(localObjNew);
        callback(data);
      },
    });
  }
  function getDataFromLocal() {
    var data = JSON.parse(localstorage[key]);
    realObj = data.lcData;
    callback(realObj);
  }
}
// 使用 demovar url = 'xxx';
getLocalOrRemote('aiJia', 300, url, function (data) {
  // 拿到 data 执行业务逻辑……
});

缓存 css、js 文件

类似于缓存接口,可以在第一次请求到 css、js 文件之后,缓存到 localStorage 里面,下次如果命中缓存的话,通过 appendChild 的方法,塞到界面的 head 中。

这种缓存意义比较小,因为 css、js 文件,一般非首次请求的话,就会命中缓存,最少也是协商缓存,即 http 为 304 的请求。

如果使用 cdn 的话,会命中强缓存,压根不用执行 JS 文件去判断是否到期,直接通过浏览器的内部缓存机制,直接从缓存里面拿数据,省事的很。

缓存图片

localStorage 只能缓存字符串,但是可以通过与 canvas 配合,将图片缓存起来

// 图片加载完成后执行,通过 canvas 将图片转为 base64,存入缓存
a.addEventListener(
  'load',
  function () {
    var imgCanvas = document.createElement('canvas');
    imgContext = imgCanvas.getContext('2d');
    // 确保canvas尺寸和图片一致
    imgCanvas.width = a.width;
    imgCanvas.height = a.height;
    // 在canvas中绘制图片
    imgContext.drawImage(a, 0, 0, a.width, a.height);
    // 将图片保存为Data URI
    gsFiles.a = imgCanvas.toDataURL('bj.png');
    gsFiles.date = todaysDate;
    // 将JSON保存到本地存储中
    try {
      localStorage.setItem('gsFiles', JSON.stringify(gsFiles));
    } catch (e) {
      console.log('Storage failed: ' + e);
    }
  },
  false
);
// 取到缓存里面的数据,还原到图片地址上
// Use image from localStoragea.setAttribute("src", gsFiles.a);

总结

localStorage 可以缓存 N 多东西,但是在开发、管理缓存上,也需要多花一些精力,具体还需要看业务需求。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
820 人气
更多

推荐作者

烙印

文章 0 评论 0

singlesman

文章 0 评论 0

独孤求败

文章 0 评论 0

晨钟暮鼓

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文