pwa h5快应用缓存

1https://segmentfault.com/a/1190000019414253 // 创建一个pwa 应用
1.pwa 前后端分离后 manifest的应用(随着 前后端分离缓存 html 和css 使用ajax局部刷新这个问题得到了很好的解决)

简而言之,我crossorigin="use-credentials"在本节中添加了<link rel="manifest">元素<head>

参考:https://www.w3.org/TR/2020/WD-appmanifest-20201019/#name-member
参考:https://www.jianshu.com/p/916a01670a23
参考 https://blog.csdn.net/hellodake/article/details/84024148
参考:https://developer.mozilla.org/zh-CN/docs/Web/Manifest
参考:https://segmentfault.com/a/1190000012353473

{
 
    // 必须的字段3个
 
    "name": "MyExtension", // 扩展名称
 
    "version": "1.0", // 版本。由1到4个整数构成。多个整数间用"."隔开
 
    "manifest_version": 2, // manifest文件版本号。Chrome18开始必须为2
 
    // 建议提供的字段3个
 
    "description": "",   // 描述。132个字符以内
 
    "icons": {
 
       "16": "image/icon-16.png",
 
       "48": "image/icon-48.png",
 
       "128": "image/icon-128.png"
 
    }, //扩展图标。推荐大小16,48,128
 
    "default_locale": "en", // 国际化
 
    // 以下字段多选一,或者都不提供
 
    "browser_action": {
 
       "default_icon": "image/icon-128.png",
 
        "default_title": "My Test",
 
       "default_popup": "html/browser.html"
 
    }, //地址栏右侧图标管理。含图标及弹出页面的设置等
 
    "page_action": {
 
        "default_icon": "image/icon-48.png",
 
        "default_title": "My Test",
 
        "default_popup": "html/page.html"
 
    }, //地址栏最后附加图标。含图标及行为等
 
    "theme": {}, // 主题,用于更改整个浏览器的外观
 
    "app": {}, // 指定扩展需要跳转到的URL
 
    // 根据需要提供
 
    "background": {
 
       "scripts": [
 
           "lib/jquery-3.3.1.min.js",
 
           "js/background.js"
 
       ] ,
 
        "page":"html/background.html"
 
    }, // 指定扩展进程的background运行环境
 
    "chrome_url_overrides": {
 
       "pageToOverride": "html/overrides.html"
 
    }, //替换页面。详见注释1
 
    "content_scripts": [{
 
      "matches": ["https://www.baidu.com/*"],
 
      "css": ["css/mystyles.css"],
 
      "js": ["lib/jquery-3.3.1.min.js", "js/content.js"]
 
    }], // 指定在web页面运行的脚本。详见注释2
 
    "content_security_policy": "",  // 安全策略
 
    "file_browser_handlers": [],   
 
    "homepage_url": "http://xxx", // 扩展的官方主页
 
    "incognito": "spanning", //"split"。详见注释3
 
    "intents": {}, // 用户操作意图描述
 
    "key": "", // 扩展唯一标识。不需要人为指定
 
    "minimum_chrome_version": "1.0", // 扩展所需chrome的最小版本
 
    "nacl_modules": [],  // 消息与本地处理模块映射
 
    "offline_enabled": true, // 是否允许脱机运行
 
    "omnibox": {
 
       "keyword": "myKey"
 
    }, //ominbox即地址栏。用于响应地址栏的输入事件
 
    "options_page": "aFile.html", // 选项页。用于在扩展管理页面跳转到选项设置
 
    "permissions": [
 
       "https://www.baidu.com/*",
 
       "background",
 
       "tabs"
 
    ], //权限。详见注释4
 
    "plugins": [{
 
       "path": "extension_plugin.dll",
 
       "public": true
 
    }], // 扩展。可调用第三方扩展
 
    "requirements": {}, // 指定所需要的特殊技术。目前只支持"3D"
 
    "update_url": "http://path/to/updateInfo.xml",   // 自动升级
 
    "web_accessible_resources": [] // 指定资源路径,为String数组
 
}

{
  "package": "com.lingan.seeyouxiaomi",
  "name": "美柚",
  "version": "1.2",
  "versionCode": 3,
  "versionName": "1.2",
  "minPlatformVersion": 100,
  "icon": "/Common/resources/logo_180.png",
  "features": [
    {
      "name": "com.miui.hybrid.features.Network"
    },
    {
      "name": "system.fetch"
    },
    {
      "name": "system.storage"
    },
    {
      "name": "system.prompt"
    }
  ],
  "permissions": [
    {
      "origin": "*"
    }
  ],
  "config": {
    "logLevel": "debug"
  },
  "router": {
    "entry": "Home",
    "pages": {
      "Home": {
        "component": "home"
      },
      "Me": {
        "component": "me"
      },
      "Setup": {
        "component": "setup"
      },
      "Records": {
        "component": "records"
      },
      "About": {
        "component": "about"
      },
      "Login": {
        "component": "login"
      },
      "Setpw": {
        "component": "setpw"
      },
      "Tips": {
        "component": "tips"
      }
    }
  },
  "display": {
    "backgroundColor": "#ffffff",
    "titleBar": true,
    "titleBarBackgroundColor": "#ff5073",
    "titleBarTextColor": "#ffffff",
    "pages": {
      "Home": {
        "titleBarText": "美柚"
      },
      "Me": {
        "titleBarText": "美柚"
      },
      "Setup": {
        "titleBarText": "经期设置"
      },
      "Records": {
        "titleBarText": "我的记录"
      },
      "About": {
        "titleBarText": "关于美柚"
      },
      "Login": {
        "titleBarText": "登入"
      },
      "Setpw": {
        "titleBarText": "填写密码"
      },
      "Tips": {
        "titleBarText": "今日贴士"
      }
    }
  }
}

简而言之,我crossorigin="use-credentials"在本节中添加了元素。

参考链接:https://github.com/alienzhou/learning-pwa/tree/manifest

2.php 是后台渲染 因此缓存的模式

<!DOCTYPE html>
//缓存文件 demo.appcache 缓存appchache 网络传输是先本地 局域网 广域网 依次往上找(类似原型链)
<html lang="en" manifest="demo.appcache">
<head>
    <meta charset="UTF-8">
    <title>10-应用程序缓存</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
    <script src="../js/cookie.js"></script>
    <script src="../js/jquery-3.3.1.js"></script>
    <script src="../js/template-web.js"></script>

</head>
<body>

</body>
<html>

缓存文件表示

//demo.appcache
CACHE MANIFEST
# 2020-02-21 v1.0.0 备注时间
/theme.css  //缓存 css
/logo.gif   //缓存 logo.gif
/main.js    //缓存 main.js

NETWORK:    //缓存的线上资源
login.asp

FALLBACK:  //访问资源 第二个是替补资源
ml5/ /404.html

php 后台渲染 有个问题 每次动态的资源 都会拿缓存本地的得不到更新(弊端) 解决方案:动态manifest文件

<html  manifest="http://www.sofish.de/sofished.manifest">

nginx 传输缓存(网路请求缓存)

text/cache-manifest         appcache;

转载:https://www.cnblogs.com/brainmao/archive/2011/09/27/2193495.html
一、什么是 Cache Manifest
话说,作为一个 web 开发相关的人员,都不会少听到、看到 cache 这个词。是的,上面也已经说了,它是一种缓存的机制。它可以通过一个 .manifest 文件来配置需要缓存的或者一定要保持联网缓存的文件。而重点就是这个 .manifest 文件,具体的可以 Google 一下,而简单的我帮你整理一下现在可能会希望了解的东西:

MIME TYPE:text/cache-manifest
需要由你创建的:NAME.manifest
作用:主要是配置需要缓存的文件
二、如何实现
实现起来倒是非常简单(当然,这也是有问题的,这个我们后面讲解决方案),实现步骤如下:

在服务器上添加MIME TYPE支:
比如 Apache 中可在 .htaccess 中添加:

AddType text/cache-manifest manifest
创建 NAME.manifest:
其中第一行的 CACHE MANIFEST 标识是一定要有的,而 CACHE / NETWORK / FACKBACK 都是可选的。如果没有写标识,则默认缓存,CACHE 就不用说了,缓存;NETWORK 指不想缓存的页面,比如登陆页等;FALLBACK 是指当没有响应时的替代方案,比如我想请求某个页面,但这个页面的服务器挂了,那么,我可以显示另外一个指定的页面,文件结构如下:

配置文件参考

CACHE MANIFEST

# VERSION 0.3

# 直接缓存的文件
CACHE:
abc.html
images/sofish.png
js/main.js
css/layout.css

# 需要在时间在线的文件
NETWORK:
/wp-admin/

# 替代方案
FALLBACK:
/ajax/ ajax.html

配置文件参考

CACHE MANIFEST
# 井号备注,这边可以放版本更新时间,修改备注算更新 manifest 文件
CACHE:
# 首次下载 CACHE 后列出来的文件后缓存到本地。
/favicon.ico
/main.css
 
NETWORK:
# NETWORK 下的文件不可被缓存,必须要与服务器连接。
login.php
 
FALLBACK:
# 一行放两个路径,第一个是访问资源,第二个是替补;当无法访问前一个资源时,用后一个资源代替之。
/cat/ /404.html

至于如何更新这个配置文件?只要改变文件的内容即可,上面的 # VERSION 0.3 其实只是一行注释,但改变文件可以重新缓存,这样写上版本号,想更新的时候修改版本号来重新缓存,是一种比较推荐的方法,甚至可以是最佳实践。

给 标签加 manifest 属性:

是的,就是如此简单,相信你花上30分钟也就了解了。当时我也这样。随后也很快地应用上去。结果。结果就是像这篇文章一样还没写完,但没有时间折腾,而是速速把它撤下,等问题解决后再应用。

三、Cache Manifest 存在的问题
经过上面一整,速度当然爽,帮忙测试的人也小震惊了一下,只是,还是存在一些问题,看一下,然后我们尝试解决:

自动缓存引用了 manifest 文件的页面
即使在 NETWORK 中指定 “*”(所有的页面都)使用网络,还是不能解决它自动缓存当前页面。这使得这个页面在 manifest 没有变更的情况下,会一直以"类静态"存在。比如,你后台更新了一篇文章,这个动态的首页,还是像第一次缓存的时候一样,没有变。这对于静态页面还好,但应用在一个动态系统就很麻烦了,因为你的内容是时时要更新的。

Firefox 弹出提示信息
可能是习惯了弹窗警告之类的,一不小心,用户还以为是网站被人挂马呢,想把不干净的东西存储到他的电脑。

159445840.jpg

四、解决方案
(一)关于自动缓存当前页面

我查了 w3c 的文档,也看了 《Pro HTML5 Programming》的第10章(Creating HTML5 Offline Web Applications),最后还是 div into HTML5 的那句话,原意大概是:这并不是 Bug,而是机制的需要。

真是杯具,反正我能理解到的是,这是一种强加的功能。虽然说这样会让页面载入更快,但对于动态页面来说就是恶心了。至少应该有一种让用户选择是否缓存当前页的配置方案(或者说是一个开关)。不过,这是暂时不能解决的,毕竟这还只是一个 Draft,我们要用,就应用找一个合适的方案。

我的想法是,看看大家有没有更好的办法。结果,查了一下,无果。新的东西,几乎所有文章说的都只是我上面说的那个如何去写一个 manifest 文件,看来还是没办法偷懒。然后,便开始想:

一定不要缓存动态的页面,当前页一定不能引用 manifest文件
能不能从其他页面先载入缓存?
那么,如果有解决方案的话,解决方法应该是:

不在当前页面引用 manifest
在用户打开页面之前,需要有一个页面来实现缓存机制
如果这样,那么为何不试一下 iframe 来引入一个拥有 manifest 的静态文件?但用 iframe 还能会缓存到文件?经过一翻测试,Google Chrome 的调试工具给了答案:

manifest.png

太给力啦!!竟然成功缓存。做法是这样的,新建一个 cache.html 文件来当做为当前页面的代理,内容如下:

<!DOCTYPE html>
<html  manifest="http://www.sofish.de/sofished.manifest">
<head>
        <meta charset=utf-8 />
        <title>cache</title>
</head>
<body>
hi sofish!
</body>
</html>

然后,在每个页面通过 iframe 来引用这个静态文件,以达到我们不缓存当面页面,只缓存我们希望缓存文件的目的。

(二)关于 Firefox 弹出警告问题

这个,浏览器默认的,浏览器厂商的目的是为用户的安全着想,我们暂时也改变不了。其实,也不会有太大的影响,我也没有好好去想。

五、总结
测试下来,其实跟缓存当前页面还是有差别的,毕竟像站外的链接,特别是 gravatar 总要请求这么多图片,这点就又多了一点时间了。这现象主要出现在 Firefox 下,而 Webkit 而表示非常棒,速度几乎和缓存当前面一样,第二次打开的页面,都是瞬间响应的, 这点不得不赞啊。

对于实践的 Demo,本来可以提供一份,不过,瞄了一下,突然发现自己写得太专心了,已凌晨 2:49 了,明天还要上班。所以,打开你的调试工具,把本博当 Demo 看吧,这是最直接的应用了。

好吧,大概就这样,能为用户省多少就是多少,这是一个前端希望做到的,也是能做到的。这也算是有了 fallback 方案。期待你,看到最后的你,还有更好的方法。也期待 HTML5 的发展,期待这些给力的新技术。

广积粮,筑高墙,缓称王

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web修理工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值