【问题标题】:Chaplin cannot find jQuery on Backbone.$ (Expecting a function in instanceof check, but got body)卓别林在 Backbone.$ 上找不到 jQuery(在 instanceof 检查中期待一个函数,但得到了正文)
【发布时间】:2014-02-09 14:24:20
【问题描述】:

我有 Chaplin/Backbone 项目,我正在从 RequireJS 切换到 CommonJS(使用 Browserify)。

当我尝试在浏览器中加载应用程序时,我得到Uncaught TypeError: Expecting a function in instanceof check, but got body。这似乎是因为 Backbone.$ 未定义。

在需要我的应用和/或任何 Chaplin 文件之前,我已经在执行以下操作:

var jQuery = require('jquery'),
    Backbone = require('backbone');

Backbone.$ = jQuery;

所以这应该是加载 jQuery,如果我检查 Backbone.$,它就在那里。然而,卓别林似乎要么将 Backbone.$ 重置为未定义,要么正在使用不同的 Backbone 实例,尽管情况似乎并非如此。

【问题讨论】:

  • 卓别林是否依赖 Backbone?可能存在捆绑中包含两个 Backbone 库的情况——一个来自您的部门,一个来自卓别林的部门。尝试在运行 browserify 之前执行 npm dedupe,这将在依赖图中对包进行重复数据删除,并最终得到一个 Backbone 库。
  • 是的,卓别林依赖于 Backbone。 npm dedupe 没有用,但是你在正确的轨道上,正在使用 Chaplin 包中的 Backbone 版本,所以手动删除就可以了。
  • 如果 npm dedupe 对您不起作用,那么卓别林和您都依赖于不同版本的 Backbone,否则 npm dedupe 将删除其中一个 Backbone。
  • 我们发现,您必须确保在使用 require('chaplin') 的每个模块中都有 Backbone.$ = require('jquery')。我猜你至少错过了一个,如果该模块恰好首先运行,它将失败。我会找到一种方法来避免这种样板代码,但我只是不知道如何。

标签: jquery backbone.js browserify chaplinjs


【解决方案1】:

问题是卓别林没有使用与您相同的 Backbone 对象。事实上,Chaplin 需要 Backbone 1.0.0,而您依赖于更高版本(大概是 1.1.2)。

因此,当您 require('backbone') 时,您需要 1.1.2 Backbone 对象,而当 Chaplin 在其上下文中调用 require('backbone') 时,返回 Backbone 1.0.0。

这是两个不同的对象,无论您对第一个对象进行什么更改,后一个对象都会有 Backbone.$ === undefined

一种解决方案是使用与卓别林相同的版本:将您的 package.json 更改为使用 Backbone 1.0.0,并使用 npm install。这只会在你的 node_modules 目录中安装 Backbone。然后,您将需要与卓别林相同的对象。

另一种解决方案是强制卓别林使用与您相同的版本 - 但这可能会破坏它的某些组件。只需删除 node_modules/chaplin/node_modules/backbone 目录。但是,再一次,这个修复真的很麻烦,因为你不应该更改 node_modules 目录下的文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    相关资源
    最近更新 更多