我多年来一直对此感到困惑,并且有许多不同的shim
设置。他们中的大多数给出了大致相同的问题。在阅读了很多关于此的文档后,我什至无法开始写下我尝试过的所有排列。所以我希望有人会认识到这个问题并知道正确的方法。
问题是加载bootstrap
, jqueryUi
,jsViews
和bridget
同时在使用 优化时有时会失败。r.js
我有这样的设置。
这在未优化时有效:
config.js
requirejs.config({
baseUrl : 'js',
paths: {
"jquery" : "lib/jquery",
"jqueryUi" : "lib/jquery.ui",
"domReady" : "lib/domReady",
"bootstrap" : "lib/bootstrap",
"bootbox" : "lib/bootbox",
"bridget" : "lib/jquery-bridget",
"jsViews" : "lib/jsviews"
},
shim: {
"bridget" : {
deps : ['jquery']
},
"jqueryUi" : {
deps : ['jquery']
},
"jsViews" : {
exports : "$",
deps : ['jqueryUi']
},
"bootstrap" : {
exports : "$",
deps : ['jsViews']
},
"bootbox" : {
deps : ['bootstrap']
}
}
});
require(['app', 'domReady!', 'jsViews', 'jqueryUi', 'bootbox'], function(app) {
app.start();
});
app.js
define(function(require) {
var bootbox = require('bootbox');
var $ = require('bootstrap');
require('bridget');
var Masonry = require('masonry.pkgd.js');
// ...
// .bridget is SOMETIMES undefined
$.bridget('masonry', Masonry);
// ...
// .views (jsViews) is SOMETIMES undefined
$.views.templates.mainView.render(data);
// ...
// .draggable (jquery-ui) is SOMETIMES undefined
$('#selector').draggable(options);
});
现在奇怪的是,在优化后它有时也可以工作。在开发人员控制台打开的情况下按 Ctrl+F5时,它显示这有时会起作用,并且有时会抛出上述代码中以Uncaught TypeError: undefined is not a function
.
我还注意到,当页面加载成功时,全局命名空间中有三个jQuery
对象。当出现其中一个错误时,只有两个jQuery
对象。
而且我认为整个游戏就是这样modules
,shims
所以只有一个。
这似乎是完全随机的。令我困惑的是,优化和未优化的构建之间的行为是不同的。
我认为以下内容与可能的解决方案无关,但这里是其他部分:
启动应用程序的 HTML:
<!DOCTYPE html>
<html>
<head>
<script data-main="js/config" src="js/lib/require.js"></script>
咕噜声r.js
配置:
grunt.initConfig({
requirejs: {
build: {
options: {
baseUrl : "js/",
mainConfigFile : "js/config.js",
dir : 'release/js/',
modules : [{
name: 'js/app'
}],
findNestedDependencies : true,
optimize : "none", // faster for testing
done : function(done, output) {
var duplicates = require('rjs-build-analysis').duplicates(output);
if (duplicates.length > 0) {
grunt.log.subhead('Duplicates found in requirejs build:');
grunt.log.warn(duplicates);
done(new Error('r.js built duplicate modules, please check the excludes option.'));
}
done();
}
}
}
}
编辑:
借助google的魔力,我重新发现了一个我4个月前问过的类似问题,没有任何有用的答案:RequireJS loading jquery-ui failed after optimization
不同之处在于我当前的设置有时会失败,而不是所有时间。