如何在Node.js和AMD(浏览器上的require.js)中使用Backbone模型

9

我目前拥有一个使用require.js的工作中的AMD Backbone Model,代码如下:

// models/game.js
define(['backbone'],
function(Backbone) {

  var Game = Backbone.Model.extend({
    urlRoot  : '/games/'
  , defaults : {
      name : null
    }
  });

  return Game;
});

AMD/Backbone 组织来源于该教程jrburke的Backbone Pull Request

我也想在Node.js中使用Backbone Model,因为在过去的经验中,当没有使用AMD时,共享Backbone模型和集合的效果很好,而且显然我是个受虐狂。

因此,我尝试了以下方法(受Backbone模块的启发):

// models/game.js
(function(root, factory) {
  if (typeof exports !== 'undefined') {
    factory(root, exports, require('backbone'));
  }
  else if (typeof define === 'function' && define.amd) {
    define(['backbone'], function(Backbone, exports) {
      factory(root, exports, Backbone);
    });
  }
}(this, function(root, Game, Backbone) {

  Game = Backbone.Model.extend({
    urlRoot  : '/games/'
  , defaults : {
      name : null
    }
  });

  return Game;
}));

当我在浏览器中引用Game时,它现在变成未定义:

// collections/games.js
define(['backbone', 'models/game'],
function(Backbone, Game) {

  var Games = Backbone.Collection.extend({
    model: Game

  , initialize: function() {
      console.log(Game) 
      // Game is undefined
      var game = new Game({ name: 'game1' });
    }
  });

  return Games;
});

尽管我查看了CommonJS笔记,但我仍然不清楚。 如何在浏览器中将同一Backbone模型文件用作AMD文件和Node.js模块?

而且还有额外的问题:是否有比每个文件顶部的 ~10 行更简洁的方法?最好不要使用定义shim

1个回答

4

你尝试过在node上也按照AMD方式实现吗?

http://requirejs.org/docs/node.html - 如果你想在客户端和后端都使用相同的AMD模块,这可能是最好的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接