使用nodejs预编译Emberjs Handlebar模板的简便方法?

时间:2012-02-07 05:49:20

标签: node.js ember.js handlebars.js

我很喜欢emberjs,并希望在我的几个小型移动应用程序中采取下一步措施,并在构建过程中预编译我的Ember / Handlebars模板。

我宁愿远离搞乱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 repo中获取并用于编译我的模板?

修改 我做了一个很好的修复工具,但是可维护性得到了F。我抓住了所有Handlebars代码减去对window对象的引用。然后我使用Ember.Handlebars.Compiler代码,将Ember.create替换为Object.create,导出我的Ember对象,并且中提琴在节点中工作看起来很棒(因为它在工作和功能中)制作的是模板)。但由于前面提到的维护失误,我不认为这是对我自己的问题的答案,所以仍然可以回答。

编辑2 以上结果证明是完全失败的。也许程序中有问题,但使用Ember.Handlebars.precompileEmber.Handlebars.compile不起作用。模板已经完成,但是当我在代码中使用附加到Ember.TEMPLATES的预编译模板时,它们不起作用。根据emberjs.com网站上的建议,我似乎只能在模板中明确传递模板时才能使用模板。

编辑3 我弄清楚我做错了什么。我的答案如下。

7 个答案:

答案 0 :(得分:7)

我写了一个名为grunt-ember-handlebars的咕噜插件,正是这样做的。它几乎模仿了Garth的剧本,但有一个重要区别:

它使用lib / headless-ember.js和lib / ember.js,它们(至少现在)由ember.js维护到precompile default templates。如果您不想使用grunt,可以从tasks / ember-handlebars.js中的precompile_handlebars助手中提取相关代码。

答案 1 :(得分:5)

为我的问题找到了一个足够好的解决方案,似乎很容易维护,我会认为我的问题已经解决了。

以下是我解决问题的方法:

  • 抓取预编译ember模板所需的最少量代码。
  • 简单预编译程序概述:
    • 使用var Ember = require('./my_ember_precompiler').Ember
    • 加载代码
    • 将模板作为字符串获取,并使用var templateString = Ember.Handlebars.precompile(str).toString()
    • 进行编译
    • 这与app不同,但Ember似乎需要注册预编译模板。加载后,对于每个创建的模板,我们都需要注册我们的模板。基本上在调用Handlebars.template()时包装templateString,并确保将此包装函数添加到Ember.TEMPLATES对象。

当在脚本中自动化时,上述内容是无痛的。

答案 2 :(得分:3)

查看npm包Ember-Runner

答案 3 :(得分:1)

以下要点包含一个nodejs构建脚本,该脚本将预编译给定文件夹中的所有.handlebars文件:

https://gist.github.com/1622236

答案 4 :(得分:1)

我为其他任何可能想要使用最新版本的ember.js的人编写了一个官方的预编译器npm模块

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

安装和使用简单(以下示例)

npm install ember-template-compiler

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

答案 5 :(得分:0)

https://github.com/emberjs/ember-rails

查看官方ember-rails gem的代码

虽然它不是node.js项目,但它确实向您展示了如何使用Rails 3.1+资产管道预编译模板,它包含了您需要在Node中执行所有必需的Javascript代码而无需破解这是你必须自己维护的解决方案。

更具体地说,请查看vendor / assets / javascripts / ember-precompiler.js和lib / ember-rails / hjs_template.rb

我远不是Node的专家(显然,Rails更像是我的东西)..但我认为这两个文件应该指向正确的方向。基本上,你会想要用ember.js连接ember-precompiler.js(它作为缺少更好的词的“垫片”),然后调用EmberRails.precompile来编译模板。

答案 6 :(得分: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运行任何内容,包括Ember.Handlebars.compile