2012-06-11 10 views

Odpowiedz

5

Pracownicy WWW nie mają dostępu do DOM, więc wszystko, co możesz zrobić po tej stronie, to zbudowanie czegoś, co może być użyte do szybkiego utworzenia DOM. Pracownik (y) mógłby np. Przetwarzać zbiory danych i wykonywać wszystkie ciężkie obliczenia, a następnie przekazywać wyniki z powrotem jako zbiór tablic.

+1

Dzięki. Bałem się, że to będzie odpowiedź. – user1449496

+0

To już stare pytanie, ale ... A co z phantomJS? – meetamit

+0

@meetamit, które mogą być opcja myślę, wygenerować DOM na serwerze z phantomJS, a następnie przekazać go do klienta? ale to nie jest użycie Workers Web, co było pytaniem. –

4

https://github.com/mbostock/d3/commit/43d38773623b52209d2667287a1ae626fb95b0d9

Niedawny popełnienia przez Jason Davies. Mike Bostock mówi, że w przyszłości kod zależny od DOM zostanie oddzielony od d3.core i w ten sposób można stworzyć niestandardową kompilację d3, która działa z interfejsem API dla web-pracowników.

Miałem ten sam problem, gdy mam wykres ukierunkowany na siłę z dużą liczbą węzłów. Czuje się bardzo powolny. Chcę w jakiś sposób poprawić wydajność. Myślę, że ostatni wątek z phantomJS na serwerze węzła jest dobrym pomysłem, ale opóźnienie sieci związane z podejściem zrujnuje gładkie uczucie kierowane siłą.

+1

, więc gdzie znaleźć pozbawiony D3 bez zależności domena? –

1

udało mi się obliczyć akordy i grup układ akordów za pomocą pracownika internetowej, wykonując następujące czynności:

  1. stworzyć zwyczaj budowania D3, które nie mają dependecy na obiekcie dokumentu lub DOM (patrz: https://github.com/mbostock/smash/wiki)

  2. utworzyć plik pracownika internetowej i korzystać importScripts załadować zwyczaj d3 budowę

  3. aktywować pracownika w kodzie renderowania. Kiedyś obietnicę hermetyzacji komunikacji z pracownikiem:

    calculateChords = (padding, matrix) -> 
         deferred = $.Deferred() 
    
         worker = new Worker("worker.js") 
    
         worker.onmessage = (e) -> 
          deferred.resolve(e.data.groups, e.data.chords); 
    
         worker.postMessage { 
          matrix: matrix 
         } 
    
         deferred.promise() 
    

    później w funkcji renderowania:

    calculateChords(matrix).then (groups, chords) -> 
        ... 
    
+1

W rzeczywistości można uruchomić standardowego d3 w usłudze WWW, jeśli zostawisz prawe (fałszywe) obiekty leżące wokół, aby uspokoić d3 podczas uruchamiania. Głównym problemem jednak (przy użyciu d3 z pracownikami WWW) są koszty ogólne serializacji w wiadomościach wysyłania i odbierania. Byłbym bardzo zainteresowany, aby dowiedzieć się, czy ktoś wymyślił miłą metodę korzystania z obiektów przenośnych w celu uniknięcia serializacji. –

Powiązane problemy