HTML5 离线缓存manifest浅析

    xiaoxiao2021-04-18  54

    最近公司项目开发app内嵌入H5应用,由于公司网络不佳,导致开发的H5应用首页加载时快时慢,体验效果不佳,和原生app相比感觉区别很大。以前学习了解H5的时候对H5的缓存有点印象,故就有了把首页缓存在客户端本地的想法,这样可以保证首页、js-lib、图片的快速加载。这才有了这篇基础文章。

    1、简介

    W3C官方对manifest的介绍是HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问。

    应用程序缓存为应用带来三个优势:

    离线浏览 - 用户可在应用离线时使用它们速度 - 已缓存资源加载得更快减少服务器负载 - 浏览器将只从服务器下载更新过或更改过的资源。 在使用过程中我总结了几个缺点:

    manifest中cache部分不能使用通配符,如果缓存页引入大量JS,图片,写起来比较麻烦,虽然可以使用grunt-manifest自动生成如果页面是通过ajax请求拼接出来的页面中含有图片,这些图片又是从web上传的,这些图片也必须写入缓存文件,否则下次就读不出来了。大大降低了实用性

    2、mainifest实例

    html中写法 <!doctype html> <html manifest="index.manifest"> <head> <meta charset="utf-8"> <title>应用中心</title>注意: 每个指定了 manifest 的页面在用户对其访问时都会被缓存。如果未指定 manifest 属性,则页面不会被缓存(除非在 manifest 文件中直接指定了该页面)。

    manifest 文件可分为三个部分:

    CACHE MANIFEST - 在此标题下列出的文件将在首次下载后进行缓存NETWORK - 在此标题下列出的文件需要与服务器的连接,且不会被缓存FALLBACK - 在此标题下列出的文件规定当页面无法访问时的回退页面(比如 404 页面) 缓存是否成功加载可以用Chrome打开这个页面就可以在控制台中找到这个manifest的工作信息: 再次请求此页面的时候: 如果有报错的话,会有提示:

    3、缓存更新

    一旦应用被缓存,它就会保持缓存直到发生下列情况:

    用户清空浏览器缓存manifest 文件被修改由程序来更新应用缓存 开发者也可以使用 window.applicationCache 的接口更新缓存 获取缓存状态:window.applicationCache.status 为了通过编程更新cache,首先调用 applicationCache.update()。这将会试图更新用户的 cache( 要求manifest文件已经改变)。最后,当 applicationCache.status 处于 UPDATEREADY 状态时, 调用applicationCache.swapCache(),旧的cache就会被置换成新的。

    4、自动化工具

    manifest中 cache部分不能使用通配符 ,如果缓存页引入大量JS,图片,写起来比较麻烦,这时候就可以使用自动化工具grunt-manifest。 grunt-manifest GitHub地址 grunt搭建查看:【前端福利】用grunt搭建自动化的web前端开发环境-完整教程 安装grunt-manifest npm install grunt-manifest --save-dev 载入: grunt.loadNpmTasks('grunt-manifest'); 实例: grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), manifest: { generate: { options: { basePath: '../', cache: ['js/app.js', 'css/style.css'], network: ['http://*', 'https://*'], fallback: ['/ /offline.html'], exclude: ['js/jquery.min.js'], preferOnline: true, headcomment: " <%= pkg.name %> v<%= pkg.version %>", verbose: true, timestamp: true, hash: true, master: ['index.html'], process: function(path) { return path.substring('build/'.length); } }, src: [ 'build/some_files/*.html', 'build/js/*.min.js', 'build/css/*.css' ], dest: 'manifest.appcache' } } });

    其中options定义生成manifest的一些自定义参数,src是要生成的文件,dest是输出文件。

    options下有很多参数,主要参数如下:

    basePath 设置出入文件的根目录

    cache 手动添加缓存文件

    network 手动添加网络文件

    fallback 手动添加后备文件

    exclude 设置不添加到cache的文件

    verbose 是否添加版权信息

    timestamp是否添加时间戳

    5、注意事项

    浏览器对缓存数据的容量限制可能不太一样(某些浏览器设置的限制是每个站点 5MB)。如果manifest文件,或者内部列举的某一个文件不能正常下载,整个更新过程都将失败,浏览器继续全部使用老的缓存。引用manifest的html必须与manifest文件同源,在同一个域下。FALLBACK中的资源必须和manifest文件同源。当一个资源被缓存后,该浏览器直接请求这个绝对路径也会访问缓存中的资源。站点中的其他页面即使没有设置manifest属性,请求的资源如果在缓存中也从缓存中访问。当manifest文件发生改变时,资源请求本身也会触发更新。系统会自动缓存引用清单文件的 HTML 文件 manifest文件中CACHE则与NETWORK,FALLBACK的位置顺序没有关系,如果是隐式声明需要在最前面

    转载请注明原文地址: https://ju.6miu.com/read-674632.html

    最新回复(0)