【问题标题】:How to set up a simple Backbone/Marionette project and their dependencies using require.js如何使用 require.js 建立一个简单的 Backbone/Marionette 项目及其依赖项
【发布时间】:2013-11-04 15:47:39
【问题描述】:

我已经阅读了很多这方面的内容,甚至还专门购买了一本书,专门介绍如何使用 require.js 设置木偶应用程序,并在 github 上关注了 this little how-to,这似乎很简单……但是对于某些人来说因为我似乎无法像开始一个空的 Marionette 项目那样简单地工作!

我的项目结构如下:

  • 根目录
    • 型号
    • 观看次数
    • 库
      • babysitter.js
      • backbone.js
      • jquery.js
      • marionette.js
      • require.js
      • text.js
      • tpl.js
      • 下划线.js
      • wreqr.js
    • 收藏
    • 模板
    • index.html
    • main.js

这是我的 index.html:

<!DOCTYPE html>
<html>
<head>
</head>
<body>
<script data-main="main" src="libs/require.js" type="text/javascript"></script>
</body>
</html>

还有我的 main.js:

require.config({
    paths:{
    jquery:"libs/jquery",
    underscore: "libs/underscore",
    backbone: "libs/backbone",
    text: "libs/text",
    tpl: "libs/tpl",
    marionette: 'libs/marionette',
    'backbone.wreqr' : 'libs/wreqr',
    'backbone.babysitter' : 'libs/babysitter'
    },
    shim:{
    underscore:{
        exports: "_"
    },
    backbone:{
        deps: ['underscore','jquery'],
        exports:'Backbone'
    }
    }
});

require(['marionette'],function(Marionette){


var Application = new Marionette.Application();

Application.on("initialize:after", function(){
    alert("Application has started!");
});

    Application.start();
});

我从他们的site 下载了 Marionette.js 的 AMD / RequireJS 版本

在浏览器中打开 index.html 时,我在控制台中看到一个错误“参考错误:未定义主干”(在 marionette.js 第 20 行)

我做错了什么?

【问题讨论】:

标签: javascript backbone.js requirejs marionette


【解决方案1】:

Marionette 需要骨干,因此请将 marionette 添加到您的 shim 或您的 require 调用中,

shim:{
  marionette : ['backbone'],
  ...
}

或

require(['backbone', 'marionette'],function(Backbone, Marionette){

【讨论】:

  • 在 OP 使用的 AMD 版本中,主干不是已经定义为木偶的依赖了吗?
  • @Jack 确实。看起来他可能使用了错误的木偶缩小源。由于 AMD 版本中没有Backbone。而缩小的常规版本就在第 20 行。
  • 我正在使用marionette AMD 缩小源;但看起来闪光木偶确实解决了这个问题。我应该担心吗?
  • @Bebhead 正如杰克指出的那样,AMD 版本应该自动将其拉入,由于您发布的错误消息,我非常怀疑您是否使用了您认为的来源。
  • @Andrew 我仔细检查了一遍。我正在使用 AMD 版本,据我所知,其中提到了 Wreqr 和 Babysitter。然而尽管如此,我能够让它运行而没有任何错误的唯一方法是: 1. 将 Backbone.wreqr 和 Backbone.babysitter 与其他所有内容放在我的 lib 文件夹中 2. 在我的 require.config 路径中​​引用这些路径.有趣的是,如果我这样做,我似乎不需要填充(或者至少如果我取下它并尝试启动一个木偶应用程序,它不会立即出现错误)
【解决方案2】:

我认为您的 Backbone shim 可能设置不正确。在查看 Marionette 的 AMD 版本时,它依赖于“backbone”,而不是“Backbone”。

(function (root, factory) {
  if (typeof exports === 'object') {

  var underscore = require('underscore');
  var backbone = require('backbone');
  var wreqr = require('backbone.wreqr');
  var babysitter = require('backbone.babysitter');

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,并且在这个问题上花了几个小时。 深挖骨干源代码1.1.2版本后发现的问题:

    (function(root, factory) {
    
      // Set up Backbone appropriately for the environment. Start with AMD.
      if (typeof define === 'function' && define.amd) {
        define(['underscore', 'jquery', 'exports'], function(_, $, exports) {
          // Export global even in AMD case in case this script is loaded with
          // others that may still expect a global Backbone.
          root.Backbone = factory(root, exports, _, $);
        });
    
      // Next for Node.js or CommonJS. jQuery may not be needed as a module.
      } else if (typeof exports !== 'undefined') {
        var _ = require('underscore');
        factory(root, exports, _);
    
      // Finally, as a browser global.
      } else {
        root.Backbone = factory(root, {}, root._, (root.jQuery || root.Zepto || root.ender ||   root.$));
      }
    
    }(this, function(root, Backbone, _, $) {
    

    去掉前两个条件,只留下第三个:

    root.Backbone = factory(root, {}, root._, (root.jQuery || root.Zepto || root.ender ||   root.$));
    

    我能够使用 rjs 优化我的代码

    这是我的 requirejs 配置

    require.config({
      baseUrl: "/static/src/scripts/js",
      paths: {
        jquery: 'vendors/jquery/jquery',
        underscore: 'vendors/underscore/underscore',
        backbone: 'vendors/backbone/backbone',
        marionette: 'vendors/backbone/backbone.marionette'
      },
      shim: {
        jquery: {
          exports: "jQuery"
        },
        underscore: {
          exports: "_"
        },
        backbone: {
          deps: ['underscore', 'jquery'],
          exports: 'Backbone'
        },
        marionette: {
          deps: ['backbone'],
          exports: 'Marionette'
        }
      }
    });
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-19
      • 2017-11-26
      • 1970-01-01
      • 2020-07-24
      • 2011-05-26
      • 2011-01-18
      • 2021-09-30
      • 1970-01-01
      相关资源
      最近更新 更多