4

这是我的情况,将 Backbone 和 Handlebars 与 Requirejs 一起使用。

我遵循 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 包)。

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

4

1 回答 1

3

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

于 2013-01-09T13:31:37.587 回答