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

jer*_*rne 11 node.js handlebars.js ember.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 ---
Run Code Online (Sandbox Code Playgroud)

我想我已经找到了如何在我的代码中设置它们以便它们能够正确处理我的视图,我只想在浏览器DOM之外的环境中编译它们.

代替将规范的ember.js加载到节点中,是否有一组特定的文件可以从ember repo中获取并用于编译我的模板?

编辑 我做了一个很好的修复工具,但是可维护性得到了F.我抓住所有Handlebars代码减去window对象的引用.然后,我跟着一起Ember.Handlebars.Compiler代码,替换Ember.createObject.create,我的出口Ember对象,中提琴工作的事情在节点看似巨大(如在它的工作原理和所产生的功能模板).但由于前面提到的维护失误,我不认为这是对我自己的问题的答案,所以仍然可以回答.

编辑2 以上结果证明是完全失败.也许这个程序有问题,但使用Ember.Handlebars.precompileEmber.Handlebars.compile不起作用.模板已经完成,但是当我在代码中使用附加到Ember.TEMPLATES的预编译模板时,它们不起作用.我们似乎只能在修改后的脚本标记中明确传递模板时才能使模板工作,如emberjs.com网站上所示.

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

Muk*_*man 7

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

它使用lib/headless-ember.js和lib/ember.js,由ember.js维护(至少现在)以预编译默认模板.如果您不想使用grunt,可以从tasks/ember-handlebars.js中的precompile_handlebars助手中提取相关代码.


jer*_*rne 5

找到了一个足够好的解决方案,我的问题看起来很容易维持,我会认为我的问题已经解决了.

这就是我解决问题的方法:

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

当它在脚本中自动化时,上面是无痛的.


Gab*_*ant 5

发布了一个版本的ember-precompiler,它具有与handlebars命令行实用程序类似的接口.您可以从NPM安装它:

npm install -g ember-precompile
Run Code Online (Sandbox Code Playgroud)

然后运行它:

ember-precompile template... [-f OUTPUT_FILE]
Run Code Online (Sandbox Code Playgroud)

它基本上完成了你所描述的内容(以及gist版本的功能):模拟运行Ember和Handlebars所需的缺失组件,编译模板并将其添加到Ember.TEMPLATES.