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.
容易,取决于你对容易的价值观。有可能,绝对有可能。
我使用 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)