这是我的情况,将 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)上只发现了这个似乎与我的问题有关的主题,即使建议的解决方案是根本不工作。