编辑 (2012-01-30):我在 bitbucket 上的 repo 中推送了一个更完整的示例。
我已成功使用 RequireJS 加载 Ember.js 以及 datetime 插件 (github)。 Ember 命名空间本身保持全局,但我的所有应用程序数据,包括我的 Ember.Application 实例,都通过 RequireJS 保存在模块中。我还使用“文本!”加载车把模板!插件。
我还没有遇到任何问题,但这不是一个完整的应用程序,更多的是概念证明。这是我如何使它工作的。我可以直接使用 Safari 加载我的应用程序,而无需服务器。你仍然需要一个服务器来使用 Chrome 加载它,它不允许 JavaScript 从文件系统加载文件。
1) 因为 Ember.js 使用 BPM/Spade,所以我无法使用 repo 的克隆。相反,我将编译后的版本包装在一个模块中:
lib/ember.js:
define(['jquery',
'plugins/order!lib/ember-0.9.3.js',
'plugins/order!lib/ember-datetime.js'],
function() {
return Ember;
});
请注意,这本身并不会将 Ember 隐藏在全局范围内。但我正在做一些设置,以便如果将来我能够隐藏它,那么依赖于该模块的所有其他模块仍将按原样工作。
2) 模块可以像这样引用 Ember:
app/core.js:
define(['lib/ember'], function(Em) {
MyApp = Em.Application.create({
VERSION: "0.0.1"
});
return MyApp;
});
在这里,“Em”可以被命名为其他名称;它不直接引用全局变量,而是来自lib/ember.js中定义的模块。
3) 为了让 Ember 可以访问,必须注册把手:
app/templates/my-template.handlebars:
MyApp v{{MyApp.VERSION}}.
app/views/my-view.js:
define(['lib/ember',
'plugins/text!app/templates/my-template.handlebars'],
function(Em, myTemplateSource) {
Em.TEMPLATES["my-template"] = Em.Handlebars.compile(myTemplateSource);
var myView = Em.View.create({
templateName: "my-template";
});
return myView;
});
4) 我正在使用 require-jquery.js(jQuery 和 RequireJS 捆绑在一起)。