2013-12-14 10 views
7

Obecnie istnieje wiele frameworków po stronie klienta wiążących dane (Ember, kręgosłup, knockout i Angular są popularnymi, o których mi wiadomo).Jak wyświetlać wstępnie renderowane szablony wiążące dane

Problem z tymi wszystkimi ramami jest początkowym obciążeniem. Musisz zaznaczyć swój HTML za pomocą symboli zastępczych iw zależności od tego, jak to zrobisz, klient zobaczy puste fragmenty strony lub losowe {{ markup }}. Co więcej, większość tych szablonów jest parsowana po stronie klienta, a nie wstępnie skompilowana.

Idealnie, gdy użytkownik po raz pierwszy wejdzie na stronę, wyświetli mu się wstępnie wypełniony kod HTML z wszystkimi wypełnionymi danymi, a to da im coś do obejrzenia, podczas gdy wszystkie wstępnie skompilowane szablony JavaScript będą ładowane i Wczytanie powiązań danych. Od tego momentu korzystałby z routingu po stronie klienta, a my po prostu mielibyśmy JSON na drucie.

Mogę zrobić połowę tego już z Jade lub z kilku innych języków szablonów, które mogą być renderowane po stronie serwera lub klienta. Rzeczą, której nie potrafię zrozumieć, jest to, jak mógłbym ładnie zagrać z jedną z tych ram.

Na przykład w Knockout, Pana zdaniem, może wyglądać następująco:

<p>First name: <strong data-bind="text: firstName"></strong></p> 
<p>Last name: <strong data-bind="text: lastName"></strong></p> 

W Jade, chciałbym zdefiniować samego szablonu takiego:

p First Name 
    b= firstName 
p Last Name 
    b= lastName 

które dla ciekawskich, dostaje skompilowany do tego:

function anonymous(locals) { 
    var buf = []; 
    var locals_ = locals || {}, firstName = locals_.firstName, lastName = locals_.lastName; 
    buf.push("<p>First Name <b>" + jade.escape(null == (jade.interp = firstName) ? "" : jade.interp) + "</b></p><p>Last Name <b>" + jade.escape(null == (jade.interp = lastName) ? "" : jade.interp) + "</b></p>"); 
    return buf.join(""); 
} 

To bardzo szybkie renderowanie po stronie serwera lub klienta.

Aby uzyskać wiązania danych do pracy, jednak będę musiał podwójnie opisywanie źródło:

p(data-bind='text: firstName') First Name 
    b= firstName 
p(data-bind='text: lastName') Last Name 
    b= lastName 

tj umieścić każdy zmienną zastępczy tam dwa razy, w dwóch różnych formatach.

(Na szczęście, większość z tych ram wziąć jakiś obiekt JSON dla widoku modelu (wierzę), które mogłyby służę bezpośrednio do Jade lub ramy, tak że część nie powinna być problemem.)

Bardzo chciałbym tego uniknąć, ale nie mogę myśleć o tym, jak to jest możliwe bez napisania własnego języka szablonowego, który jest silnie uzależniony od ramek frontendu.

Czy można to zrobić bez większego bólu? Korzystając z jednego z powyższych frontendów lub dowolnego języka szablonowego do kompilacji z JS? Być może za pośrednictwem niektórych wtyczek/rozszerzeń, zamiast zmieniać je na poziomie podstawowym?

Odpowiedz

2

Facebook ReactJS implementuje wirtualny DOM, który pozwala renderować całą stronę interfejsu użytkownika (w węźle).

1

Angular 4+ ma teraz Angular Universal, który pozwala na opracowanie SPA z Angular 2+ po stronie klienta lub po stronie serwera (z NodeJs lub nawet Asp.Net Core). Trudne jest to, że WSZYSTKO, które opiera się na oknie, magazynie sesji, magazynie lokalnym itp., Nie zostanie wykonane po stronie serwera, ponieważ w środowisku po stronie serwera nie ma przeglądarki. Miej to na uwadze, jeśli stworzysz SPA i planujesz renderowanie po stronie serwera, aby stać się przyjaznym dla SEO.

React i VueJs to także frameworki/biblioteki, które mogą być używane w aplikacjach uniwersalnych (do renderowania po stronie serwera i wyświetlania już renderowanej treści w przeglądarce)