Chrome 开发者工具有 Application 这么一个面板,主要作用是检查 web 应用加载的所有资源。

  • Application
    • Manifest
      • 指 PWA 所需的 manifest.json 文件,其作用是用来告诉浏览器如何在用户的桌面上”安装”这个 app,及安装后该展示的信息。
    • Service Workers
      • 独立于当前页面的一段运行在浏览器后台进程里的脚本,由于运行在 worker 上下文,因此它不能访问 DOM,不过可以做一些简单的辅助性逻辑处理和离线缓存等。
      • 兼容性,除了 IE 都还行。
    • Stoarge:
      • 用于展示当前浏览器存储信息的一个总览清除各种缓存。
  • Storage
    • Cookies
    • Local Storage
    • Session Storage
    • IndexedDB
    • Web SQL(该标准早已废弃,被 IndexedDB 干趴下)
    • Trust tokens
  • Cache
    • Cache Storage:Service Workers 缓存的资源库
    • Application Cache(已被 Service Workers 干趴下)
  • BackGround Services(头一回见,和 sw 相关)、
  • Frames

image.png

Manifest

在前端,有多个 manifest 相关的知识

Application 面板中的是指 PWA 的 manifest.json 文件,其作用是用来告诉浏览器如何在用户的桌面上”安装”这个 app,及安装后该展示的信息。

所谓的安装,其实就是创建一个快捷方式在桌面。 可以像打开桌面应用一样,打开该网页。浏览器的样式有几种预设。详细看 PWA manifest MDN

下面我们以语雀文档为例子,来感受一下。打开语雀的控制台,可以看到manifest.json
image.png

  1. {
  2. "name": "语雀快捷入口",
  3. "short_name": "语雀快捷入口",
  4. "start_url": "https://www.yuque.com",
  5. "display": "standalone",
  6. "background_color": "#ffffff",
  7. "theme_color": "#05192D",
  8. "mode": "fullscreen",
  9. "scope": "/",
  10. "description": "十万阿里人都在用的笔记与文档知识库",
  11. "icons": [{
  12. "src": "https://gw.alipayobjects.com/mdn/prod_resource/afts/img/A*D91iS5-sa6cAAAAAAAAAAAAAARQnAQ",
  13. "sizes": "192x192",
  14. "type": "image/png",
  15. "purpose": "maskable"
  16. }, {
  17. "src": "https://gw.alipayobjects.com/mdn/prod_resource/afts/img/A*bghDSa5jhjMAAAAAAAAAAAAAARQnAQ",
  18. "sizes": "512x512",
  19. "type": "image/png",
  20. "purpose": "maskable"
  21. }, {
  22. "src": "https://gw.alipayobjects.com/mdn/prod_resource/afts/img/A*Z_fRQ5iLzX8AAAAAAAAAAAAAARQnAQ",
  23. "sizes": "192x192",
  24. "type": "image/png"
  25. }, {
  26. "src": "https://gw.alipayobjects.com/mdn/prod_resource/afts/img/A*vsIhQ6JRAmIAAAAAAAAAAAAAARQnAQ",
  27. "sizes": "512x512",
  28. "type": "image/png"
  29. }]
  30. }

我们可以在浏览器的 URL 输入框看到,有这个语雀下载的标志。
image.png
大家自行尝试,会发现它在你的本地桌面安装了一个快捷方式。并且下载标志,就变成了打开的标志。
image.png
image.png

Storage

cookie

简介

由服务器通过设置响应头 Set-Cookie 首部投放并存储到客户端的 HTTP cookies,即我们在 application 面板看到的 cookies。
对于 cookie 的增删查改,以及设置 cookie 的属性,我们都可以直接通过面板操作。

  • cookie 的存储是以域名形式进行区分的,不同的域下存储的 cookie 是独立的。
  • 一个域名下存放的 cookie 的个数是有限制的,不同的浏览器存放的个数不一样
    • chrome 是 150 个
    • firefox 是 似乎无限个数
      • 我测试了一万个,都可以。
    • Edge 是 163 个

image.png

增删查改

我们来说说通过 JS 如何操作 cookie 的增删查改,设置属性。

添加 cookie 以键值对的形式添加。
属性的添加是可选的,顺序不限,且不分大小写。

httpOnly 是让后台 Set-Cookie 的时候设置的。JS 不能操作。 domain 默认 所在的域 path 默认 / expires/Max-Age 默认 Session

  1. // document.cookie = 'name=value;<domain>;<path>;<expires/max-age>;<secure>;<sameSite>'
  2. document.cookie = 'konsoue=123;domain=127.0.0.1'; // 设置了 domain,浏览器会判断是否同域,相同才设置 cookie
  3. document.cookie = 'konsoue=123;secure;';
  4. document.cookie = 'konosue=123;sameSite=lax';

只要 name 相同,value 不同,就会修改对应的 cookie

  1. document.cookie = 'konsoue=123a;secure;';

将要删除的 cookie 的过期时间设置成已过去的时间,使用 GMT 时间

  1. document.cookie = 'konosue=13a;expires=' + new Date().toGMTString();

只能通过 document.cookie 获取全部非 httpOnly 的 cookie,需要自行转换格式

  1. function getCookies(cookieString) {
  2. const cookieArray = cookieString.split(';');
  3. const cookies = {};
  4. cookieArray.forEach((cookie) => {
  5. const [key, value] = cookie.split('=');
  6. cookies[key.trim()] = value;
  7. })
  8. return cookies;
  9. }

localStoarge

简介

每个域名下,浏览器都内置Storage构造函数,这个构造函数创建了localStoragesessionStorage对象。

  • localStorage中的键值对总是以字符串的形式存储
  • 在浏览器关闭,然后重新打开后数据仍然存在(永久保存)
  • 存储大小
    • Chrome:5 M
    • firefox 是 5M
    • Edge 是 5M
    • IE11 是 5M

image.png

增删查改

由于存储形式是以键值对的字符串形式,所以我们存储值的时候,可以先考虑使用JSON.stringify(value)转为字符串。

    1. window.localStorage.setItem(name, value);
  1. 删 ```javascript // 删除单项 window.localStorage.removeItem(name, value);

// 清空所有 window.localStorage.clear()

  1. 3.
  2. ```javascript
  3. window.localStorage.getItem(name);
    1. // 改也是用 setItem
    2. window.localStorage.setItem(name, newValue);

    存储大小测试

    我们 HTML 页面使用的是 utf-8 编码,我们的 JS 代码自然也使用这种编码。
    utf-8 的字符所占内存有的长,有的短。其中U+0000U+007FASCII是兼容的,这个范围的字符所占内存是一个字节。我们所用的英文字母就是在这个范围内。
    我们用英文字母来测试 localStorage的大小,此刻存入 localStorage 的字符串,每个字符所占大小 1 byte(1 B)

    总所周知:1 M = 1024 KB= 1024 x 1024 B (byte) = 1024 x 1024 字符

所以我们试着用这样的程序,来测试浏览器的localStorage究竟内存多大。sessionStorage同理

  • chrome 是 5 M
  • firefox 是 5M
  • Edge 是 5M
  • IE11 是 5M

    1. (function () {
    2. if (!window.localStorage) {
    3. console.log('当前浏览器不支持localStorage!')
    4. }
    5. const oneM = 1024 * 1024;
    6. let test = 'abcdefgh'; // 用于测试的字符串长度
    7. // 利用递归,将测试字符串内存增加到 1M
    8. let add = function (num) {
    9. num += num;
    10. if (num.length === oneM) {
    11. test = num;
    12. return;
    13. }
    14. add(num);
    15. }
    16. add(test);
    17. // 开始测试
    18. let sum = test;
    19. let show = setInterval(function () {
    20. sum += test;
    21. try {
    22. window.localStorage.removeItem('test');
    23. window.localStorage.setItem('test', sum);
    24. console.log(sum.length / oneM)
    25. } catch (e) {
    26. console.log("最大容量" + sum.length / oneM)
    27. clearInterval(show);
    28. }
    29. }, 0.1)
    30. })()

    sessionStorage

    简介

  • sessionStorage中的键值对总是以字符串的形式存储

  • sessionStorage在页面会话结束时会被清除。
  • 存储大小
    • Chrome:5 M
    • firefox 是 5M
    • Edge 是 5M
    • IE11 是 5M

image.png

增删查改

由于存储形式是以键值对的字符串形式,所以我们存储值的时候,可以先考虑使用JSON.stringify(value)转为字符串。

    1. window.sessionStorage.setItem(name, value);
  1. 删 ```javascript // 删除单项 window.sessionStorage.removeItem(name, value);

// 清空所有 window.sessionStorage.clear()

  1. 3.
  2. ```javascript
  3. window.sessionStorage.getItem(name);
    1. // 改也是用 setItem
    2. window.sessionStorage.setItem(name, newValue);

    indexedDB

    简介

    从上面我们知道了,cookielocalStoragesessionStorage 都是存储字符串的,且有限制大小
    那如果有业务需要存储二进制文件在本地怎么做,而且二进制文件一般都比较大。
    于是乎,[indexedDB](https://developer.mozilla.org/zh-CN/docs/Web/API/IndexedDB_API)营运而生。

    顺带提一句,Web SQL 也是用来解决这一问题的。但由于它借鉴于 SQL,是关系型的数据库,学习需要一定成本。 W3C 已经废弃这个草案,有的浏览器支持了,比如 Chrome,有的浏览器不支持,比如 IE、Firefox。

注意:IndexedDB API 是强大的,但对于简单的情况可能看起来太复杂。 如果你更喜欢一个简单的 API,请尝试 localForagedexie.jsPouchDBidbidb-keyvalJsStore 或者 lovefield 之类的库,这些库使 IndexedDB 对开发者来说更加友好。

Service Workers

参考资料

《Chrome 开发工具之 Application》
《Service Worker离线缓存实践》