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

Pan*_*olo 5 javascript web-worker firebase

我有一个单页 React 应用程序,它由许多文件组成,与 gulp/browserify 捆绑在一起。

Firebase javascript 嵌入在此包中。

我想知道是否有一种简单的方法可以在另一个工作线程上运行某些 Firebase 操作?


我尝试过的:

设置一个工作器并通过 worker.postMessage(xxx). 在这两种情况下,它都会抛出一个错误,表示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});
Run Code Online (Sandbox Code Playgroud)

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


我想避免什么:

设置两个完全不同的包,一个用于主应用程序,一个专用于所有 Firebase 操作,并使用一个辅助库相互发送操作。


注意:这个问题背后的原因是我的 UI 被 Firebase 操作减慢了速度。例如,我在页面上显示了一个项目列表,当我滚动时,每次看到一个项目时view,该对象的计数都会使用 Firebase 更新。没有这些操作,页面滚动很流畅,当我添加它们时会变得生涩。

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

sko*_*zen 3

容易,取决于你对容易的价值观。有可能,绝对有可能。

我使用 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());
});
Run Code Online (Sandbox Code Playgroud)