配饭短文:离线Web应用入门

简介: 无网络时,前端真的什么都做不了吗?本文滚动条以及直觉告诉你,那一定不是的。联想到几个月前写的一篇无人问津的文章:《Service Worker从入门到出门》(这是广告,方便的话请去点赞,对您没什么好处,但我会高兴),笔者意识到,如果不计代价的话,借助Service Worker,那个bug里要求的效果,其实也不是不可能实现。本文决定,不纠结于那个bug,而针对无网络的极限场景,用尽量少的代码,实现一个demo级别的离线Web应用。

一点说明


所谓的离线应用,不是指一直离线,一直没网的话,那还玩些什么呢?而是指一开始用户是有网络的,但是用户因为走进地铁,或者买了近两年的iPhone,突然就没网了,此时,让页面展示一些缓存的内容。


理清思路、抓住关键


实现一个离线Web应用的关键在于:拦截请求缓存资源




在此假设读者了解Service WorkerCacheStorage的基础。


简单来讲,如果不考虑HTTP缓存的话,一个普通Web App获取静态资源是从服务器获取的。但是Service Worker相当于在浏览器的出口加了一层代理,有着拦截并处理请求的能力,这使得我们有机会选择资源是从服务器取还是从CacheStorage中取。


CacheStorage既然作为一种缓存,那大概就要遵从“如果命中缓存则返回缓存中的资源,否则从远处取”的基本策略。


具体到一个Web应用,静态资源可以粗略分为html和其它(js、css、图片等),html作为应用入口,有着它的特殊性。实现离线应用的关键在于缓存入口html,这是实现离线应用的核心思路。设想一下,如果html保存在本地,那在无网络的情况下,浏览器也是可以打开的,至于html引用的其它静态资源,如果缓存过,那也是可以访问的。


代码


首先,初始化一个项目,在此以Vue项目为例,在入口html中注册service worker:


<script>
    if ('serviceWorker' in navigator) {
      window.addEventListener('load', function () {
        navigator.serviceWorker.register('/demo/service-worker.js').then(function (reg) {
          console.log('service-worker.js注册成功');
        }, function (err) {
          console.log('service-worker.js注册失败');
        });
      });
    }
  </script>


service-worker.js代码:


// 每次更新需要更新版本号
const cacheVersion = 'v1';
// service worker激活时的初始化操作,非关键代码,可以不看
self.addEventListener('activate', function (event) {
    event.waitUntil(
        caches.keys().then(function (cacheNames) {
            return Promise.all(
                cacheNames.map(function (cacheName) {
                    // 如果当前版本和缓存版本不一致,则删除其它版本的cache
                    if (cacheName !== cacheVersion) {
                        return caches.delete(cacheName);
                    }
                })
            );
        })
    );
});
// 核心代码,最好看一看
self.addEventListener('fetch', function (event) {
    event.respondWith(
        caches.match(event.request)
            .then(function (response) {
                // 如匹配了cache,则直接返回cache中的资源
                // 否则fetch资源并缓存下来
                return response || fetch(event.request).then(function (r) {
                    caches.open(cacheVersion).then(function (cache) {
                        cache.put(event.request, r);
                    });
                    return r.clone();
                });
            })
    );
});


成果展示


代码部署好后,访问页面,刷新,可以看到:cacheStorage中的静态资源已经缓存成功:



然后我们断网,刷新,可以发现:页面还是可以访问的,静态资源的响应状态码是200,但标注了(from ServiceWorker)



总结


所以,如此少的代码,就可以实现一个离线Web应用,但是从Demo到实际应用,还有好长的路要走。无论如何,本文所述的是离线Web应用的基本思路和方法。


相关文章
|
18天前
|
前端开发 JavaScript 关系型数据库
从前端到后端:构建现代化Web应用的技术探索
在当今互联网时代,Web应用的开发已成为了各行各业不可或缺的一部分。从前端到后端,这篇文章将带你深入探索如何构建现代化的Web应用。我们将介绍多种技术,包括前端开发、后端开发以及各种编程语言(如Java、Python、C、PHP、Go)和数据库,帮助你了解如何利用这些技术构建出高效、安全和可扩展的Web应用。
|
1月前
|
监控 Serverless 测试技术
Serverless 应用引擎常见问题之做的web服务计费如何解决
Serverless 应用引擎(Serverless Application Engine, SAE)是一种完全托管的应用平台,它允许开发者无需管理服务器即可构建和部署应用。以下是Serverless 应用引擎使用过程中的一些常见问题及其答案的汇总:
407 3
|
1天前
|
前端开发 JavaScript Go
构建高性能Web应用:优化前端资源加载
在构建现代Web应用时,优化前端资源加载是至关重要的一步。本文将介绍一些提升Web应用性能的关键策略,包括减少HTTP请求、压缩和合并资源、使用CDN加速、以及异步加载技术等。通过实施这些优化策略,开发人员可以显著提升网站的加载速度和用户体验。
|
2天前
|
存储 中间件 Go
探索Gin框架:快速构建高性能的Golang Web应用
探索Gin框架:快速构建高性能的Golang Web应用
|
2天前
|
前端开发 JavaScript Java
前端与后端:构建现代Web应用的双翼
前端与后端:构建现代Web应用的双翼
|
2天前
|
安全 前端开发 JavaScript
在Python Web开发过程中:Web框架相关,如何在Web应用中防止CSRF攻击?
在Python Web开发中防范CSRF攻击的关键措施包括:验证HTTP Referer字段、使用CSRF token、自定义HTTP头验证、利用Web框架的防护机制(如Django的`{% csrf_token %}`)、Ajax请求时添加token、设置安全会话cookie及教育用户提高安全意识。定期进行安全审计和测试以应对新威胁。组合运用这些方法能有效提升应用安全性。
8 0
|
3天前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
|
3天前
|
开发框架 前端开发 数据库
Python从入门到精通:3.3.2 深入学习Python库和框架:Web开发框架的探索与实践
Python从入门到精通:3.3.2 深入学习Python库和框架:Web开发框架的探索与实践
|
11天前
|
缓存 负载均衡 数据库
优化后端性能:提升Web应用响应速度的关键策略
在当今数字化时代,Web应用的性能对于用户体验至关重要。本文探讨了如何通过优化后端架构和技术手段,提升Web应用的响应速度。从数据库优化、缓存机制到异步处理等多个方面进行了深入分析,并提出了一系列实用的优化策略,以帮助开发者更好地应对日益增长的用户访问量和复杂的业务需求。
16 1
|
11天前
|
缓存 监控 数据库
Flask性能优化:打造高性能Web应用
【4月更文挑战第16天】本文介绍了提升Flask应用性能的七大策略:优化代码逻辑,减少数据库查询,使用WSGI服务器(如Gunicorn、uWSGI),启用缓存(如Flask-Caching),优化数据库操作,采用异步处理与并发(如Celery、Sanic),以及持续监控与调优。通过这些手段,开发者能有效优化Flask应用,适应大型或高并发场景,打造高性能的Web服务。