Requirejs,杏仁,骨干,车把

时间:2013-01-09 10:47:28

标签: javascript backbone.js requirejs almond

这是我的情况,使用带有Requirejs的Backbone和Handlebars。

我正在遵循CommonJS模块定义风格,因为我发现自己对它更加满意:

define(function(require) {
  var Backbone = require('Backbone')
  var Item = require('model/item')
  // ...
})

这是我的requirejs配置:

require.config({
  baseUrl: "/javascripts/",
  paths: {
    jquery: 'components/jquery/jquery',
    underscore: 'components/underscore/underscore',
    backbone: 'components/backbone/backbone',
    handlebars: 'components/handlebars/handlebars',
    text: 'components/text/text'
  },
  shim: {
    underscore: {
      exports: "_"
    },
    handlebars : {
        exports: "Handlebars"
    },
    backbone: {
      deps: ['underscore', 'jquery'],
      exports: 'Backbone'
    }
  }
});

优化前一切运行顺畅,不会出现问题。

但是,在使用r.js进行优化之后,依赖关系似乎已经破裂。 我想在制作中使用Almond js,所以这是我的构建文件:

({
    baseUrl: ".",

    paths: {
        jquery: "components/jquery/jquery",
        underscore: "components/underscore/underscore",
        handlebars: "components/handlebars/handlebars",
        backbone: "components/backbone/backbone",
        text: "components/text/text"
    },

    // we use almond minimal amd module loader
    name: "components/almond/almond",

    // the application entry point
    include: ['app/init'],

    // we need to teel almond to require app/init
    insertRequire: ['app/init'],

    out: "main.js",

    cjsTranslate: true,

    wrap: true,

    optimize: "none"
})

现在,当我在浏览器中运行优化的javascript时,我得到的只是错误消息,告诉我jQuery和Handlebars是未定义的(当然,Backbone.$都不是。)

一个简单的解决方法是强制jQuery加载,并将其分配给Backbone,如下所示:

var $ = require('jQuery')
var Backbone = require('Backbone')
Backbone.$ = $

但这对我来说听起来很愚蠢和多余。 我觉得我做错了什么但却弄清楚是什么。

优化后,Handlebars也无法作为依赖项加载。 如果我强制加载(就像我使用jQuery一样),我在构建过程中收到一条错误消息,告诉我模块fs(一个npm包)找不到。

我用谷歌搜索但在Google群组(https://groups.google.com/forum/?fromgroups=#!topic/requirejs/lYwXS-3qjXg)上只发现了这个与我的问题相关的话题,即使提议的解决方案根本不起作用。

1 个答案:

答案 0 :(得分:3)

我认为你也应该在你的构建文件中添加Shim的配置。