我有一个页面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.
答案 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并自动桥接从主页面到工作者的调用,因此您现有的代码应该或多或少地继续按原样工作。在撰写本文时,它也有一些非平凡的限制:
authWithPassword
,authWithOAuthPopup
或authWithOAuthRedirect
会抛出异常。而是使用您自己的服务器进行登录并致电authWithCustomToken
。