持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第19天,点击查看活动详情
前言
今天,分享chrome 开发者工具的Application面板。它将作为本系列的最后一个面板出现。就个人而言,这个面板的使用频率不低于console等面板。
Manifest
在前端,有多个 manifest 相关的知识,比如 html5 manifest(已废弃)、PWA(Progressive Web App)的 manifest、Webpack 的 manifest(模块资源清单)。
Applicaation 面板中的是指 PWA 所需的 manifest.json 文件,其作用是用来告诉浏览器如何在用户的桌面上"安装"这个 app,及安装后该展示的信息。更多关于PWA,可移步这块:
在 Application 面板中,主要是展示其信息,不具有操作性质.展示图如下(下面是腾讯会议 PWA 示例):
{
"short_name": "React App",
"name": "Create React App Sample",
"icons": [
{
"src": "favicon.ico",
"sizes": "64x64 32x32 24x24 16x16",
"type": "image/x-icon"
},
{
"src": "logo128.png",
"type": "image/png",
"sizes": "128x128"
},
{
"src": "logo192.png",
"type": "image/png",
"sizes": "192x192"
},
{
"src": "logo512.png",
"type": "image/png",
"sizes": "512x512"
}
],
"start_url": ".",
"display": "standalone",
"theme_color": "#000000",
"background_color": "#ffffff"
}
Service Workers & Cache Storage & Background Services
Service Worker
是浏览器在后台独立于网页运行的脚本,它们已包括如推送通知和后台同步等功能,支持离线应用,每24小时都会更新本地的离线脚本。
- 它是一种JavaScript Worker,无法直接访问 DOM。 Service Worker 通过响应 postMessage 接口发送的消息来与其控制的页面通信,页面可在必要时对 DOM 执行操作。
- Service Worker 是一种可编程网络代理,让您能够控制页面所发送网络请求的处理方式。
- Service Worker 在不用时会被中止,并在下次有需要时重启
- Service Worker 可以访问 IndexedDB。
- Service Worker 广泛地利用了 promise.
可以查看已安装的推送通知、后台同步和离线体验。
- Offline 将 DevTools 切换至离线模式。它等同于 Network 窗格中的离线模式.
- Update on reload 强制服务工作线程在每次页面加载时更新。
- Bypass for network 绕过服务工作线程并强制浏览器转至网络寻找请求的资源。
- Update 对指定的服务工作线程执行一次性更新。
- Push 在没有负载的情况下模拟推送通知。
- Sync 模拟后台同步事件。
- Unregister 注销指定的服务工作线程。
- Status 服务工作线程的状态。
Cache Storage
sw 缓存的资源列表。这块介绍比较牛逼
Background Services
Background Fetch 允许开发人员离开当前的页面,进行加载和操作大文件或文件列表。这样可以加大上传和下载的成功率,并允许sevice worker 缓存结果。
Background Sync 可延迟用户行为,直到用户网络连接稳定。常用语聊天消息,电子邮件,文档更新等功能中。提升性能和体验。
Notifications是在Web页面之外,以弹出桌面对话框的形式通知用户发生了某事件。
Push Messaging使应用或扩展程序能够接收通过 Google 云消息服务发送的消息数据。
Periodic background sync 定期在后台同步数据,这样当用户打开你安装的 PWA 时,他们总是有最新的数据。
Payment Handler 是一种开放的、基于标准的接受付款的方式。Payment Handler API通过启用基于 Web 的支付应用程序来直接在支付请求体验中促进支付,从而扩展了支付请求的范围。
Clear storage
该面板主要用于展示当前浏览器存储信息的一个总览清除各种缓存(可自行勾选所需清理的内容),面板如下:
图中可以看到,可清理的有:
- 卸载 services workers
- Local storage 和 Session storage
- IndexedDB 数据
- Web SQL 数据
- Cookies
- Cache storage
Local Storage & Seesion Storage
他们两都属于 Web Storage,且兼容比较好。两者区别是:localStorage 的生命周期是需要人为干涉的,sessionStorage 的生命周期是一次会话窗口。
Local Storage 面板和 Seesion Storage 面板显示的是浏览器的 localStorage/sessionStorage 键值对(KVP)数据(该数据大小在 2~5MB 之间,各浏览器,各平台不同),在这个面板中。你可以执行查看值、双击空行新增 KVP、双击 KVP 对齐进行修改、删除 KVP 等操作。
IndexedDB
IndexDB 是浏览器端提供的本地存储键值对的数据库,建立在事务数据库模型上(所做的操作都发生在创建的事务对象上下文),其 api 大多都是异步的。
在 IndexedDB 面板,可以查看、删除 IndexedDB 内的数据(注意,不可以修改)。
const data = [
{id: 1, name: "Tom", age: "18"},
{id: 2, name: "Tommy", age: "16"},
];
// 打开数据库,两个参数(数据库名字,版本号),如果数据库不存在则创建一个新的库
let request = window.indexedDB.open('myDatabase', '1')
// 数据库操作过程中出错,则错误回调被触发
request.onerror = (event) => {
console.log(event)
}
// 数据库操作一切正常,所有操作后触发
request.onsuccess = (event) => {
let db = event.target.result
// 数据读取
let usersObjectStore = db.transaction('users').objectStore('users')
let userRequest = usersObjectStore.get(1)
userRequest.onsuccess = function (event) {
console.log(event.target.result)
}
}
// 创建一个新的数据库或者修改数据库版本号时触发
request.onupgradeneeded = (event) => {
let db = event.target.result
// 创建对象仓库用来存储数据,把id作为keyPath,keyPath必须保证不重复,相当于数据库的主键
let objectStore = db.createObjectStore('users', { keyPath: 'id'})
// 建立索引,name和age可能重复,因此unique设置为false
objectStore.createIndex('name', 'name', {unique: false})
objectStore.createIndex('age', 'age', {unique: false})
// 确保在插入数据前对象仓库已经建立
objectStore.transaction.oncomplete = () => {
// 将数据保存到数据仓库
let usersObjectStore = db.transaction('users', 'readwrite').objectStore('users')
data.forEach(data => {
usersObjectStore.add(data)
})
}
}
应用场景:
-
不需要网络连接的纯离线应用,比如Todolist这类的用来记录待办任务类型的应用
-
需要存储大量数据的应用,比如图书管理系统这类的需要存储大量数据的应用,完全可以将图书信息存储在IndexedDB中\
-
配和service worker构建pwa应用,用来缓存网络请求
Cookies
-
name键名 -
value值 -
Domain和Path标识定义了Cookie的作用域。Domain标识指定了哪些主机可以接受Cookie。Path标识指定了主机下的哪些路径可以接受Cookie -
Expires / Max-Age.Cookie 的过期时间或最长周期。对于会话 cookie,这一领域始终是Session(会话)。 -
SizeCookie 的大小,以字节为单位。 -
HttpOnly如果存在,则指示应仅通过 HTTP 使用 cookie,并且不允许 JavaScript 修改. -
SameSite-
SameSite的作用为了防止跨站请求伪造(CSRF)攻击和保护用户隐私 -
Chrome的
SameSite默认值是Lax, 而Safari的默认值是Strict -
SameSite 的值是 Strict,那么浏览器会完全禁止第三方 Cookie。
-
Lax 相对宽松一点。在跨站点的情况下,从第三方站点的链接打开和从第三方站点提交 Get 方式的表单这两种方式都会携带 Cookie。但如果在第三方站点中使用 Post 方法,或者通过 img、iframe 等标签加载的 URL,这些场景都不会携带 Cookie。
-
使用None的话,在任何情况下都会发送 Cookie 数据。 -
跨站一定跨域, 跨域不一定跨站
-
只有顶级域名+二级域名不同, 就属于跨站
- 同站:
www.zhihu.com和zhihu.com, 顶级域名是.com, 二级域名是.zhihu, 这里属于同站, 但是跨域了 - 跨站:
baidu.com和jd.com,a.github.io和b.github.io,.github.io是顶级域名
- 同站:
-
氛围到这了,提个问题不过分吧。 问题:
- 访问juejin.cn页面时, 有一个cookie: juejin_track_id 的domain为.juejin.cn, path: /, 请问请求
api.juejin.cn/common/config时会带上吗? - 跨域请求时, 怎么带上cookie?
Frames
该面板显示了该网站所有内容资源。
最后
公布答案:
-
domain 和 path
domain是域名,path是路径,两者加起来就构成了 URL,domain和path一起来限制 cookie 能被哪些 URL 访问。
一句话概括:某cookie的 domain为“baidu.com”, path为“/ ”,若请求的URL(URL 可以是js/html/img/css资源请求,但不包括 XHR 请求)的域名是“baidu.com”或其子域如“api.baidu.com”、“dev.api.baidu.com”,且 URL 的路径是“/ ”或子路径“/home”、“/home/login”,则浏览器会将此 cookie 添加到该请求的 cookie 头部中。
所以domain和path2个选项共同决定了cookie何时被浏览器自动添加到请求头部中发送出去。如果没有设置这两个选项,则会使用默认值。domain的默认值为设置该cookie的网页所在的域名,path默认值为设置该cookie的网页所在的目录。
发生跨域xhr请求时,即使请求URL的域名和路径都满足 cookie 的 domain 和 path,默认情况下cookie也不会自动被添加到请求头部中。
- 在跨域请求中,
client端必须手动设置xhr.withCredentials=true,且server端也必须允许request能携带认证信息(即response header中包含Access-Control-Allow-Credentials:true),这样浏览器才会自动将cookie加在request header中。