代码之家  ›  专栏  ›  技术社区  ›  jcubic

如何处理ServiceWorker中的依赖项?

  •  5
  • jcubic  · 技术社区  · 7 年前

    如果路径包含 __browserfs__ ,简化代码如下:

    function loadDependecies() {
        self.skipWaiting().then(function() {
            if (!self.fs) {
                self.importScripts('https://cdn.jsdelivr.net/npm/browserfs');
                BrowserFS.configure({ fs: 'IndexedDB', options: {} }, function (err) {
                    if (err) {
                        console.log(err);
                    } else {
                        self.fs = BrowserFS.BFSRequire('fs');
                        self.path = BrowserFS.BFSRequire('path');
                    }
                });
            }
        });
    }
    self.addEventListener('install', loadDependecies);
    
    self.addEventListener('activate', loadDependecies);
    
    self.addEventListener('fetch', function (event) {
        event.respondWith(new Promise(function(resolve, reject) {
            if (local) {
                console.log('serving ' + path + ' from browserfs');
                if (!self.fs) {
                    (function loop() {
                        if (!self.fs) {
                            setTimeout(loop, 400);
                        } else {
                            serve();
                        }
                    })();
                } else {
                    serve();
                }
            } else {
                if (event.request.cache === 'only-if-cached' && event.request.mode !== 'same-origin') {
                    return;
                }
                //request = credentials: 'include'
                fetch(event.request).then(resolve).catch(reject);
            }
        }));
    });
    

    当我有一段时间没有与应用程序交互时,再次打开它,然后尝试获取它一直在加载的本地文件可能是因为无限循环,我需要手动重新加载服务工作者(使用开发工具)来获取页面。

    所以我的问题是我怎样才能 importScripts 在服务人员中加载Browsers?

    2 回复  |  直到 7 年前
        1
  •  1
  •   jcubic    7 年前

    我最终得到了这个密码, let 未添加到全局范围,因此应该是安全的:

    self.importScripts('https://cdn.jsdelivr.net/npm/browserfs');
    let path = BrowserFS.BFSRequire('path');
    let fs = new Promise(function(resolve, reject) {
        BrowserFS.configure({ fs: 'IndexedDB', options: {} }, function (err) {
            if (err) {
                reject(err);
            } else {
                resolve(BrowserFS.BFSRequire('fs'));
            }
        });
    });
    
    self.addEventListener('install', self.skipWaiting);
    
    self.addEventListener('activate', self.skipWaiting);
    
    self.addEventListener('fetch', function (event) {
        event.respondWith(fs.then(function(fs) {
            return new Promise(function(resolve, reject) {
                var url = event.request.url;
                var m = url.match(/__browserfs__(.*)/);
                if (m) {
                    var path = m[1];
                    if (path === '') {
                        return redirect_dir();
                    }
                    console.log('serving ' + path + ' from browserfs');
                    serve();
                } else {
                    if (event.request.cache === 'only-if-cached' && event.request.mode !== 'same-origin') {
                        return;
                    }
                    //request = credentials: 'include'
                    fetch(event.request).then(resolve).catch(reject);
                }
            });
        }));
    });
    

    编辑 这段代码似乎也错了,所以我用这个:

    self.addEventListener('fetch', function (event) {
        let path = BrowserFS.BFSRequire('path');
        let fs = new Promise(function(resolve, reject) {
            BrowserFS.configure({ fs: 'IndexedDB', options: {} }, function (err) {
                if (err) {
                    reject(err);
                } else {
                    resolve(BrowserFS.BFSRequire('fs'));
                }
            });
        });
        ...
    });
    

    看看这是否有效。可能需要在获取时使用importScripts。

        2
  •  0
  •   Vinicius Dallacqua    7 年前

    您可能想静态地构建这个文件,包括 BrowserFS 更稳定的执行时间。