使用(新)Famo.us 引擎与 RequireJS 和 EJS 模板

Using (NEW) Famo.us Engine with RequireJS and EJS Templates

在 Famo.us 完全改变他们的架构之前,我正在使用 Famo.us、RequireJS、EJS 模板、Node 和其他一些东西开发一些应用程序。

但是现在当我用新的 Famo.us 'Engine' 替换旧的 Famo.us 架构时,我遇到了错误 - 这告诉我新方法的架构是错误的 -想知道你们是否可以帮助我。

背景

目前的做法是“/”路由器调用一个'ejs'模板。

index.ejs:

  <!DOCTYPE HTML>
    <html>
      <head>
        <title></title>
        <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1.0, maximum-scale=1.0, minimal-ui" />
        <meta name="mobile-web-app-capable" content="yes" />
        <meta name="apple-mobile-web-app-capable" content="yes" />
        <meta name="apple-mobile-web-app-status-bar-style" content="black" />
        <link rel="stylesheet" type="text/css" href="/css/famous.css" />
        <link rel="stylesheet" type="text/css" href="/css/style.css" />
      </head>
      <body>
        <script data-main="/js/webmain.js" src="/js/vendor/requirejs/require.js"></script>
      </body>
    </html>

这适用于旧的 Famo.us 架构...并且会使用 RequireJS 调用 webmain.js 脚本。

webmain.js:

/* globals require */
require.config({
  baseUrl: "js",
  nodeRequire: require,
  paths: {
    "famous": "vendor/famous",
    "famous-flex": "vendor/famous-flex/src",
    json2: "vendor/json2",
    "requirejs": "vendor/requirejs/require",
    "socketcluster": "vendor/socketcluster",
    "ua-parser" : "vendor/ua-parser.min",
    "uuid": "vendor/uuid"
  }
});
require(["platform"]);

'platform.js' 脚本将包含以下内容:

define('platform', function(require, exports, module) {
  'use strict';
  var Engine = require("famous/core/Engine");
  var contentContext = Engine.createContext();
  var Widget = require('app/widgets/DefaultWidget');
  var mainView = new Widget();
  var contextSize = [undefined, undefined];

  contentContext.setPerspective(1);

  Engine.nextTick(function() {
    contextSize = contentContext.getSize();
    mainView.setOptions({size: [contextSize[0], contextSize[1]]});
    contentContext.add(mainView);
  });
  contentContext.on('resize', function(e) {
    contextSize = contentContext.getSize();
    if (mainView) mainView.setOptions({size: [contextSize[0]*1, contextSize[1]*1]});
  }.bind(this));


});

但是 Famo.us 的新版本将无法使用这种方法,我想问问你的想法,为什么,或者是否还有他们没有提到的另一种方法?

我更新了 'vendor/famous' 中的 Famou.us 源代码,以使用 github 中的 'Famo.us Engine' 代码。如果我用新的 Famo.us 代码替换 'platform.js' 脚本中的旧 Famo.us 代码——像这样:

define('platform', function(require, exports, module) {
  'use strict';

var FamousEngine = require('famous/core/FamousEngine');
var DOMElement = require('famous/dom-renderables/DOMElement');

FamousEngine.init();
var scene = FamousEngine.createScene();

var node = scene.addChild();
var domEl = new DOMElement(node, {
    content: 'Hello World',
    properties: {
        fontFamily: 'Arial'
    }
});

});

我收到以下错误:

Uncaught Error: Module name "Clock" has not been loaded yet for context: _. Use require([]) require.js:8
Uncaught Error: Module name "../utilities/CallbackStore" has not been loaded yet for context: _. Use require([]) require.js:8
Uncaught TypeError: Cannot read property 'init' of undefined platform.js:28

我想我想明白,当 RequireJS 框架几乎相同时,为什么它不起作用?为什么 Famo.us 是未定义的,为什么新的 Famo.us 架构可以打破这么多 - 'new' 集成 famo.us 的方式是什么?

我在他们的 'slack' IRC 上问过问题,但这似乎不是获得答案的方式,而且 'help'。

任何帮助将不胜感激,因为我现在真的无法前进。

再次感谢。

Famo.us 版本 0.3.5 及更早版本使用 RequireJS 使用 AMD.

新版本 0.5.0+ 使用 CommonJS 的 node.js 风格,并使用 Browserify 构建您的 javascript 包浏览器应用程序。

以下来自 an Answer in this question 的总结。更多关于他们在答案中的异同。

RequireJS implements the AMD API (source).

CommonJS is a way of defining modules with the help of an exports object, that defines the module contents.