Чаплин не может найти jQuery на Backbone.$ (Ожидается проверка функции instanceof, но получено тело)

У меня есть проект Chaplin/Backbone, который я переключаю с RequireJS на CommonJS (с Browserify).

Когда я пытаюсь загрузить приложение в браузере, я получаю Uncaught TypeError: Expecting a function in instanceof check, but got body. Кажется, это потому, что Backbone.$ не определено.

Я уже делаю следующее, прежде чем требовать свое приложение и/или любые файлы Чаплина:

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

Backbone.$ = jQuery;

Так что это должно загружать jQuery, и если я проверю Backbone.$, он там. Однако Чаплин, похоже, либо сбрасывает Backbone.$ в значение undefined, либо использует другой экземпляр Backbone, хотя, похоже, это не так.


person evilcelery    schedule 20.01.2014    source источник
comment
Зависит ли Чаплин от Backbone? Может случиться так, что у вас есть две библиотеки Backbone в связке — одна из ваших отложений, а другая от отложений Чаплина. Попробуйте выполнить npm dedupe перед запуском browserify, это приведет к дедупликации пакетов в графе зависимостей и в итоге будет одна библиотека Backbone.   -  person andreypopp    schedule 20.01.2014
comment
Да, Чаплин зависит от Backbone. npm dedupe не сработало, однако вы были на правильном пути, использовалась версия Backbone в пакете Chaplin, поэтому удаление вручную помогло.   -  person evilcelery    schedule 22.01.2014
comment
если npm dedupe не работает для вас, то и Чаплин, и вы зависите от разных версий Backbone, иначе npm dedupe удалит одну из Backbone.   -  person andreypopp    schedule 22.01.2014
comment
Мы обнаружили, что вы должны убедиться, что у вас есть Backbone.$ = require('jquery') в каждом отдельном модуле, где вы используете require('chaplin'). Я предполагаю, что вы пропустили хотя бы один, и если этот модуль запустится первым, он выйдет из строя. Я бы жил, чтобы найти способ избежать этого стандартного кода, но я просто не понимаю, как это сделать.   -  person donaddon    schedule 12.11.2015


Ответы (1)


Проблема в том, что Chaplin не использует тот же объект Backbone, что и ваш. Действительно, для Chaplin требуется Backbone 1.0.0, а вы полагаетесь на более мощную версию (предположительно 1.1.2).

Таким образом, когда вы require('backbone'), вам требуется объект Backbone 1.1.2, тогда как, когда Чаплин вызывает require('backbone') в его контексте, возвращается Backbone 1.0.0.

Это два разных объекта, и у более позднего будет Backbone.$ === undefined, какие бы изменения вы ни внесли в первый.

Решение состоит в том, чтобы использовать ту же версию, что и Chaplin: измените ваш package.json, чтобы использовать Backbone 1.0.0, и используйте npm install. При этом Backbone будет установлен только в вашем каталоге node_modules. Затем вам потребуется тот же объект, что и у Чаплина.

Другое решение — заставить Чаплина использовать ту же версию, что и ваша, но это может привести к поломке некоторых компонентов. Просто удалите каталог node_modules/chaplin/node_modules/backbone. Но, опять же, это исправление действительно хакерское, поскольку вы не должны изменять файлы в каталоге node_modules.

person matteodelabre    schedule 22.06.2014