2015-11-04 45 views
4

我有一個單頁面React應用程序,它由許多文件組成,與gulp/browserify捆綁在一起。有沒有簡單的方法在網絡工作者中運行Firebase?

Firebase JavaScript嵌入在此捆綁包中。

我想知道是否有easy方式在另一個工作線程上運行某些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}); 

在上面的示例中,Worker工作(哈哈),直到我嘗試傳遞Firebase。


我想什麼來避免:

設置兩個完全不同的包,一個與主應用程序,以及一個專門爲所有的火力地堡操作,與助手LIB從彼此發送操作。


注:後面這個問題的原因是因爲我的UI是由火力地堡操作放緩。例如,我有一個顯示在頁面上的項目列表,當我滾動時,每次顯示一個項目時,此對象的view計數將使用Firebase更新。如果沒有這些操作,頁面滾動是平滑的,並且當我添加它們時會變得不穩定。

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

+0

我正面臨同樣的問題。你最終用兩束+助手lib的想法?如果是這樣,它工作嗎? – Piotr

+0

我目前正在重構我的應用程序以使用'redux'。完成後,我計劃開發一個redux中間件,以使UI(主線程)和web worker(store + firebase邏輯)之間進行存儲I/O(動作/減少)通信。如果成功,我會把它放在一個lib中並更新這個頁面! (順便說一下,我現在使用webpack和香草npm代替吞噬+ browserify) – Pandaiolo

回答

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

我有把火力地堡的一個工人工作的開源實現:https://github.com/pkaminski/fireworker。它可以使用普通和共享的工作人員(在支持的情況下),並集成來自其他Firebase附加庫的額外功能。它模擬Firebase API並自動將呼叫從主頁面連接到工作人員,因此現有代碼應該或多或少繼續按原樣工作。在撰寫本文時,它也有一些不重要的限制:

  • 僅支持Firebase SDK 2.4.2。可能可能適用於SDK 3.x,但由於源代碼不可用,將會變得更加困難。
  • 交互式身份驗證方法不起作用;調用authWithPassword,authWithOAuthPopupauthWithOAuthRedirect將引發異常。相反,請使用您自己的服務器進行登錄,並致電authWithCustomToken
  • 項目優先級目前尚未實施。由於優先級存儲在帶外,因此很難有效支持,而且Firebase人員已表示它本質上已被棄用。
相關問題