Kev*_*Kev 4 requirejs backbone.js underscore.js browserify
我有一个骨干应用程序正常运行.它意味着在第3页中用作小部件.不幸的是,我刚刚意识到其中一个页面已经加载了Backbone/underscore.
我得到这样的错误:
Uncaught TypeError: Cannot read property 'extend' of undefined
Run Code Online (Sandbox Code Playgroud)
通常在先前未加载下划线时出现.
我的典型视图是这样的:(正常的Backbone视图)
./view1.js
var Backbone = require('backbone')
var _ = require('underscore')
var $ = require('jquery')
Backbone.$ = $
module.exports = Backbone.View.extend({
events: {
},
initialize: function () {
},
render: function () {
}
})
Run Code Online (Sandbox Code Playgroud)
然后我只需要打电话给它:
var View1 = require('view1')
var view1Instance = new View1(...)
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助 :)
调查后编辑:当运行调试器时,看起来Backbone变量是一个空对象而不是Backbone.好像require('backbone')刚回来了{}
编辑2:这似乎与这个问题有关:https://github.com/substack/node-browserify/issues/790
Backbone和Requirejs的问题(如thlorenz所示)
- 骨干寻找
define寻找module.exports前- requirejs使用全局变量,这不是一个好习惯,在这种情况下会导致问题,因为它会影响在同一浏览器选项卡中运行的所有内容
他建议将所有内容包装在一个范围内并隐藏该define功能.他还有一个工具来做到这一点.browserify-垫片
但是我没有使用它,而是使用Browserify的postBundleCB选项:(对于同事来说).
在我的Gruntfile:
browserify: {
dist: {
src: ['src/app/app.js'],
dest: 'www/app.js',
options: {
postBundleCB: function (err, src, next) {
return next(null, '(function () { var define = undefined; '+src+' })();')
}
}
}
},
Run Code Online (Sandbox Code Playgroud)
这解决了我的问题:)
我没有尝试使用browserify-shim,所以我对此并不了解.