У меня есть проект Chaplin/Backbone, который я перехожу из RequireJS в CommonJS (с Browserify).
Когда я пытаюсь загрузить приложение в браузере, я получаю Uncaught TypeError: Expecting a function in instanceof check, but got body
. Кажется, это связано с тем, что Backbone.$
Undefined.
Я уже делаю следующее, прежде чем требовать свое приложение и/или любые файлы Chaplin:
var jQuery = require('jquery'),
Backbone = require('backbone');
Backbone.$ = jQuery;
Таким образом, это должно быть загрузка jQuery, и если я проверю Backbone. $ Он есть. Однако Чаплин, похоже, либо перезагружает Backbone.$
To undefined, либо использует другой экземпляр Backbone, хотя это, похоже, не так.
Проблема в том, что Чаплин не использует тот же объект Backbone, что и ваш. Действительно, Чаплин требует Backbone 1.0.0, и вы полагаетесь на большую версию (предположительно 1.1.2).
Таким образом, когда вам require('backbone')
, вам require('backbone')
объект с базовым основанием 1.1.2, тогда как, когда вызовы Chaplin require('backbone')
в своем контексте, возвращается Backbone 1.0.0.
Это два разных объекта, а у более позднего - Backbone.$ === undefined
, любые изменения, которые вы делаете для первого.
Решение состоит в том, чтобы использовать ту же версию, что и Chaplin: измените ваш пакет.json на использование Backbone 1.0.0 и используйте npm install
. Это приведет только к установке Backbone в каталог node_modules. Тогда вам понадобится тот же объект, что и Чаплин.
Другое решение - заставить Чаплина использовать ту же версию, что и ваша, но это может сломать некоторые ее компоненты. Просто удалите каталог node_modules/chaplin/node_modules/backbone. Но, опять же, это исправление действительно хакерское, поскольку вы не должны изменять файлы в каталоге node_modules.
npm dedupe
перед запуском browserify, что приведет к дедупликации пакетов в графе зависимостей и приведет к созданию одной библиотеки Backbone.npm dedupe
не работал, но вы были на правильном пути, использовалась версия Backbone в пакете Chaplin, поэтому удаление вручную помогло.