2012-02-07 17 views
10

Bardzo cieszę się z emberjs i chciałbym zrobić kolejny krok w kilku małych, mobilnych aplikacjach i wstępnie skompilować szablony Ember/Handlebars w ramach mojego procesu kompilacji.Łatwy sposób na prekompilowanie szablonów kierownicy Emberjs z nodejs?

Wolałabym trzymać się z daleka od problemów z Ruby i chciałbym użyć pliku node.js, ponieważ wygodniej jest z niego korzystać.

Wierzę, że chcę użyć pliku Ember.Handlebars.precompile, ale niestety nie mogę załadować kanonicznego pliku ember.js w środowisku węzła. Przykład naiwnej próbie z repl węzła:

> var e = require('./ember'); 
ReferenceError: window is not defined 
    at /Users/jeremyosborne/git/projects/ldls/client/lib/emberjs/src/ember.js:5:1 
    at Object.<anonymous> (/Users/jeremyosborne/git/projects/ldls/client/lib/emberjs/src/ember.js:1596:2) 
    --- stack trace, you get the idea --- 

Chyba już zorientowali się, jak je ustawić w moim kodu tak, że działają poprawnie z moich poglądów, po prostu chcę, aby skompilować je w środowisko poza DOM przeglądarki.

Zamiast pobierania kanonicznego pliku ember.js do węzła, czy istnieje określony zestaw plików, które mogę usunąć z repozytorium ember i użyć do kompilacji moich szablonów?

EDYCJA Zrobiłem naprawić kluczyk, który działa świetnie, ale dostaje F dla łatwości konserwacji. Złapałem cały kod Handlebars minus odwołanie do obiektu window. Potem poszedłem z kodem Ember.Handlebars.Compiler, zastępując Ember.create z Object.create, eksportując mój obiekt Ember, a rzeczy altówki działają pozornie świetnie w węźle (jak w to działa, a funkcje są tworzone jako szablony). Ale nie uważam tego za odpowiedź na moje własne pytanie ze względu na wyżej wspomniany maintainafail, więc wciąż otwarty na odpowiedzi.

EDYTOWANIE 2 Powyższe informacje okazują się całkowitą porażką. Być może w procedurze jest coś nie tak, ale używanie Ember.Handlebars.precompile lub Ember.Handlebars.compile nie działa. Szablony są tworzone, ale kiedy używam prekompilowanych szablonów dołączonych do Ember.TEMPLATES w moim kodzie, nie działają. Wydaje mi się, że uda mi się przekonwertować szablony tylko wtedy, gdy zostaną jawnie przekazane w zmodyfikowanych znacznikach skryptu, zgodnie z sugestią na stronie emberjs.com.

EDYTOWANIE 3 Wyjaśniałem, co robiłem źle. Moja odpowiedź jest poniżej.

Odpowiedz

4

znaleźli wystarczająco dobre rozwiązanie mojego problemu, który wydaje się dość łatwe do utrzymania, że ​​będę pod uwagę mój problem rozwiązany.

Oto jak rozwiązać rzeczy:

  • chwycić minimalna ilość kodu muszę precompile szablony Ember.
  • Zarys prostej procedury prekompilacji:
    • Obciążenie kod z var Ember = require('./my_ember_precompiler').Ember.
    • Pobierz szablony jako ciągi i skompiluj je z .
    • To będzie się różnić od aplikacji do aplikacji, ale Ember wydaje się wymagać rejestracji wstępnie skompilowanych szablonów. Po wczytaniu każdego stworzonego szablonu musimy zarejestrować nasze szablony. Zasadniczo należy zawinąć templateString w wywołaniu Handlebars.template() i upewnić się, że ta opakowana funkcja została dodana do obiektu Ember.TEMPLATES.

Powyższe jest bezbolesny, gdy jest zautomatyzowana w skrypcie.

3

Spójrz na opakowaniu npm Ember-Runner

+0

Bardzo podoba mi się jak wygląda Ember-biegacz do pracy i prawdopodobnie będzie ciążyć ku niemu. Jednak na razie mam swój własny, sfałszowany proces kompilacji i szukam prostych (a) szablonów embera, (b) kompiluję szablony emberów używając nodejs. Wygląda na to, że powinno być naprawdę łatwe, ale wolałbym nie budować ręcznie wszystkiego, ani nie chcę zmieniać procesu kompilacji. Poza tym lubię jsdom, ale czuję się ułomny, używając go tylko po to, abym mógł załadować jquery, a następnie załadować Ember, a następnie udawać, że mam dom, wszystko po to, abym mógł wykonywać czysto JavaScript. Ugh. – jeremyosborne

+0

Ember-Runner kompiluje szablony ember. Nie znam jego źródła, więc nie mogę wskazać konkretnych linii kodu. Zgadzam się, nie powinno to być strasznie trudne do wdrożenia. –

0

spojrzeć na kod na oficjalnej ember szyn gem przy https://github.com/emberjs/ember-rails

Chociaż nie jest to projekt node.js, pokazuje sposób wstępnego kompilowania szablonów za pomocą potoku Rails 3.1+ i zawiera cały niezbędny kod JavaScript, który należy wykonać w węźle bez konieczności łączenia rozwiązań które musielibyście sami utrzymać.

Dokładniej, spojrzeć na vendor/assets/JavaScript/Ember-precompiler.js i lib/węgielek szyn/hjs_template.rb

jestem daleko od eksperta w węźle (oczywiście, jest bardziej w moim Rails rzecz) .. ale myślę, że te dwa pliki powinny wskazać ci właściwy kierunek. Zasadniczo będziesz chciał połączyć ember-precompiler.js (który działa jako "shim" z braku lepszego słowa) z ember.js, a następnie wywołać EmberRails.precompile, aby skompilować szablony.

+0

Wygląda na to, że opublikowany przez Gartta w zasadzie to samo, co ember-precompiler.js, nie przetestowałem go, aby upewnić się, że działa, ale między jego odpowiedzią a moją, powinienem być w stanie znaleźć coś bardziej praktycznego i utrzymywalny. – stevenh512

6

Napisałem wtyczkę brzmiącą o nazwie grunt-ember-handlebars, która robi dokładnie to. To prawie naśladuje scenariusz Gartha z jedną ważną różnicą:

Używa lib/headless-ember.js i lib/ember.js, które są utrzymywane (przynajmniej na razie) przez ember.js do precompile default templates. Jeśli nie chcesz używać pomruków, możesz wyodrębnić odpowiedni kod z pomocnika precompile_handlebars w tasks/ember-handlebars.js.

+0

To zdecydowanie najbardziej eleganckie rozwiązanie. Przedtem nigdy nie użyłem chrząknięcia. Dziękuję za przedstawienie go i dziękuję za napisanie tej fantastycznej wtyczki. –

+0

co Denis powiedział – the0ther

5

Mam published a version of ember-precompiler z podobnym interfejsem do narzędzia wiersza poleceń handlebars. Można go zainstalować z KMP:

npm install -g ember-precompile 

a następnie uruchomić go jako:

ember-precompile template... [-f OUTPUT_FILE] 

Czyni zasadzie, co można opisać (i co zrobić wersje GIST zbyt): drwić z brakujących elementów potrzebnych do uruchom Ember i Handlebars, skompiluj szablony i dodaj je do Ember.TEMPLATES.

0

okno obiekt może być wyśmiewany przez jsdom

var jsdom = require("jsdom").jsdom; 
    global.document = jsdom("<html><head></head><body></body></html>"); 
    global.window = document.createWindow(); 
    global.$ = global.jQuery = window.$ = window.jQuery = require("jquery"); 
    global.Handlebars = window.Handlebars = require('handlebars'); 
    global.Application = window.Application = {}; 
    require('ember.js'); 

i teraz można uruchomić niczego od Ember tym Ember.Handlebars.compile

1

Napisałem oficjalny moduł Prekompilator npm dla każdego, kto może być chce zrobić W./a najnowsza wersja ember.js

https://npmjs.org/package/ember-template-compiler

To proste w instalacji i obsłudze (exa MPle poniżej)

npm zainstalować Ember-template-kompilator

var compiler = require('ember-template-compiler'); 
var template = fs.readFileSync('foo.handlebars').toString(); 
var input = compiler.precompile(template).toString(); 
var output = "Ember.TEMPLATES['foo'] = Ember.Handlebars.template(" + input + ");"; 
Powiązane problemy