有没有一种简单的方法可以在Web工作者中运行Firebase?

时间:2015-11-04 11:40:47

标签: javascript firebase web-worker

我有一个页面React应用程序,它包含许多文件,与gulp / browserify捆绑在一起。

Firebase javascript嵌入在此捆绑包中。

我想知道是否有 easy 方式在另一个工作线程上运行某些Firebase操作?

我尝试过:

通过 worker.postMessage(xxx)设置工作人员并发送Firebase对象或实例。在这两种情况下,它都会抛出一个错误,表示the object cannot be cloned。下面是Firebase对象的示例。

var blobURL = URL.createObjectURL(new Blob([ '(',
    (function() {
        var onmessage = function(event) {
            var FB = new event.data.Firebase('my firebase URL');
            // Here, some Firebase operations
            // ...
        };
    }).toString(),
')()' ], { type: 'application/javascript' }));
var postViewedWorker = new Worker(blobURL);
URL.revokeObjectURL(blobURL);

[... later on ...]

postViewedWorker.postMessage({Firebase: Firebase, ...otherParams});

在上面的例子中,工作者工作(哈哈),直到我尝试通过Firebase。

我想避免的事情:

设置两个完全不同的软件包,一个包含主应用程序,另一个专用于所有Firebase操作,并使用帮助程序lib来发送彼此之间的操作。

注意:这个问题背后的原因是因为我的用户界面因Firebase操作而变慢。例如,我有一个页面上显示的项目列表,当我滚动时,每次项目可见时,此对象的view计数都会使用Firebase进行更新。页面滚动在没有这些操作的情况下是平滑的,并且在我添加时变得不稳定。

编辑:此外,我始终收到以下警告:Synchronous XMLHttpRequest on the main thread is deprecated because of its detrimental effects to the end user's experience.

2 个答案:

答案 0 :(得分:2)

简单易用,取决于您的价值观。可能,肯定。

我使用microdom让它运转起来。这是一个粗糙/肮脏的版本,捆绑对你来说很有意义。

在你的工人中:

importScripts("http://raw.github.com/tmpvar/microdom/master/microdom.min.js");
var window = microdom('<html></html>');
var document = window;
importScripts("https://cdn.firebase.com/js/client/2.4.2/firebase.js");

var ref = new Firebase(input.firebase_endpoint);
// This ref now works, authenticates, etc.  You can use .notify() to pass info to the main thread, etc.

ref.on("value", function(snapshot) {
    output.notify(snapshot.val());
});

答案 1 :(得分:1)

我有一个有效的开源实现,可以将Firebase放入工作者:https://github.com/pkaminski/fireworker。它既可以使用普通工作者也可以使用共享工作者(如果支持),并集成其他Firebase附加库的额外功能。它模拟Firebase API并自动桥接从主页面到工作者的调用,因此您现有的代码应该或多或少地继续按原样工作。在撰写本文时,它也有一些非平凡的限制:

  • 仅支持Firebase SDK 2.4.2。可能适用于SDK 3.x但由于源代码不可用,因此会更难。
  • 交互式身份验证方法不起作用;调用authWithPasswordauthWithOAuthPopupauthWithOAuthRedirect会抛出异常。而是使用您自己的服务器进行登录并致电authWithCustomToken
  • 目前尚未实施项目优先级。由于优先级是在带外存储的,因此难以高效支持,而Firebase人员表示它基本上已被弃用。