2012-02-07 10 views
10

Mi piacciono molto gli emberjs e vorrei fare il passo successivo in un paio delle mie piccole app mobili e precompilare i miei modelli Ember/Handlebars come parte del mio processo di compilazione.Un modo semplice per precompilare i modelli di Handlebar Emberjs con nodejs?

Preferirei stare lontano da fare scherzi con Ruby e vorrei utilizzare node.js poiché mi sento più a mio agio nell'utilizzarlo.

Credo che quello che voglio usare sia Ember.Handlebars.precompile, ma sfortunatamente non riesco a caricare il file ember.js canonico in un ambiente nodo. Esempio di un tentativo ingenuo dal repl nodo:

> 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 --- 

Credo di aver già capito come configurarli nel mio codice in modo che funzionino correttamente con le mie opinioni, voglio solo compilarli in un ambiente esterno a un browser DOM.

Al posto di caricare il nodo ember.js canonico, esiste un insieme specifico di file che posso prelevare dal repository di ember e utilizzare per compilare i miei modelli?

EDIT ho fatto una correzione Kluge che le grandi opere, ma ottiene una F per la manutenibilità. Ho afferrato tutto il codice Handlebars meno il riferimento all'oggetto window. Poi ho seguito con il codice Ember.Handlebars.Compiler, sostituendo Ember.create con Object.create, esportando il mio oggetto Ember e le cose viola funzionano in modo apparentemente grandioso nel nodo (come funziona e le funzioni prodotte sono modelli). Ma non considero questa una risposta alla mia stessa domanda a causa del suddetto maintainafail, quindi ancora aperta per le risposte.

MODIFICA 2 Quanto sopra risulta essere un totale fallimento. Forse c'è qualcosa di sbagliato nella procedura, ma l'utilizzo di Ember.Handlebars.precompile o Ember.Handlebars.compile non funziona. I template vengono creati, ma quando uso i modelli precompilati collegati a Ember.TEMPLATES nel mio codice, non funzionano. Mi sembra di essere in grado di far funzionare i modelli solo quando sono passati esplicitamente nei tag script modificati, come suggerito sul sito emberjs.com.

EDIT 3 ho capito quello che stavo facendo male. La mia risposta è qui sotto.

risposta

4

trovato una buona soluzione abbastanza per il mio problema che sembra abbastanza facile da mantenere che io considero il mio problema risolto.

Ecco come ho risolto le cose:

  • afferrare la quantità minima di codice ho bisogno di precompilare i modelli Ember.
  • Schema della semplice procedura di precompilare:
    • Load il codice con un var Ember = require('./my_ember_precompiler').Ember.
    • Ottieni i tuoi modelli come stringhe e compilarli con .
    • Questo sarà diverso da app a app, ma Ember sembra richiedere la registrazione di modelli precompilati. Dopo il caricamento, per ogni modello creato, è necessario registrare i nostri modelli. Fondamentalmente avvolgere templateString in una chiamata a Handlebars.template() e assicurarsi che questa funzione di avvolgimento sia aggiunta all'oggetto Ember.TEMPLATES.

Quanto sopra è indolore quando è automatizzata in uno script.

3

Date un'occhiata al pacchetto di NPM Ember-Runner

+0

mi piace molto come brace-runner guarda al lavoro e probabilmente gravitano verso di esso. Tuttavia, per ora, ho il mio processo di compilazione truccato e sto cercando il semplice (a) prendere i modelli ember, (b) compilare i modelli di ember usando il nodojs. Sembra che dovrebbe essere davvero facile, ma preferirei non costruire a mano tutto, né voglio cambiare il mio processo di compilazione. Inoltre, mi piace jsdom, ma mi sento zoppo usarlo solo per caricare jquery, quindi caricare Ember, e quindi fingere di avere un dom, tutto ciò che posso fare puro trattamento JavaScript. Ugh. – jeremyosborne

+0

Ember-Runner compila modelli ember. Non ho familiarità con la sua fonte, quindi non sono in grado di indicarti linee specifiche di codice. Sono d'accordo che non dovrebbe essere terribilmente difficile da attuare. –

0

guardare il codice per la brace-rails gemma ufficiale al https://github.com/emberjs/ember-rails

Anche se non è un progetto node.js, mostra come precompilare i modelli utilizzando la pipeline di risorse di Rails 3.1+ e include tutto il codice Javascript necessario per il quale dovresti farlo in Nodo senza dover unire una soluzione che dovresti mantenere da solo.

Più in particolare, guarda vendor/Attività/javascript/brace-precompiler.js e lib/brace-rails/hjs_template.rb

sono lontano da un esperto di nodo (ovviamente, Rails è più il mio cosa) .. ma penso che quei due file dovrebbero indirizzarti nella giusta direzione. Fondamentalmente, vorrai concatenare ember-precompiler.js (che funge da "shim" per mancanza di una parola migliore) con ember.js e poi chiama EmberRails.precompile per compilare i tuoi template.

+0

Sembra che l'essenza che Garth ha pubblicato abbia fondamentalmente la stessa cosa di ember-precompiler.js, non l'ho testato per assicurarsi che funzioni, ma tra la sua risposta e la mia dovresti riuscire a trovare qualcosa di più funzionale e mantenibile. – stevenh512

6

Ho scritto un plugin per grunt chiamato grunt-ember-handlebars che fa esattamente questo. Simula quasi la sceneggiatura di Garth, con un'importante differenza:

Utilizza lib/headless-ember.js e lib/ember.js, che vengono mantenuti (almeno per ora) da ember.js a precompile default templates. Se non vuoi usare grunt, puoi estrarre il codice pertinente dall'helper precompile_handlebars in tasks/ember-handlebars.js.

+0

Questa è di gran lunga la soluzione più elegante. Prima di questo non ho mai usato il grugnito. Grazie per avermelo presentato e grazie per aver scritto questo fantastico plugin. –

+0

cosa disse Denis – the0ther

5

Ho published a version of ember-precompiler con un'interfaccia simile all'utilità della riga di comando handlebars. È possibile installarlo da NPM:

npm install -g ember-precompile 

e quindi eseguirlo come:

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

Lo fa in sostanza ciò che si descrive (e quali sono le versioni GIST fanno troppo): deridere le componenti mancanti necessari per eseguire Ember e Handlebars, compilare i modelli e aggiungerli a Ember.TEMPLATES.

0

finestra oggetto può essere deriso da 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'); 

e ora è possibile eseguire qualsiasi cosa, da Ember compreso Ember.Handlebars.compile

1

ho scritto un modulo ufficiale precompilatore NPM per chiunque altro che potrebbe essere voler fare questo w/una versione recente di ember.js

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

e 'semplice da installare e utilizzare (exa mple sotto)

NPM installare brace-template-compilatore

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 + ");"; 
Problemi correlati