• service worker实现静态资源缓存


    service worker如何实现静态资源缓存和强制更新,请看如下示例:

    1、注册service worker

    1. function serviceWorker() {
    2. if (isLocalStorageAvailable() && 'serviceWorker' in navigator) {
    3. navigator.serviceWorker.register('/static/almasaeed2010/adminlte/dist/js/service-worker.js')
    4. .then(registration => {
    5. console.log('Service Worker 注册成功:', registration);
    6. })
    7. .catch(error => {
    8. console.log('Service Worker 注册失败:', error);
    9. });
    10. }
    11. }

    2、worker实现:

    1. // 预定义要缓存的文件列表
    2. const cacheName = 'fbspider-cache-v1.1.2';
    3. //update time
    4. const filesToCache = [
    5. '/static/almasaeed2010/adminlte/plugins/jquery/jquery.min.js',
    6. '/static/almasaeed2010/adminlte/plugins/jquery-ui/jquery-ui.min.js',
    7. '/static/almasaeed2010/adminlte/plugins/bootstrap/js/bootstrap.bundle.min.js',
    8. '/static/almasaeed2010/adminlte/plugins/moment/moment.min.js',
    9. '/static/almasaeed2010/adminlte/plugins/overlayScrollbars/js/jquery.overlayScrollbars.min.js',
    10. '/static/almasaeed2010/adminlte/dist/js/adminlte.js',
    11. '/static/almasaeed2010/adminlte/plugins/sweetalert2/sweetalert2.min.js',
    12. '/static/almasaeed2010/adminlte/plugins/toastr/toastr.min.js',
    13. '/static/almasaeed2010/adminlte/dist/js/demo.js',
    14. '/datatables-responsive/js/responsive.bootstrap4.min.js',
    15. 'https://cdn.datatables.net/fixedcolumns/3.3.3/js/dataTables.fixedColumns.min.js',
    16. '/static/almasaeed2010/adminlte/plugins/datatables-buttons/js/buttons.bootstrap4.min.js',
    17. '/static/almasaeed2010/adminlte/plugins/datatables-buttons/js/dataTables.buttons.min.js',
    18. '/static/almasaeed2010/adminlte/plugins/datatables-responsive/js/dataTables.responsive.min.js',
    19. '/static/almasaeed2010/adminlte/plugins/datatables-bs4/js/dataTables.bootstrap4.min.js',
    20. '/static/almasaeed2010/adminlte/plugins/datatables/jquery.dataTables.min.js',
    21. '/static/almasaeed2010/adminlte/plugins/fontawesome-free/css/all.min.css',
    22. '/static/almasaeed2010/adminlte/plugins/icheck-bootstrap/icheck-bootstrap.min.css',
    23. '/static/almasaeed2010/adminlte/dist/css/adminlte.min.css',
    24. //'/static/almasaeed2010/adminlte/dist/css/common.css',
    25. '/static/almasaeed2010/adminlte/plugins/sweetalert2-theme-bootstrap-4/bootstrap-4.min.css',
    26. '/static/almasaeed2010/adminlte/plugins/toastr/toastr.min.css',
    27. '/static/almasaeed2010/adminlte/plugins/overlayScrollbars/css/OverlayScrollbars.min.css',
    28. '/static/almasaeed2010/adminlte/plugins/datatables-bs4/css/dataTables.bootstrap4.min.css',
    29. '/static/almasaeed2010/adminlte/plugins/datatables-responsive/css/responsive.bootstrap4.min.css',
    30. '/static/almasaeed2010/adminlte/plugins/datatables-buttons/css/buttons.bootstrap4.min.css',
    31. 'https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css',
    32. // ...其他文件
    33. ];
    34. // 在 Service Worker 安装阶段缓存文件-----
    35. self.addEventListener('install', function(event) {
    36. event.waitUntil(
    37. caches.open(cacheName).then(function(cache) {
    38. return Promise.all(
    39. filesToCache.map(function(file) {
    40. return cache.add(file).catch(function() {
    41. console.log('Failed to cache:', file);
    42. });
    43. })
    44. );
    45. })
    46. );
    47. self.skipWaiting();
    48. });
    49. // 拦截网络请求并返回缓存的响应(如果存在)
    50. self.addEventListener('fetch', function(event) {
    51. event.respondWith(
    52. caches.match(event.request)
    53. .then(function(response) {
    54. // 如果缓存中有该请求,返回缓存的响应
    55. if (response) {
    56. return response;
    57. }
    58. // 否则,进行实际的网络请求
    59. return fetch(event.request);
    60. })
    61. );
    62. });
    63. self.addEventListener('activate', function(event) {
    64. event.waitUntil(
    65. caches.keys().then(function(cacheNames) {
    66. return Promise.all(
    67. cacheNames.map(function(thisCacheName) {
    68. // 如果一个存在的缓存不匹配当前缓存名称,就删除它
    69. if (thisCacheName !== cacheName) {
    70. return caches.delete(thisCacheName);
    71. }
    72. })
    73. );
    74. })
    75. );
    76. });

    3、如何实现客户端浏览器强制刷新缓存:

    网上的一些方法试过都不生效,我的最终解决方法是强制刷新,至于什么时机刷新,可以在注册完后,在成功的回调方法中,判断并强制刷新,强制刷新如下:

    registration.update();

    可以基于浏览器的localStorage,来决定什么时候刷新。

  • 相关阅读:
    YOLOv8独家最新改进《新颖高效AsDDet检测头》独一无二的结构改进,公开数据集mAP高效涨点,即插即用|检测头新颖改进,性能高效涨点
    数字时代的探索与革新:Socks5代理的引领作用
    jscpd对项目进行查重(支持150+类语言)
    kettle入门杂乱笔记
    跨域 —— 反向代理配置
    Transformer笔记
    考研结束大半年,研0这些时间普通人的一些感触(附开学flag)
    单链表(4)
    源码编译安装部署lnmp
    Java常用类的使用
  • 原文地址:https://blog.csdn.net/kevin_lcq/article/details/133803926