2012-02-07 9 views
10

私はemberjsを楽しんでおり、私の小さなモバイル・アプリケーションのいくつかの次のステップを踏み出し、Ember/Handlebarsテンプレートをビルド・プロセスの一部としてプリコンパイルしたいと考えています。Emberjs Handlebarテンプレートをnodejsでプリコンパイルする簡単な方法は?

私はRubyを使いこなすのが好きで、node.jsを使いたいと思っています。

私はEmber.Handlebars.precompileを使用したいと思っていますが、残念ながら標準的なember.jsファイルをノード環境に読み込めません。ノードREPLからの素朴な試みの例:私は私はすでに、彼らは私の意見で正しく動作するように私のコードでそれらを設定する方法を考え出したと思う

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

、私はちょうどそれらをコンパイルしたいですブラウザDOMの外部の環境。

正規のember.jsをノードにロードする代わりに、emberリポジトリから取り出してテンプレートをコンパイルするために使用できる特定のファイルセットがありますか?

編集 私はうまく動作するが、メンテナンスのためにFを取得するkluge修正を行った。私はHandlebarsコードからwindowオブジェクトへの参照を差し引いたすべてのコードをつかんだ。その後をObject.createに置き換えてEmberオブジェクトをエクスポートし、ノードではビオラのものがうまく動作するようになりました。(動作し、生成される関数はテンプレートなので)Ember.Handlebars.Compilerコードを続けました。しかし、私はこれまでのmaintainafailのために私自身の質問に対する答えとは考えていません。答えはまだ開いています。

EDIT2 上記は完全な失敗であることが分かります。おそらくプロシージャに何か問題がありますが、Ember.Handlebars.precompileまたはEmber.Handlebars.compileを使用すると機能しません。テンプレートは作成されますが、私のコードでEmber.TEMPLATESに添付されたプリコンパイルされたテンプレートを使用すると機能しません。 emberjs.comサイトで提案されているように、変更されたスクリプトタグで明示的に渡されたときにテンプレートが動作するようにしかできないようです。

編集3 私が間違っていたことを理解しました。私の答えは以下の通りです。

答えて

4

を見て、私は私の問題が解決考えるだろうことを維持するのに十分に簡単そうです私の問題に十分良い解決策を見つけました。

  • グラブ私は燃えさしテンプレートをプリコンパイルする必要がある最小限のコード:

    は、ここで私は物事を解決する方法です。

  • シンプルなプリコンパイル手順の概要:
    • var Ember = require('./my_ember_precompiler').Emberでコードをロードします。
    • テンプレートを文字列として取得し、でコンパイルします。
    • これはappとappとは異なりますが、Emberはプリコンパイルされたテンプレートの登録が必要なようです。ロード後、作成されたすべてのテンプレートに対して、テンプレートを登録する必要があります。基本的にHandlebars.template()の呼び出しでtemplateStringをラップし、このラップされた関数がEmber.TEMPLATESオブジェクトに追加されていることを確認してください。それはスクリプトで自動化されていますとき

上記は無痛です。

3

NPMパッケージEmber-Runner

+0

I本当にエンバーランナーが動作するように見え、おそらくそれに向かって引き寄せますかのように。しかし、今のところ、私は自分のリグの構築プロセスを持っており、単純な(a)emberテンプレートを探しています。(b)nodejを使ってemberテンプレートをコンパイルしています。それは本当に簡単なはずですが、私はむしろすべてを手作りではなく、ビルドプロセスを変更したくありません。また、jsdomが好きですが、jqueryをロードしてからEmberをロードし、domを持つふりをして、純粋なJavaScript処理を行うことができるように、私はそれを使用して不満を感じます。ああ。 – jeremyosborne

+0

Ember-Runnerはemberテンプレートをコンパイルします。私はソースに精通していないので、特定のコード行を指摘することができません。私はそれを実装するのが非常に難しいとは思わないことに同意します。 –

0

ルックNode.jsプロジェクトではありませんが、Rails 3.1以上のアセットパイプラインを使用してテンプレートをプリコンパイルする方法を示しています。また、ソリューションをまとめてハッキングしなくてもNodeで必要なすべてのJavascriptコードが含まれていますあなた自身で維持する必要があります。

具体的には、ベンダー/資産/ JavaScriptの/燃えさし-precompiler.jsとlib /燃えさしレール/ hjs_template.rb見

私は(もちろん、Railsは私よりはるかにあるノードの専門家からです物事)..しかし、私はそれらの2つのファイルが正しい方向にあなたを指す必要がありますと思う。基本的には、ember-precompiler.js(より良い単語がないため「シム」として機能する)をember.jsと連結し、EmberRails.precompileを呼び出してテンプレートをコンパイルすることになります。

+0

Garthさんが投稿した要点は、ember-precompiler.jsと基本的に同じですが、動作確認のためにテストしていませんが、彼の答えと私の間で、もう少し実行可能なものを見つけることができるはずですメンテナンス可能です。 – stevenh512

6

ちょうどこれを行うgrunt-ember-handlebarsというgruntプラグインを作成しました。

ember.jsからprecompile default templatesに(少なくとも今のところは)維持されているlib/headless-ember.jsとlib/ember.jsが使用されています。 gruntを使用したくない場合は、tasks/ember-handlebars.js内のprecompile_handlebarsヘルパーから関連コードを抽出できます。

+0

これははるかにエレガントなソリューションです。これの前に私は一口を使ったことがありません。ご紹介いただきありがとうございます。この素晴らしいプラグインを作成していただきありがとうございます。 –

+0

デニスが言ったこと – the0ther

5

私はhandlebarsコマンドラインユーティリティと同様のインターフェイスを持つpublished a version of ember-precompilerです。

npm install -g ember-precompile 

をして、としてそれを実行します:あなたはNPMからそれをインストールすることができます

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

それはあなたが記述するもの、基本的にありません(と要旨のバージョンは何をすべきか、あまりにも):に必要な不足しているコンポーネントをモックEmberとHandlebarsを実行し、テンプレートをコンパイルしてEmber.TEMPLATESに追加します。

0

ウィンドウオブジェクトが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'); 

によって嘲笑することができ、今あなたがEmber.Handlebars.compile

1

含むエンバーから何かを実行することができ、私はこのワットをやりたいと思っされるかもしれない他の誰のための公式のプリコンパイラのNPMモジュールを書きました/ ember.js

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

の最近のバージョンでは、それはインストールして使用するのは簡単です(エクサmple以下)

NPMインストール燃えさしのテンプレートコンパイラ

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 + ");"; 
関連する問題